元のソースパブリックIPを変更せずにVPNトンネルを介してローカルWebサーバーにポート80,443を転送するテストにVPSを使用しようとしています。ここで主な問題はルーティングです。エッジルーティングデバイスは、実際にはパブリックIPを持つ2つのインターフェイス(実際のWANとVPNインターフェイス)を表示するためです。
明らかに簡単な解決策は、VPNトンネルを介してSNATトラフィックを送信することですが、Webトラフィックが実際にどこから来るのかをより深く理解したいと考えていました。また、VPS を通過するネットワーク トラフィックの復号化を拒否するため、VPS にリバース プロキシを配置しません。
今までのテストは次のとおりです。使用されたIP:Web SRV:192.168.0.2、VPS Wireguardアドレス:192.168.200.1、Router Wireguardアドレス:192.168.200.2。
VPSサーバー、ローカルルーター、およびWebサーバーとして機能する複数のDebian 11システムで仮想テストネットワークを設定しました。
VPSでは、DNATトラフィックはポート80,443のインターフェイスに入ります。
iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport –dports 80,443 -j DNAT –to-destination 192.168.0.2
ipv4転送を有効にするためにsysctl.confを設定しました。 VPSには、192.168.0.2に達する場所を示す固定パスがあります。
ip route add 192.168.0.2/32 via 192.168.200.2 dev wg0
ローカルルータでオンラインでインターフェイスベースの応答ベースのルールを見つけました。
echo 200 vpsrt >> /etc/iproute2/rt_tables
ip rule add from 192.168.200.2 table vpsrt prio 1
ip route add default via 192.168.200.1 dev wg0 table vpsrt
VPN トンネルはルータにあり、Web サーバにデフォルトゲートウェイが設定されているため、ローカルルータと Web サーバ間のリターントラフィックはまったく変わりません。
VPSのwg0.conf(サーバーの役割):
[Interface]
PrivateKey=*
Address=192.168.200.1/30
ListenPort=50000
[Peer]
PublicKey=*
AllowedIPs=192.168.200.2/32,192.168.0.2/32
ルータのwg0.conf(クライアントロール):
[Interface]
Address=192.168.200.2/32
PrivateKey=*
[Peer]
Endpoint=PUBIPVPS:50000
PublicKey=*
AllowedIPs=172.20.200.0/30
Wireguardトンネルが機能していることを確認しました。各デバイスで個別に192.168.200.1と.2をpingでき、wg showはハンドシェイクが完了し、データが双方向に流れていると言います。
一部のPCAPを実行すると、VPSを介したトラフィックが正確になります。 VPSのwg0にあるTcpdumpは、192.168.0.2ポート443のアドレスを持つパケットを表示します。 VPSのWG Showは1.3Kbを送信したと言いますが、ルータのWG Showは500バイト(テストping)だけを受信したと言います。ルータ WAN インターフェイスの Tcpdump は、Wireguard パケットがルータに到着していることを示します。しかし、ルータwg0のTcpdumpは、どのパケットも受信しなかったことを示しています。
問題は、Wireguardが(ルータの)AllowedIPにソースIPが設定されていないパケットを自動的にドロップすることです。しかし、問題はwg0.confルータに0.0.0.0/0を置くことができないことです。なぜなら、このルータはトンネルをネットワーク全体のデフォルトゲートウェイとして使用し始めるからです!
Wireguardをデフォルト以外のゲートウェイとして使用すると、ソースベースのルーティングは不可能ですか?他のトンネリングソフトウェアを使用する潜在的な回避策はありますか?私はWireguardのスピードが大好きですが、SNAT / Masqueradeがなければ速度は非常に制限されます。
修正する: 次の記事を見つけました。 https://techoverflow.net/2021/07/09/what-does-wireguard-allowedips-actually-do/ Wireguard「ファイアウォール」とルーティングがAllowedIPを使用して一緒にバンドルされていることを説明します。
もう少しテストすると、ルーターのAllowedIPを0.0.0.0/0に設定し、wg0.confにポストルールを追加してデフォルトゲートウェイパスを削除し、トンネルIPに静的ルートのみを追加できます。 (残念ながら、wireguardは「ファイアウォール」とルーティングを1つのオプションにまとめることを選択します)
ルータの wg0 インターフェイスの Tcpdump は、パケットがトンネルを通過していることを示しています。ルータ LAN インターフェイスの Tcpdump は、パケットが送信され、Web サーバが応答していることを示します。しかし、問題は、Webサーバーの応答がワイヤガードトンネルに転送されないため、インターフェイスソースベースのルーティングルールが機能しないようです。
ルータのWANインターフェイスにあるTcpdumpは、WebサーバーSyn-ackがゲートウェイからプッシュされることを示しています。今私の問題は、上記のソースベースのルーティングルールにあります。ソースベースのルーティングは私が知っている範囲を超えているので、これを助けてくれてありがとう。
答え1
あなたは90%成功しました。vpsrt
ルータでカスタムルーティングテーブルを設定するとき:
echo 200 vpsrt >> /etc/iproute2/rt_tables
ip rule add from 192.168.200.2 table vpsrt prio 1
ip route add default via 192.168.200.1 dev wg0 table vpsrt
使用する必要がありますWebサーバー代わりにIPアドレスルーターIPアドレス、2行目:
ip rule add from 192.168.0.2 table vpsrt prio 1
これにより、ルータは、Web サーバーからのすべてのトラフィックを WireGuard トンネルに送信するように指示します。ルータの WireGuard 設定に VPS サーバのピアエントリの一部として含める限り、AllowedIPs=0.0.0.0/0
WireGuard トンネルはトラフィックを受け入れて VPS サーバに送り返します。
また、ルーターのWireGuard構成でこのテーブルを指定する場合、上記の3行目は必要ありません。
[Interface]
Address=192.168.200.2/32
PrivateKey=*
Table=vpsrt
[Peer]
Endpoint=PUBIPVPS:50000
PublicKey=*
AllowedIPs=0.0.0.0/0
この設定を有効にすると、グローバルデフォルトパスを妨げることなく、デフォルトパスがカスタムwg-quick
テーブルに追加されます。vpsrt
また、ルーティングを望まない場合みんなWebサーバーからVPSへのトラフィック(TCPポート80および443からの応答のみ)上記の2行目ではなく、次の規則を使用できます。
ip rule add from 192.168.0.2 ipproto tcp sport 80 table vpsrt priority 1
ip rule add from 192.168.0.2 ipproto tcp sport 443 table vpsrt priority 2
答え2
VRF(仮想ルーティングと転送)の使用を検討できます。 VRFは、独自のデフォルトゲートウェイとして別々のルーティングテーブルを設定するために使用されます。 Wireguard インターフェイスと Web サーバーを VRF に接続でき、トラフィックは現在既存の接続から分離されます。
VRFを使用する良い例は次のとおりです。https://interpip.es/linux/creating-a-vrf-and-running-services-inside-it-on-linux/