
我有一台伺服器 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.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