没有到主机的路由,但有到特定端口的接口的路由

没有到主机的路由,但有到特定端口的接口的路由

我有一台服务器 A,配置了与另一台服务器 B 的 VPN。目前,服务器 A 可以使用 VPN 地址 ping 服务器10.12.0.1B。

我想通过服务器 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

相关内容