本帖最后由 myvirus 于 2022-5-14 23:41 编辑
上次发的好多都被吃了,原文为MD格式,懒得改了~~~~
首先是一堆废话 一开始因对外网需求仅是查资料,偶尔下载点东西、看下youtube,使用的是月流量30G的小机场,一年439,够用。。 因为疫情原因比较闲,买了个netflix和disney,买的当天机场就欠费停了,续了30G,第二天又没了。实在受不了,买了台bwg GIA自建v2ray,然后就开始一直折腾 最初使用RouterOS做主路由,openwrt做旁路网关,adg home + openclash订阅小机场使用,很稳,这个一堆大神出过教程,就不啰嗦了 买了bwg GIA后自建v2ray,改了下机场的订阅配置,netflix和disney分流到gia,用了大概3天,间歇性断连,刷新网页又好了,受不了只能继续折腾 改用ss,无法秒开网页,但不会断连了,用了一周左右 然后在vps上搭建adguard home,openwrt上用smartDNS + openclash(这个教程也很多),因为是双线路分流原因,小机场我通常使用的都是hk的节点,bwg GIA在洛杉矶,我用vps的dns,反而更慢了,又还原了回去 有天看到youtube上推荐的ROS做CNIP + static dns fwd + wireguard分流,心一横,在vps上装了wireguard,按教程测了下,效果挺好 然后想到我有些个人站点在腾讯云轻量,那小水管太慢,我自己都基本不用,,干脆把vps刷成ROS系统,然后通过wg接口转发80、443端口到家里来,这样东西都在家,维护方便些。 已经稳定运行1个月左右了,正好同事也想搞,让他看视频他说不太懂原理,我和他详细说了次,就有了下面这份东西 废话结束
在vps中安装RouterOS,如果vps上有数据,建议先备份!!!!
- # 使用root用户登录
- # 更新系统,安装unzip,下载ros chr,解压
- apt update && apt install unzip -y && wget [url]https://download.mikrotik.com/routeros/7.2.3/chr-7.2.3.img.zip[/url] && unzip chr-7.2.3.img.zip
- # 挂载镜像,注:如果vps有DHCP服务,从这句到卸载镜像都可以不用执行
- mount -o loop,offset=33571840 chr-7.2.3.img /mnt
- # 注: 此处的offset可以使用 fdisk -lu chr-7.2.3.img 获取img2 -> Start获取,该镜像为65570,乘以512就是offset了
- # 定义变量,注意需要将eth0修改为vps的外网接口名称
- ADDR0=`ip addr show eth0 | grep global | cut -d' ' -f 6 | head -n 1`
- GATE0=`ip route list | grep default | cut -d' ' -f 3`
- # 在镜像中写入ROS自动运行脚本,该脚本的目的是在没有DHCP服务的环境中设置IP地址,注意修改其中的eth0接口为vps外网接口名称
- mkdir -p /mnt/rw && echo -e '/ip address add address=$ADDR0 interface=[/interface ethernet find where name=eth0]\n/ip route add gateway=$GATE0' > /mnt/rw/autorun.scr
- # 卸载镜像
- umount /mnt
- # 重新挂载所有的文件系统为只读,目的是怕其他进程同时写盘导致数据覆盖后无法启动系统
- echo u > /proc/sysrq-trigger
- # 写出镜像并重启,注意这里的/dev/vda,可以通过 fdisk -lu 查看vps磁盘设备获得
- dd if=chr-7.2.3.img bs=1024 of=/dev/vda && reboot
- # 然后使用ssh连接ROS,用户名admin,密码为空。
- ssh admin@VPS外网IP
复制代码
接下来配置ROS和WireGuard
ROS需要尽快修改密码。我遇到过reboot后去上厕所,一泡尿的功夫密码被改了!!!
- # 设置主机名称,方便查看操作的是哪个ros
- [admin@MikroTik] > /system identity set name=bwg-cn2-gia
- # 设置新密码
- [admin@bwg-cn2-gia] > /user set 0 password="新的密码"
- #禁用掉除ssh外的所有服务,并建议修改ssh默认端口。如果使用winbox的话,同理
- # 查看服务序号
- [admin@bwg-cn2-gia] > /ip service print
- Flags: X, I - INVALID
- Columns: NAME, PORT, CERTIFICATE, VRF
- # NAME PORT CERTIFICATE VRF
- 0 X telnet 23 main
- 1 X ftp 21
- 2 X www 80 main
- 3 X ssh 22 main
- 4 X www-ssl 443 none main
- 5 api 8728 main
- 6 winbox 8291 main
- 7 X api-ssl 8729 none main
- # 禁用除ssh外的所有服务,如果使用winbox,把6换成3即可,注:根据自己打印出来的顺序调整
- [admin@bwg-cn2-gia] > /ip service set 0,1,2,4,5,6,7 disabled=yes
- # 修改ssh端口
- [admin@bwg-cn2-gia] > /ip service set 3 port=65529
- # 退出
- [admin@bwg-cn2-gia] > quit
- # 使用新端口和密码重连
- ssh admin@VPS外网IP -p 65529
复制代码
修改DNS,这里可以使用traceroute看下距离、延迟和丢包情况。然后自己选几个最优的放到Servers里
- # 测试1.1.1.1
- [admin@bwg-cn2-gia] > /tool traceroute address=1.1.1.1
- Columns: ADDRESS, LOSS, SENT, LAST, AVG, BEST, WORST, STD-DEV
- # ADDRESS LOSS SENT LAST AVG BEST WORST STD-DEV
- 1 xxxxxxxxxxxxx 0% 8 13ms 19.3 11.8 45.4 10.2
- 2 100% 8 timeout
- ...
- 6 1.1.1.1 0% 7 1.7ms 1.7 1.7 1.8 0
- # 测试8.8.8.8
- [admin@bwg-cn2-gia] > /tool traceroute address=8.8.8.8
- # 测试其他....
- # 设置dns,开启DNS Settings里的Allow Remote Requests(允许远程请求)
- # 如果有访问大量不同国外站点的需求,可以将Cache Size(DNS缓存)改大点
- [admin@bwg-cn2-gia] > /ip dns set allow-remote-requests=yes cache-size=20480KiB servers=1.1.1.1,8.8.8.8,1.0.0.1,8.8.4.4
复制代码
在VPS和"家里"中添加WireGuard接口,并配置Peers
- -------------以下操作在VPS里执行
- # VPS添加WireGuard接口,接口名称、端口按实际情况修改
- [admin@bwg-cn2-gia] > /interface wireguard add listen-port=65530 mtu=1500 name=wg-home
- # 配置WG IP地址,这里为了方便,使用的24掩码,按需修改
- [admin@bwg-cn2-gia] > /ip address add interface=wg-home address=10.0.1.1/24
- # 查看公钥
- [admin@bwg-cn2-gia] > /interface wireguard print
- Flags: X - disabled; R - running
- 0 R name="wg-home" mtu=1500 listen-port=65530
- private-key="...."
- public-key="...."
- -------------以下操作在"家里"执行
- # 添加WireGuard接口
- [admin@RouterOS] > /interface wireguard add listen-port=65530 mtu=1500 name=wg-cn2-gia
- # 配置WG IP地址,注意这里的地址是10.0.1.2
- [admin@RouterOS] > /ip address add interface=wg-cn2-gia address=10.0.1.2/24
- # 查看公钥
- [admin@RouterOS] > /interface wireguard print
- Flags: X - disabled; R - running
- 0 R name="wg-cn2-gia" mtu=1500 listen-port=65530
- private-key="...."
- public-key="...."
- # 添加Peers
- [admin@RouterOS] > /interface wireguard peers add \
- allowed-address=0.0.0.0/0 endpoint-address=VPS外网IP \
- endpoint-port=65530 interface=wg-cn2-gia \
- persistent-keepalive=15s public-key="VPS print命令中的public-key"
- -------------以下操作在VPS执行
- [admin@bwg-cn2-gia] > /interface wireguard peers add \
- allowed-address=0.0.0.0/0 interface=wg-home \
- persistent-keepalive=15s public-key="家里print命令中的public-key"
- # 测试是否能到达"家里"
- [admin@bwg-cn2-gia] > ping 10.0.1.2
- SEQ HOST SIZE TTL TIME STATUS
- 0 10.0.1.2 56 64 177ms119us
- 1 10.0.1.2 56 64 176ms755us
- ...
- # 如果不通,请查看防火墙里是否配置了禁ping
复制代码
如果"家中"有公网IP,或配置过DDNS,可以在VPS添加peers时,增加endpoint-address和endpoint-port,支持输入域名
以上步骤完成后,正常情况下,应该就可以通过"家里"访问到vps了
配置VPS防火墙
- # 添加防火墙过滤规则,注意修改ether1为你VPS的外网接口名称
- [admin@bwg-cn2-gia] > /ip firewall filter
- # 丢弃icmp数据包,比如ping...
- [admin@bwg-cn2-gia] > add action=drop chain=input disabled=yes in-interface=ether1 protocol=icmp
- [admin@bwg-cn2-gia] > add action=accept chain=input connection-state=established,related,untracked in-interface=ether1
- # 允许WireGuard端口,此处是udp协议,端口按自己的配置修改
- [admin@bwg-cn2-gia] > add action=accept chain=input dst-port=65530 in-interface=ether1 protocol=udp
- # 80、443是用来做转发的,如果不需要将个人站点代理到家中,可以不添加这两条
- [admin@bwg-cn2-gia] > add action=accept chain=input dst-port=80 in-interface=ether1 protocol=tcp
- [admin@bwg-cn2-gia] > add action=accept chain=input dst-port=443 in-interface=ether1 protocol=tcp
- # DNS端口
- [admin@bwg-cn2-gia] > add action=accept chain=input dst-port=53 in-interface=ether1 protocol=udp
- # 其他入站数据都丢弃
- [admin@bwg-cn2-gia] > add action=drop chain=input in-interface=ether1
- # 配置NAT
- [admin@bwg-cn2-gia] > /ip firewall nat
- # 配置IP伪装
- [admin@bwg-cn2-gia] > add action=masquerade chain=srcnat
- # 转发80、443到家里
- [admin@bwg-cn2-gia] > add action=dst-nat chain=dstnat dst-port=80 in-interface=ether1 protocol=tcp to-addresses=10.0.1.2 to-ports=80
- [admin@bwg-cn2-gia] > add action=dst-nat chain=dstnat dst-port=443 in-interface=ether1 protocol=tcp to-addresses=10.0.1.2 to-ports=443
- # 配置下change-mss,也就是OP中的MSS钳制
- [admin@bwg-cn2-gia] > /ip firewall mangle
- [admin@bwg-cn2-gia] > add action=change-mss chain=forward new-mss=clamp-to-pmtu passthrough=yes protocol=tcp tcp-flags=syn
- [admin@bwg-cn2-gia] > add action=change-mss chain=output new-mss=clamp-to-pmtu passthrough=no protocol=tcp tcp-flags=syn
复制代码
至此,VPS配置完成了,接下来的操作将在"家中"完成
导入CNIP、Static DNS FWD
- # 测试能否通过wg接口进行dns
- [admin@MikroTik] > put [resolve goog.com server=10.0.1.1]
- 44.238.227.49
- # 如果没有输出IP,请检查配置
- # 这里我们使用ruijzhan维护的https://github.com/ruijzhan/chnroute项目
- # 我修改为jsdelivr代理地址了,我这下载稍快些,
- # 添加CNIP导入脚本
- [admin@MikroTik] > /system script add dont-require-permissions=no name=cn owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/tool fetch url=https://gcore.jsdelivr.net/gh/ruijzhan/chnroute@master/CN.rsc\r\
- \nimport file-name=CN.rsc\r\
- \nfile remove CN.rsc\r\
- \n\r\
- \n/tool fetch url=https://gcore.jsdelivr.net/gh/ruijzhan/chnroute@master/LAN.rsc\r\
- \nimport file-name=LAN.rsc\r\
- \nfile remove LAN.rsc"
- # 添加GFW URL to Static DNS脚本,注意,需要修改这里10.0.1.1为你VPS wireguard的地址,或修改为VPS外网IP
- [admin@MikroTik] > add dont-require-permissions=no name=gfwlist owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=\
- "{\r\
- \n :global dnsserver 10.0.1.1;\
- \n /tool fetch url=https://gcore.jsdelivr.net/gh/ruijzhan/chnroute@master/gfwlist.rsc\r\
- \n /import file-name=gfwlist.rsc\r\
- \n /file remove gfwlist.rsc\r\
- \n}"
- # 执行CNIP导入脚本,CN列表即在该列表中的IP不进行分流,直接走"家里"的ICP线路
- [admin@MikroTik] > execute "cn"
- # 稍等一会,检查导入,导入应该有8600条左右
- [admin@MikroTik] > /ip firewall address-list export
- Columns: LIST, ADDRESS, CREATION-TIME
- # LIST ADDRESS CREATION-TIME
- 0 CN 5.182.60.0/22 may/10/2022 14:30:14
- 1 CN 45.3.32.0/19 may/10/2022 14:30:14
- ...
- # 添加局域网网段、wg网段、vps网段到CN列表,根据自己的情况进行修改!!!!必须加!!!
- # 这是我的局域网网段
- [admin@MikroTik] > /ip firewall address-list add list=CN address=10.0.0.0/24
- # WireGuard网段
- [admin@MikroTik] > /ip firewall address-list add list=CN address=10.0.1.0/24
- # VPS外网IP
- [admin@MikroTik] > /ip firewall address-list add list=CN address=VPS外网IP
- # 执行GFW URLs导入脚本,在该列表中的URL会通过WireGuard接口到VPS进行解析
- [admin@MikroTik] > execute "gfwlist"
- # 在稍等一会,检查导入,导入完成应该有6000条左右
- [admin@MikroTik] > /ip dns static export
- Columns: REGEXP, TYPE, TTL
- # REGEXP TYPE TTL
- 0 .*000webhost\.com$ FWD 1d
- 1 .*030buy\.com$ FWD 1d
- 2 .*0rz\.tw$ FWD 1d
- ...
- # 测试static fwd规则是否生效
- [admin@MikroTik] > /put [resolve youtube.com]
- 142.251.40.46
- # 指定通过wg接口走vps进行dns请求,结果相同说明fwd规则生效了
- [admin@MikroTik] > /put [resolve youtube.com server=10.0.1.1]
- 142.251.40.46
复制代码
分流
- # 添加路由表
- [admin@MikroTik] > /routing table add fib name=vps
- # 添加要分流的内网IP,这里我使用1-245范围,过滤掉了部分不需要的地址,你也可以直接填10.0.0.0/24这种整个段,或单个ip的
- [admin@MikroTik] > /ip firewall address-list add list=bypass address=10.0.0.1-10.0.0.245
- # 添加路由,指定vps路由表走wireguard接口
- [admin@MikroTik] > /ip route add gateway=wg-cn2-gia routing-table=vps dst-address=0.0.0.0/0
- # 修改原地址列表在bypass中的,且目的地不是CNIP列表中的数据包走vps路由
- [admin@MikroTik] > /ip firewall mangle add action=mark-routing chain=prerouting dst-address-list=!CN \
- new-routing-mark=vps passthrough=no src-address-list=bypass
复制代码
结束~~
分流关键点
1. ROS新增的DNS FWD,可以让符合正则规则的域名通过指定地址发送DNS请求
2. mark-routing
其他方式
1. 视频网站分流
1. 在dns static列表中将netflix、disney等视频网站的域名修改为另一个wg地址
2. 新建个address-list表,比如video,把netflix、disney等视频网站的IP导入
3. 参考第7步分流的配置,dst-address-list处改为dst-address-list=video
2. 走旁路OP的ss、ssr、v2ray同理。把wireguard的部分换成旁路OP就行,旁路OP设为全局代理,省的在去过滤gfw、cnip
3. 故障切换,使用Netwatch监控WireGuard地址是否能通,如果不能,修改dns、route为另一个地址
4. 特定ip、域名走其他ICP线路
|