Iptables/ufw を使用して Wireguard VPN 経由でさまざまなポートのトラフィックを転送する方法

Iptables/ufw を使用して Wireguard VPN 経由でさまざまなポートのトラフィックを転送する方法

Ubuntu 22.04 を実行しているマシンが 2 台あります。これらをサーバーとプロキシと呼びます。プロキシは静的パブリック IP を持つ VPS で、サーバーは NAT の背後で実行されています。プロキシのいくつかのポートのすべてのトラフィックをサーバーにルーティングしたいと考えています。

2 つの間に Wireguard VPN を設定し、両方が相互に ping を実行できます。プロキシからサーバーの VPN アドレスを curl すると、正しい HTML 応答が得られます。また、プロキシに nginx を設定すると (http/https 以外の他のサービスをルーティングしたいため、これは最終的な解決策ではありません)、VPN IP に proxy_pass して、もう一度正しい HTML 応答を得ることができます。

しかし、iptables/ufw を使用して転送を設定できませんでした。これは、インターフェイスのアップ時に iptables ルーティング ルールを含む Wireguard 構成です。

プロキシ:

[Interface]
# Proxy with static ip
Address = 10.250.0.1/32
ListenPort = 23456
PrivateKey = {private key}
# packet forwarding
PreUp = sysctl -w net.ipv4.ip_forward=1
# port forwarding
PreUp = iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.250.0.2
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.250.0.2
PreUp = iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.250.0.2
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.250.0.2
      
[Peer]
# main_server behind nat
PublicKey = {pub key}
AllowedIPs = 10.250.0.2/32

サーバ:

[Interface]
Address = 10.250.0.2/32
ListenPort = 23456
PrivateKey = {priv key}

[Peer]
PublicKey = {pub key}
Endpoint = {proxy server ip}:23456
AllowedIPs = 10.250.0.0/16
PersistentKeepalive = 25

実行するとsudo iptables-save -c 次の結果が返されます

# Completed on Wed Aug 24 17:01:57 2022
# Generated by iptables-save v1.8.7 on Wed Aug 24 17:01:57 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
[0:0] -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.250.0.2
[4:208] -A PREROUTING -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.250.0.2
COMMIT

[4:208]ウェブブラウザ経由でプロキシにアクセスしようとするたびにパケット数とバイト数が増加する

答え1

私は、Wireguard を介して NAT の背後にあるサービスに同様のポート転送を機能させるのに苦労しています。私の設定はあなたの設定と似ていますが、機能させるには 2 つの変更を試みる必要があります。

まず、DNAT ルールに加えて、SNAT ルールが必要であることがわかりました。次のようなものを試してみてください。

iptables -t nat -A POSTROUTING -d 10.250.0.2 -o wg0 -p tcp --dport 80 -j SNAT --to-source 10.250.0.1

次に、ここでは PreUp/PostDown ではなく PostUp/PreDown を使用する必要があると思います。iptables の実行時にインターフェイスがまだ起動していない場合はルーティング ルールが適用されないようです。そのため、PostUp はまずインターフェイスが確実に起動するようにします。

これらをまとめ、マルチポートを使用して少し簡素化すると、プロキシで次の設定を試すことができます。

[Interface]
# Proxy with static ip
Address = 10.250.0.1/32
ListenPort = 23456
PrivateKey = {private key}
# packet forwarding
PreUp = sysctl -w net.ipv4.ip_forward=1
# port forwarding
PostUp = iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to- destination 10.250.0.2
PreDown = iptables -t nat -D PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to- destination 10.250.0.2
PostUp = iptables -t nat -A POSTROUTING -d 10.250.0.2 -o wg0 -p tcp -m multiport --dports 80,443 -j SNAT --to-source 10.250.0.1
PreDown = iptables -t nat -D POSTROUTING -d 10.250.0.2 -o wg0 -p tcp -m multiport --dports 80,443 -j SNAT --to-source 10.250.0.1
  
[Peer]
# main_server behind nat
PublicKey = {pub key}
AllowedIPs = 10.250.0.2/32

誤字脱字がなかったことを祈ります。慎重に確認することをお勧めします。

関連情報