LAN経由で外部トラフィックを転送する

LAN経由で外部トラフィックを転送する

Wireguard VPN を介してネットワーク トラフィックを別のホストで実行されている VM に転送しようとしています。透過プロキシを実現するために、元のソース IP アドレスは保持されます。両方のサーバーは異なるデータセンターでホストされています。これが私のネットワーク設定です。

ネットワーク図

ネットワークは「プロキシ」マシンであり、DNAT を使用してネットワークを転送します。

iptables -t nat -A PREROUTING  -i eth0 -p tcp -m multiport --dport $ports -j DNAT --to 192.168.122.100
ip route add 192.168.122.100 dev wg1

192.168.122.100 を直接照会することで、プロキシ マシン上の SSH セッションから VM IP アドレスにアクセスできます。yyyy IP アドレスを照会して外部ネットワークからこれらの転送ポートにアクセスしようとすると、ホスト マシン、NAT テーブル/PREROUTING ステップでトラフィックが停止します。

配信に失敗したパケットの TRACE (zzzz は私の自宅の IP アドレスです)。トレースは「ホスト」マシンからのものです:

raw:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
mangle:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
mangle:PREROUTING-CUSTOM-BACK:rule:1 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
mangle:PREROUTING-CUSTOM-BACK:return:3 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
mangle:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
nat:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
nat:PREROUTING-CUSTOM-FRONT:return:3 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
nat:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 

nat:PREROUTING:policy:2ここでデフォルトのACCEPTポリシーを実行します。

192.168.122.100 に直接アクセスしようとしたときの動作パケット トレース (ホスト マシン上):

raw:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT 
mangle:PREROUTING-CUSTOM-BACK:rule:1 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING-CUSTOM-BACK:return:3 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:PREROUTING-CUSTOM-FRONT:return:3 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:FORWARD:policy:1 IN=wg1 OUT=virbr0 MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
filter:FORWARD:rule:1 IN=wg1 OUT=virbr0 MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
filter:FORWARD-CUSTOM-FRONT:rule:1 IN=wg1 OUT=virbr0 MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:POSTROUTING:policy:2 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:POSTROUTING:rule:1 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:POSTROUTING-CUSTOM-FRONT:return:1 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:POSTROUTING:policy:7 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT

ご覧のとおり、nat:PREROUTING:policy:2まだ実行されており、その後パケットは VM にルーティングされます。唯一の違いは、送信元 IP アドレスです。


私の質問はこれです: Linux ネットワーク スタックは、LAN ネットワーク デバイスから送信されたが、送信元アドレスが LAN 以外のパケットをドロップしますか? これを回避して、パケットをさらにルーティングする方法はありますか?

答え1

結局、Linux ネットワーク スタックはこれらのパケットをドロップしましたが、その目的は非常に正しかったのです。ネットワーク スタックは、「リバース パス フィルタリング」と呼ばれる処理を行います。ネットワーク デバイスから入ってくるパケットは、同じデバイスを経由してルーティングされないソース IP を持つためドロップされます。通常、このようなパケットは有効ではないか、悪意がある可能性があります。ただし、何をしているか分かっていれば、この動作を無効にすることができます。

echo 0 >/proc/sys/net/ipv4/conf/all/rp_filter   # blanket-disable for all interfaces
echo 1 >/proc/sys/net/ipv4/conf/eth0/rp_filter  # enable for external network device just to be safe

これで、パケットがさらに転送され、透過的なプロキシを実現できるようになります。

関連情報