逻辑很简单。找到 chat.openai.com IP地址,设置路由策略跳过VPN接口。默认情况下,WireGuard 或 OpenVPN 将通过 VPN 接口路由所有流量,但我会设置低于 WireGuard 或 OpenVPN 接口的指标,并直接通过我的路由器而不是 VPN 路由 chat.openai.com 流量。我的设置如下:
- Debian 或 Ubuntu Linux 桌面
- 位于 Linode 或 AWS 的 WireGuard 或 OpenVPN
- 默认路由器IPv4:192.168.2.254
第 1 步 – 查找默认路由信息
连接到 WireGuard/OpenVPN 后,使用 ip 命令列出路由表:
这是我看到的:$ ip route show
default via 192.168.2.254 dev enp0s31f6 proto dhcp metric 100 10.83.200.0/24 dev lxdbr0 proto kernel scope link src 10.83.200.1 169.254.0.0/16 dev ln-sg scope link metric 1000 172.16.0.0/24 dev ln-sg proto kernel scope link src 172.16.0.6 metric 50 192.168.2.0/24 dev enp0s31f6 proto kernel scope link src 192.168.2.25 metric 100
我名为“ln-sg”的 WireGuard 接口使用指标 50 优先于默认指标 100。所以诀窍是添加指标较低的 chat.openai.com IP 地址,直接通过 192.168.2.254 默认网关 IP 地址传递。
IPv4 路由的自动指标功能说明
路由器指标是用于做出路由决策的配置值。路由器指标可帮助路由器在到达目的地的多个可行路由中选择最佳路由。路由将朝着指标最低的网关方向前进。路由器指标通常基于路径长度、带宽、负载、跳数、路径成本、延迟、最大传输单元 (MTU)、可靠性和通信成本等信息。
链接/目标/路由 | 度量 |
---|---|
chat.openai.com(或您选择的任何其他 IP/域) | 10 |
WireGuard/OpenVPN的 | 50 |
违约 | 100 |
第 2 步 – 找出 chat.openai.com IP 地址
使用 dig 命令或 host 命令:
$ d='chat.openai.com' $ dig +short A "$d" | grep -v '\.$' $ ips="$(dig +short A "$d" | grep -v '\.$')" $ echo "$ips"
步骤 3 – 将 chat.openai.com IP 地址添加到路由表
让我们设置一些 shell 变量:
让我们使用 bash for 循环来添加这些 IP:$ my_gw="192.168.2.254" #Default GW
$ metric="10" #Routing metric value
for i in $ips do sudo ip route add "$i" via "$my_gw" metric "$metric" done
想要列出新添加的 IP 地址?使用 ip 命令:
这是我看到的:
$ ip route show $ ip route show | grep -w 'metric 10'
104.18.2.161 via 192.168.2.254 dev enp0s31f6 metric 10 104.18.3.161 via 192.168.2.254 dev enp0s31f6 metric 10
第 4 步 – 测试
启动 Web 浏览器并通过访问 https://chat.openai.com/ URL 进行测试:
瞧。这就是您可以从 Linux 上的 WireGuard 或 OpenVPN 跳过 ChatGPT 域的方法。
第 5 步 – 从路由表中删除 chat.openai.com IP 地址
再次使用 ip 命令,如下所示:
$ for i in $ips; do sudo ip route del "$i"; done
步骤 6 – 创建用于自动化的 shell 脚本
chat.openai.com 将不时更改其 IP 地址。因此,这是一个通用脚本,用于添加、删除和列出 chat.openai.com 域和其他一些在连接到 VPN 时拒绝工作的域。
routing.policy shell 脚本
#!/bin/bash
# routing.policy - Main script to add, remove and list routing policy
# Author : Vivek Gite {www.cyberciti.biz} under GPLv 2.x+
# ----------------------------------------------------------------------
set -e
# Set metric and gateway as per your needs
metric="10"
my_gw="192.168.2.254"
domain="chat.openai.com facebook.com fbcdn.net static.xx.fbcdn.net www.facebook.com"
ips=""
me="${0##*/}" # who am I?
get_domain_ip_lists(){
for d in $domain
do
ips="${ips} $(dig +short A "$d" | grep -v '\.$')"
done
ips="${ips/$'\n'/ }" # remove '\n'
ips="$(tr ' ' '\n'<<<"${ips}" | sort -u | xargs)" # remove duplicate ips
}
is_route_exists(){
local i="$1"
out="$(ip route show "$i")"
if [[ "$out" != "" ]]
then
return 0 # True
else
return 1 # False
fi
}
add_opneapi_route(){
check_for_root_user
echo "Adding ${ips/$'\n'/,} to routing table ..." 1>&2
for i in $ips
do
if ! is_route_exists "$i"
then
sudo ip route add "$i" via "$my_gw" metric "$metric"
else
echo "$me route for $i already exists, skiping ..."
fi
done
}
remove_opneapi_route(){
check_for_root_user
echo "Removing ${ips/$'\n'/,} from routing table ..." 1>&2
for i in $ips
do
if is_route_exists "$i"
then
sudo ip route del "$i" via "$my_gw"
else
echo "$me route for $i not found, skiping ..."
fi
done
}
show_openapi_route_status(){
echo "Routing info for the '$domain' (${ips/$'\n'/,}) ..." # remove newline from the ${ips}
for i in $ips
do
ip route show "$i"
done
}
check_for_root_user(){
if [[ $EUID -ne 0 ]]; then
echo "$me script must be run as root" 1>&2
exit 1
fi
}
## main ##
get_domain_ip_lists # set '$ips'
case "$me" in
routing.policy.add) add_opneapi_route;;
routing.policy.delete) remove_opneapi_route;;
routing.policy.remove) remove_opneapi_route;;
routing.policy.show) show_openapi_route_status;;
routing.policy.status) show_openapi_route_status;;
*) echo "Usage: routing.policy.add|routing.policy.delete|routing.policy.status";;
esac
使用 ln 命令创建软链接
首先,使用 chmod 命令
设置执行权限 现在设置这些链接:
使用 ls 命令进行验证:
输出:$ chmod +x -v routing.policy
mode of 'routing.policy' changed from 0664 (rw-rw-r--) to 0775 (rwxrwxr-x)$ ln -sv routing.policy routing.policy.add
$ ln -sv routing.policy routing.policy.remove
$ ln -sv routing.policy routing.policy.delete
$ ln -sv routing.policy routing.policy.show
$ ln -sv routing.policy routing.policy.status$ ls -l routing.policy*
-rwxrwxr-x 1 vivek vivek 1913 Feb 3 00:07 routing.policy lrwxrwxrwx 1 vivek vivek 14 Feb 3 00:08 routing.policy.add -> routing.policy lrwxrwxrwx 1 vivek vivek 14 Feb 3 00:08 routing.policy.delete -> routing.policy lrwxrwxrwx 1 vivek vivek 14 Feb 3 00:08 routing.policy.remove -> routing.policy lrwxrwxrwx 1 vivek vivek 14 Feb 3 00:08 routing.policy.show -> routing.policy lrwxrwxrwx 1 vivek vivek 14 Feb 3 00:08 routing.policy.status -> routing.policy
测试一下:
$ sudo ./routing.policy.add
$ sudo ./routing.policy.status
$ traceroute chat.openai.com #<--test routing
$ sudo ./routing.policy.delete
总结
我在我的 Debian 和 Ubuntu Linux 桌面上使用 WireGuard 和 OpenVPN 进行了测试。它就像一个魅力,只要 ip 命令有效,它就可以与任何其他 Linux 发行版一起使用。简而言之,只要您可以将路由规则添加到系统的路由表中,我们就可以跳过通过 Linux(或任何其他操作系统,例如 macOS 或 BSD)上的 VPN 连接路由特定的 IP 地址。当 NetworkManager 连接到 OpenVPN 或 WireGuard 接口时,您可以通过添加钩子来自动运行此脚本。例如,将脚本放在 /etc/network/if-up.d/ 中并使其可执行。这将在 VPN 接口联机时运行脚本。同样,当您想在 VPN 接口关闭时运行脚本时,将脚本放在 /etc/network/if-down.d/ 中。请参阅使用 man 命令的 NetworkManager 手册页:
$ man 8 NetworkManager