沒有到主機的路由,但有到特定連接埠的介面的路由

沒有到主機的路由,但有到特定連接埠的介面的路由

我有一台伺服器 A,設定了與另一台伺服器 B 的 VPN 10.12.0.1

我想透過伺服器 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.1WireGuardAllowedIPs設定中未包含的主機 ( ) 造成的。假設您使用的是 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

相關內容