UDM-PRO 策略路由设置随笔记录
UDM-Pro是目前unifi系列中的高端玩意,这货关注了很久了,但是高昂的价格和其高大上的外表挡住了的欲望了,一直心里种草,直到最近没忍住,直接购置了一台。
另一个没有购置的原因是,之前使用的USG,并且通过JSON配置加上shell脚本实现gfwlist分流,名单内域名走旁路OpenWrt,其他直接走USG。用的也挺稳的,UDM-PRO刚出来后系统集大成与一身,好多坑,对于我来说没时间(lan&buhui)折腾。
最近看群友的推荐,说github上面有资源(https://github.com/boostchicken/udm-utilities)可以整dokcer和vpn,于是就简单看了下,确认可以整后果断下单了。
目前,我的网络构建和之前的基本一致,还是利用gfwlist实现分流,只不过目前的方案是在github大神的基础上做了相应的配置和发挥,由于没法使用json配置,所有的均利用shell脚本实现。现就将搭建的过程记录如下:
1. 安装自启动程序,实现开机后自动运行脚本
自启动程序主要用于开机重启后程序的自动运行,实现分流程序正常启动。
1)利用SSH进入udm系统:ssh root@192.168.1.1,其中192.168.1.1是udm-pro的ip地址;
2)进入unifios界面:unifi-os shell;
3)安装自启动程序包并退出:
curl -L https://udm-boot.boostchicken.dev -o udm-boot_1.0.5_all.deb
dpkg -i udm-boot_1.0.5_all.deb
exit
至此,自启动程序安装完毕,在UDM系统中,将任何一个shell可执行脚本文件拷贝进/mnt/data/on_boot.d中就可以实现开机自运行(shell脚本文件应以#!/bin/sh开头)。
(来源:https://github.com/boostchicken/udm-utilities/tree/master/on-boot-script)
2. 安装split-vpn主程序
分流使用的主程序。
1)利用SSH进入udm系统(步骤同1.1),如果已经在系统中忽略此步;
2)下载安装脚本并执行,执行后程序将被安装到/mnt/data/split-vpn文件夹中,同时也创建一个配置脚本文件的目录/etc/split-vpn,代码如下:
curl -LSsf https://raw.githubusercontent.com/peacey/split-vpn/main/vpn/install-split-vpn.sh | sh
至此安装完split-vpn主程序。
(来源:https://github.com/peacey/split-vpn)
3. 配置分流,实现跳转至局域网内的VPN客户端
根据规则跳转(nexthop)到局域网内的VPN客户端(旁路OpenWrt路由)。
1)创建一个split-vpn配置文件夹,并拷贝/etc/split-vpn/vpn/vpn.conf.sample到此文件夹以便后续修改,代码如下:
mkdir -p /etc/split-vpn/nexthop/mycomputer
cd /etc/split-vpn/nexthop/mycomputer
cp /etc/split-vpn/vpn/vpn.conf.sample vpn.conf
2)根据自己的环境配置/etc/split-vpn/nexthop/mycomputer/vpn.conf文件:
要分流到局域网内的VPN客户端(旁路OpenWrt路由),需要将GATEWAY_TABLE设置为"disabled",不然将无法工作。
将VPN_PROVIDER设置为"nexthop"。
将VPN_ENDPOINT_IPV4和VPN_ENDPOINT_IPV6设置为局域网内VPN客户端所在机器的IP,我的旁路OpenWrt路由IP地址为192.168.1.254,我将VPN_ENDPOINT_IPV4设置为"192.168.1.254",如果有IP6也可以设置IP6地址,没有则无需设置。
将DEV设置为桥联到你局域网内VPN客户端(旁路OpenWrt路由)的接口名称,一般情况下,"br0" 为主LAN口的名称 ,"br6"为VLAN 6 名称(VLAN X 名称为brX);也可以通过ifconfig命令来查看和核实接口名称。
3)在当前目录(/etc/split-vpn/nexthop/mycomputer)运行split-vpn up命令:
/etc/split-vpn/vpn/updown.sh br0 up mycomputer
其中br0为接口名称,mycomputer为局域网内VPN客户端(旁路OpenWrt路由)昵称(可自定义)
如果要恢复到运行前的环境,可以执行如下命令:
cd /etc/split-vpn/nexthop/mycomputer
/etc/split-vpn/vpn/updown.sh br0 down mycomputer
4)确定分流是否正常,Linux可以通过traceroute 域名来追踪,Windows系统可以通过tracert 域名来追踪;
5)如果工作正常,可以在当前文件夹(/etc/split-vpn/nexthop/mycomputer)创建一个名为run-vpn.sh的脚本,便于后续运行,脚本代码:
#!/bin/sh
# Load configuration and bring routes up
cd /etc/split-vpn/nexthop/mycomputer
. ./vpn.conf
/etc/split-vpn/vpn/updown.sh ${DEV} up mycomputer
至此分流配置基本完成。
(来源:https://github.com/peacey/split-vpn)
4. 安装自启动脚本
实现开机自启动
1)创建一个主执行文件/etc/split-vpn/run-vpn.sh,并加入如下代码:
#!/bin/sh
/etc/split-vpn/nexthop/mycomputer/run-vpn.sh
2)设置主执行文件权限:
chmod +x /etc/split-vpn/run-vpn.sh
3)安装自启动服务:
curl -o /mnt/data/on_boot.d/99-run-vpn.sh https://raw.githubusercontent.com/peacey/split-vpn/main/examples/boot/run-vpn.sh
chmod +x /mnt/data/on_boot.d/99-run-vpn.sh
至此,开机启动脚本设置完毕。
(来源:https://github.com/peacey/split-vpn)
5. 安装并配置域名分流程序(dnsmasq)
此部分利用dnsmasq的ipset的功能实现分流。
1)下载 ipset脚本到/etc/split-vpn/ipsets文件夹中:
cd /etc/split-vpn
curl -Lo split-vpn.zip https://github.com/peacey/split-vpn/archive/main.zip
unzip -qo split-vpn.zip
cp -rf split-vpn-main/ipsets ./ && rm -rf split-vpn-main split-vpn.zip
chmod +x ipsets/*.sh
2)拷贝ipset配置文件:
cd ipsets
cp VPN_domains.conf.sample VPN_domains.conf
3)配置VPN_domains.conf(位于/etc/split-vpn/ipsets/VPN_domains.conf),其中:FORCED_DOMAINS中的域名为分流至局域网内的VPN客户端(旁路OpenWrt路由),EXEMPT_DOMAINS中的域名直接通过UDM;
4)运行/etc/split-vpn/ipsets/add-dnsmasq-ipset.sh,确认没有出现错误;
5)再次修改/etc/split-vpn/nexthop/mycomputer/vpn.conf文件,调整如下内容:
FORCED_IPSETS="VPN_FORCED:dst"
EXEMPT_IPSETS="VPN_EXEMPT:dst"
此外,还需要DNS_IPV4_IP/DNS_IPV6_IP设置为"DHCP",如果dns不使用内置的dnsmasq的话,需要将其设置为提供dns服务的服务器ip;同时设置DNS_IPV4_INTERFACE/DNS_IPV6_INTERFACE桥联的接口名称,使用dnsmasq的话就直接使用br0,设置VLAN X的,使用brx(可参照3.2);
6)重启split-vpn即可生效;
7)如需要加入开机自运行,需要修改启动脚本(/mnt/data/on_boot.d/99-run-vpn.sh),并加入如下代码:
# Add dnsmasq
/mnt/data/split-vpn/ipsets/add-dnsmasq-ipset.sh
(来源:https://github.com/peacey/split-vpn)
6. gfwlist分流配置
这部分也是我的需求所在,利用分流实现“文明上网”。
之前我们看到在将利用"VPN_"前缀对域名进行标记"VPN_FORCED"和 "VPN_EXEMPT"(/etc/split-vpn/ipsets/VPN_domains.conf中有描述),并且在运行后会在 /run/dnsmasq.conf.d/ipsets.conf文件中出现如下的配置:
ipset=/xxx.xxx/VPN_EXEMPT4,VPN_EXEMPT6
ipset=/xxx.xxx/VPN_FORCED4,VPN_FORCED6
于是就有了下面的利用gfwlist生成配置的方法。
1)配置文件生成
利用脚本将gfwlist加密文件解析成对于的域名,并在域名前加入ipset=/,在域名后加入/VPN_FORCED4,VPN_FORCED6(意为强制分流旁路)。脚本文件:点击下载
注意的是此脚本无法在UDM中使用,因为里面设计base64解码等依赖,而UDM没有,我目前的解决方案是放在我的VPS主机上解析或者群晖上运行。
脚本中唯一需要修改的位置为:OUT_FILE='/volume1/web/dnsmasq_gfwlist_ipset.conf',将/volume1/web/替换为你需要生成dnsmasq_gfwlist_ipset.conf文件的文件夹绝对路径。
放入VPS主机配置
——将下载下来的gfwlist2dnsmasq.sh放入/root/文件夹中(可以随意放入一个文件夹,记好绝对路径);
——修改OUT_FILE文件位置,由于我的VPS配置了nginx,可以使用nginx来将生成的dnsmasq_gfwlist_ipset.conf发布到网上供下载,所以我设成OUT_FILE='/usr/share/nginx/html/dnsmasq_gfwlist_ipset.conf;
——加入定时运行,打开/etc/crontab文件,最后追加:
0 5 * * * root /root/gfwlist2dnsmasq.sh
表示每天5点钟运行一次shell脚本文件,实现更新dnsmasq_gfwlist_ipset.conf文件。
群晖配置
——将下载下来的gfwlist2dnsmasq.sh放入/Data/文件夹中(可以随意放入一个文件夹,记好绝对路径,目前我的是/volume3/Data);
——修改OUT_FILE文件位置,可以使用自带的web服务来将生成的dnsmasq_gfwlist_ipset.conf发布到内网供下载,所以我设成OUT_FILE='/volume1/web/dnsmasq_gfwlist_ipset.conf';
——进入控制面板-任务计划-新增-计划的任务-用户自定义的脚本
设置任务名称(随意),用户账户选root,
在计划中设置运行时间,我自己设置为每天5点00
任务设置中的用户自定义的脚本填入:/volume3/Data/gfwlist2dnsmasq.sh
(来源:https://github.com/cokebar,并根据需求做了修改,由于本人shell脚本语言菜到家,所以修改的不好,但能用)
2)UDM设置
需要将生成的dnsmasq_gfwlist_ipset.conf文件下载到/run/dnsmasq.conf.d文件夹中,过后再重新启动dnsmasq。
你可以在/etc/split-vpn/ipsets/文件夹中新建一个名为add_dnsmasq_gfwlist_ipset.sh的文件,并加入如下代码:
#!/bin/sh
cd /run/dnsmasq.conf.d
curl -L https://xxxx.xxxx/dnsmasq_gfwlist_ipset.conf -o dnsmasq_gfwlist_ipset.conf
# curl -L http://xxx.xxx.xxx.xxx/dnsmasq_gfwlist_ipset.conf -o dnsmasq_gfwlist_ipset.conf
echo "30 5 * * * /etc/split-vpn/ipsets/add_dnsmasq_gfwlist_ipset.sh" > /etc/cron.d/update_gfwlist
/etc/init.d/crond reload /etc/cron.d/update_gfwlist
killall -HUP dnsmasq
其中:2-4行为网络下载dnsmasq_gfwlist_ipset.conf文件到/run/dnsmasq.conf.d/dnsmasq_gfwlist_ipset.conf(自行修改);5-6为增加定时运行,时间为每天5点30,即5点生成dnsmasq_gfwlist_ipset.conf文件,5点30下载到UDM中,7行为重新加载并运行dnsmasq。
写在最后
最后还需要增加自启动相关设置,需要查看/mnt/data/on_boot.d/99-run-vpn.sh文件:
#!/bin/sh
rm -f /etc/split-vpn
ln -sf /mnt/data/split-vpn /etc/split-vpn
/etc/split-vpn/run-vpn.sh
# Download gfwlist
/mnt/data/split-vpn/ipsets/add_dnsmasq_gfwlist_ipset.sh
# Add dnsmasq
/mnt/data/split-vpn/ipsets/add-dnsmasq-ipset.sh
sleep 300s
rm -f /etc/split-vpn
ln -sf /mnt/data/split-vpn /etc/split-vpn
/etc/split-vpn/run-vpn.sh
# Download gfwlist
/mnt/data/split-vpn/ipsets/add_dnsmasq_gfwlist_ipset.sh
# Add dnsmasq
/mnt/data/split-vpn/ipsets/add-dnsmasq-ipset.sh
为什么要运行两遍呢?主要是发现运行一次后没有分流成功,为了保险起见,在延迟5分钟后再运行一次。
过后就开心的撒花吧~~~~

值友9616811516
你好,我非常想尝试你这个方案,但是网上找了很久没有找到相关教程,特地向你请教,
校验提示文案
动力蛋
校验提示文案
值友6035965463
校验提示文案
值友6035965463
校验提示文案
值友9616811516
你好,我非常想尝试你这个方案,但是网上找了很久没有找到相关教程,特地向你请教,
校验提示文案
动力蛋
校验提示文案