Arch Linux下OpenVPN黑名单式分流配置问题求助
Arch Linux下OpenVPN黑名单式分流配置问题求助
首先非常理解你现在的困扰,纤维肌痛确实会让人在处理这类技术问题时更费力,咱们一步一步来梳理解决你的问题——让大部分流量走VPN,只让Netflix、Disney+、Prime Video这类流媒体网站走本地网络。
为什么你当前的配置没生效?
你的思路是对的,但有两个核心问题:
- 路由命令可能被服务器配置覆盖:OpenVPN的
pull命令会拉取服务器推送的路由规则,如果你的自定义路由放在pull之前,很可能会被服务器的配置覆盖;另外,你之前放命令的位置其实是合法的,但更稳妥的是放在配置文件最末尾,避免被块标签影响。 - 流媒体域名对应大量IP:像Netflix这类网站有成百上千个IP地址,你添加的单个
route命令只能针对一个IP,根本覆盖不全,所以这些网站还是会走VPN,导致加载异常。
具体解决步骤
第一步:调整自定义命令的位置
把以下内容移动到你的.ovpn文件的最底部(也就是所有<ca>、<tls-auth>等块之后):
allow-pull-fqdn route www.netflix.com 255.255.255.255 net_gateway route www.disneyplus.com 255.255.255.255 net_gateway route www.primevideo.com 255.255.255.255 net_gateway
这样能确保你的自定义路由不会被服务器推送的配置覆盖。
第二步:解决多IP覆盖问题(核心)
因为流媒体网站的IP太多,手动添加根本不现实,我们可以用OpenVPN启动脚本来自动解析域名的所有IP并添加路由:
- 创建一个脚本文件,比如
/etc/openvpn/exclude-streaming.sh,内容如下:
#!/bin/bash # 定义需要排除的流媒体域名 STREAM_DOMAINS=("www.netflix.com" "www.disneyplus.com" "www.primevideo.com") # 获取本地默认网关(就是你不用VPN时的网关) LOCAL_GATEWAY=$(ip route show default | awk '/default/ {print $3}') if [ "$script_type" = "up" ]; then # 连接VPN时,为每个域名的所有IP添加路由 for DOMAIN in "${STREAM_DOMAINS[@]}"; do # 解析域名的所有A记录IP dig +short +answer "$DOMAIN" A | while read -r IP; do route add -host "$IP" gw "$LOCAL_GATEWAY" # 把添加的路由记录下来,方便断开时删除 echo "$IP" >> /tmp/openvpn_excluded_ips.txt done done elif [ "$script_type" = "down" ]; then # 断开VPN时,删除之前添加的路由 if [ -f /tmp/openvpn_excluded_ips.txt ]; then while read -r IP; do route del -host "$IP" gw "$LOCAL_GATEWAY" 2>/dev/null done < /tmp/openvpn_excluded_ips.txt rm /tmp/openvpn_excluded_ips.txt fi fi
- 给脚本添加执行权限:
sudo chmod +x /etc/openvpn/exclude-streaming.sh
- 在你的
.ovpn文件最底部添加以下两行,让OpenVPN连接/断开时自动运行这个脚本:
up /etc/openvpn/exclude-streaming.sh down /etc/openvpn/exclude-streaming.sh
第三步:测试配置
- 启动VPN,然后用
traceroute www.netflix.com查看路由,如果第一跳是你的本地网关(而不是VPN服务器的IP),说明配置生效了。 - 也可以访问流媒体网站,看看是否能正常加载内容,同时用
curl -s https://api.ipify.org确认其他流量仍走VPN的IP。
额外注意事项
- 确保你的系统安装了
dig工具(属于bind-tools包,Arch Linux下可以用sudo pacman -S bind-tools安装),脚本需要它来解析IP。 - 如果还是有问题,可以检查OpenVPN的日志(
journalctl -u openvpn@你的配置文件名),看看有没有报错信息。
备注:内容来源于stack exchange,提问作者fluxrider
相关产品推荐
相关产品推荐

