在 Linux 上从 WireGuard 或 OpenVPN 跳过 ChatGPT 的过程

逻辑很简单。找到 chat.openai.com IP地址,设置路由策略跳过VPN接口。默认情况下, 将通过 VPN 接口路由所有流量,但我会设置低于 WireGuard 或 OpenVPN 接口的指标,并直接通过我的路由器而不是 VPN 路由 chat.openai.com 流量。我的设置如下:

  • Debian 或 Ubuntu Linux 桌面
  • 位于 Linode 或 AWS 的 WireGuard 或 OpenVPN
  • 默认路由器IPv4:192.168.2.254
注意:在 Linux WireGuard VPN 客户端上输入这些命令,而不是在 WireGuard Linux 服务器上输入这些命令。换句话说,这仅适用于 Linux 桌面操作系统,不适用于 macOS 或 Windows 10/11 桌面。

第 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)、可靠性和通信成本等信息。

表 1:下表概述了
我的 Linux 桌面用于为路由分配指标的条件
链接/目标/路由度量
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 的过程-1

点击放大

瞧。这就是您可以从 Linux 上的 WireGuard 或 OpenVPN 跳过 域的方法。

 

第 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

评分

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注