ホストへのパスはありませんが、特定のポートへのインターフェイスへのパスはあります。

ホストへのパスはありませんが、特定のポートへのインターフェイスへのパスはあります。

サーバーAは、他のサーバーBのVPNとして構成されています。現在のサーバーAは、VPNアドレスを使用してサーバー10.12.0.1Bをpingできます。

すべてのHTTPSトラフィックをサーバーBを介してルーティングし、他のトラフィックにデフォルトのインターフェイスを使用させたいと思います。

そのために、私はインスピレーションを受けました。このUnixスタック交換の答えそして、次のコマンドを実行してください。

# 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.1WireGuard設定に含まれていないホスト()に接続しようとすると、「ホストへのパスなし」エラーが発生する可能性がありますAllowedIPs。 wg-quickを使用しているとし、次のようにします。

〜のようにステップ1、サーバーAのWireGuard設定で、接続するIPアドレス(またはIPアドレスブロック)を含めるようにサーバーBセクションのAllowedIPs設定を調整します。[Peer]

サーバーAがブロック内のすべてのHTTPSサーバー(特にテスト中のサーバー)1.1.1.1に接続できるとします。また、このブロックを含むサーバーBのサーバーAで初期設定を構成したとします。この設定を次に変更します。192.0.2.0/24192.0.2.123AllowedIPs10.12.0.0/24

AllowedIPs = 10.12.0.0/24, 192.0.2.0/24

テーブル200に対してサーバーAで以前に設定したパスとルールを削除し、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、HTTPS以外のサービス(SSHなど)に対してWireGuardを介してサーバーAからサーバーBに直接接続できると仮定すると、ブロックへのすべての接続に対してサーバー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

関連情報