目前我使用 VPN(通过位掩码完成)仅访问互联网。但我想设置它以便两个应用程序直接访问互联网。有办法吗?
$ sudo ip6tables --list-rules
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N bitmask
-A OUTPUT -j bitmask
-A bitmask -d fe80::/64 -o wlp3s0 -j ACCEPT
-A bitmask -d ff05::c/128 -o wlp3s0 -p udp -m udp --dport 1900 -j RETURN
-A bitmask -d ff02::fb/128 -o wlp3s0 -p udp -m udp --dport 5353 -j RETURN
-A bitmask -p tcp -j REJECT --reject-with icmp6-port-unreachable
-A bitmask -p udp -j REJECT --reject-with icmp6-port-unreachable
$ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 303190 bytes 23045786 (23.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 303190 bytes 23045786 (23.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.41.0.18 netmask 255.255.248.0 destination 10.41.0.18
inet6 fe80::7b5f:9d91:701e:c55 prefixlen 64 scopeid 0x20<link>
inet6 2001:db8:123::1010 prefixlen 64 scopeid 0x0<global>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 2419226 bytes 2916699759 (2.9 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1562458 bytes 208828031 (208.8 MB)
TX errors 0 dropped 107 overruns 0 carrier 0 collisions 0
wlp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.147 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::b43f:cba:ab11:d9a8 prefixlen 64 scopeid 0x20<link>
ether 24:0a:64:da:d6:eb txqueuelen 1000 (Ethernet)
RX packets 6908650 bytes 3525833381 (3.5 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7751152 bytes 7915813822 (7.9 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ iwconfig
tun0 no wireless extensions.
lo no wireless extensions.
enp4s0 no wireless extensions.
wlp3s0 IEEE 802.11 ESSID:"ZTE_C5959A"
Mode:Managed Frequency:2.462 GHz Access Point: FC:2D:5E:C5:95:9A
Bit Rate=52 Mb/s Tx-Power=15 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:off
Link Quality=47/70 Signal level=-63 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:6 Invalid misc:62 Missed beacon:0
答案1
使用网络命名空间可以实现这一点。
网络命名空间允许单独的 IP、路由表、套接字列表、连接跟踪表防火墙和其他网络相关资源。
至少对于 Layer3 SSH、OpenVPN 和 Wireguard 等 VPN 解决方案而言是这样,因为它们使用虚拟接口来路由 VPN 流量。
在这个简化的例子中,计算机有两个接口 eth0 和 eth1,都具有 DHCP 互联网访问权限。
连接到 VPN。
在终端中:
sudo ip netns add not-vpn
# 创建新的网络命名空间
sudo ip link set eth1 netns not-vpn
# 将 eth1 放入新命名空间
sudo ip netns exec not-vpn bash
# 使用 shell 进入新命名空间
dhclient eth1
# 为移动的接口获取 DHCP IP
curl icanhazip.com
# curl 应用程序将返回你的非 VPN 公共 IP在另一个终端中:
curl icanhazip.com
curl 应用程序将返回您的 VPN 公共 IP,
假设您的 VPN 配置为默认通过它路由所有流量。
答案2
您可以为这两个应用程序添加一条路由,以便它们直接连接到您想要的 IP 地址(使用无线网卡作为接口,路由器作为网关),所有其他流量都通过 VPN(添加一个默认路由,将接口设置为显示的 VPN 接口,ifconfig
并将网关设置为路由器,然后删除前一个
你可以简单地添加新的路线这操作说明
PS:由于新的默认路由,关闭 VPN 后您将无法访问互联网,因此您的 VPN 应始终处于打开状态,或者您必须写入之前删除的默认路由