我有一台服务器 A,配置了与另一台服务器 B 的 VPN。目前,服务器 A 可以使用 VPN 地址 ping 服务器10.12.0.1
B。
我想通过服务器 B 路由所有 HTTPS 流量,并让其他流量使用默认接口。
为此,我的灵感来自这个 unix stackexchange 答案并运行以下命令:
# define route
echo "200 myroute" >> /etc/iproute2/rt_tables
# seems necessary
sysctl -w net.ipv4.conf.wg1.rp_filter=2
# actual routing
ip route add table 200 10.12.0.0/24 dev wg1 src 10.12.0.10
ip route add table 200 default via 10.12.0.1
# actual rule telling HTTPS traffic to use table 200
ip rule add iif lo ipproto tcp dport 443 lookup 200
然后,我运行curl https://1.1.1.1
(或任何其他主机)并收到错误Failed to connect to 1.1.1.1 port 443: No route to host
。当我删除规则时,一切都会恢复正常。
我猜我的表 200 的路由不正确,但它似乎与原始答案中的路由和默认接口的路由相匹配。
您知道我如何调查和调试该问题吗?
谢谢
附加信息:
$ ip route show table 200
default via 10.12.0.1 dev wg1
10.12.0.0/24 dev wg1 scope link src 10.12.0.10
$ ip route show dev wg1
10.12.0.0/24 proto kernel scope link src 10.12.0.10
$ ip route get 1.1.1.1 ipproto tcp dport 443
1.1.1.1 via 10.12.0.1 dev wg1 table 200 src 10.12.0.10 uid 1001
cache
$ ip route
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.51 metric 202
10.12.0.0/24 dev wg1 proto kernel scope link src 10.12.0.10
192.168.1.0/24 dev eth0 proto dhcp scope link src 192.168.1.51 metric 202
VPN 是 Wireguard VPN。当配置为通过 VPN 路由所有流量时,一切正常。
答案1
“没有到主机的路由”错误可能是由于尝试连接到1.1.1.1
未包含在 WireGuardAllowedIPs
设置中的主机 ( ) 造成的。假设您使用的是 wg-quick,请执行以下操作:
作为步骤1,在服务器 A 的 WireGuard 配置中,调整服务器 B 部分AllowedIPs
中的设置[Peer]
以包含您要连接的 IP 地址(或 IP 地址块)。
假设1.1.1.1
您希望能够从服务器 A 连接到该块中的任何 HTTPS 服务器(特别是您正在测试的192.0.2.0/24
服务器)。192.0.2.123
还假设您最初AllowedIPs
在服务器 A 上为服务器 B 设置了包含该10.12.0.0/24
块的设置。将此设置更改为以下内容:
AllowedIPs = 10.12.0.0/24, 192.0.2.0/24
删除您之前在服务器 A 上为表 200 设置的路由和规则,重新启动 WireGuard(例如sudo wg-quick down wg1; sudo wg-quick up wg1
),并通过运行以下命令来测试此更改:
$ curl -k https://192.0.2.123
这至少应该让您摆脱“没有到主机的路由”错误。如果您仍然遇到错误,您可能需要调整服务器 B 上的防火墙/路由规则,以允许它将数据包从服务器 A 转发到192.0.2.0/24
。
作为第2步,在[Interface]
服务器A的WireGuard配置部分,添加以下设置:
Table = 200
这将指示 wg-quick 将其自动为您创建的路由添加到自定义200
路由表中,而不是添加到主表中。再次重新启动 WireGuard,并检查您的路由表:
$ ip route
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.51 metric 202
192.168.1.0/24 dev eth0 proto dhcp scope link src 192.168.1.51 metric 202
$ ip route show table 200
10.12.0.0/24 dev wg1 scope link
192.0.2.0/24 dev wg1 scope link
现在添加您的特殊 HTTPS 策略规则:
$ sudo ip rule add iif lo ipproto tcp dport 443 lookup 200
并测试一下:
$ curl -k https://192.0.2.123
作为步骤3,假设您仍然希望能够通过 WireGuard 直接从服务器 A 连接到服务器 B 以获取除 HTTPS 之外的服务(例如 SSH 等),请在服务器 A 上为与块的所有连接添加另一个策略规则10.12.0.0/24
:
$ sudo ip rule add to 10.12.0.0/24 table 200 priority 201
现在您应该能够使用 WireGuard 再次从服务器 A 连接到服务器 B:
$ ssh 10.12.0.1