次の図は、私のネットワークのトポロジーを示しています。 ここで、wlan0を使用して、10.8.0.15から10.8.0.42を経由してすべてのhttpトラフィックを外部にルーティングします。残念ながら、iptablesとルーティングに関しては私は初心者です。誰かが私を正しい方向に向けることができますか?
編集:これまでのところ、10.8.0.15で次のコマンドを実行しました
Sudo ip rule add fwmark 2 table 3
Sudo ip route add default via 10.8.0.42 table 3
Sudo ip route flush cache
Sudo iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2
Sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.8.0.15
Sudo sysctl -w net.ipv4.conf.eth0.rp_filter=2
Sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 10.8.0.42
および以下の10.8.0.42
Sudo iptables -I FORWARD -i eth0 -o wlan0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
Sudo iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Sudo sysctl -w net.ipv4.ip_forward=1
10.8.0.15で接続をテストしたい場合、次のようになります。
curl http://freegeoip.net/json/
curl: (7) Failed to connect to freegeoip.net port 80: Connection refused
10.8.0.42のtcpdumpは
Sudo tcpdump -n -i eth0 -s 0 src or dst port 80
10:05:18.552329 IP 10.8.0.15.36186 > 10.8.0.42.80: Flags [S], seq 460236380, win 29200, options [mss 1308,sackOK,TS val 22927 ecr 0,nop,wscale 6], length 0
10:05:18.552612 IP 10.8.0.42.80 > 10.8.0.15.36186: Flags [R.], seq 0, ack 460236381, win 0, length 0
10:05:19.068397 IP 10.8.0.15.50052 > 10.8.0.42.80: Flags [S], seq 2824330189, win 29200, options [mss 1308,sackOK,TS val 22969 ecr 0,nop,wscale 6], length 0
10:05:19.068674 IP 10.8.0.42.80 > 10.8.0.15.50052: Flags [R.], seq 0, ack 2824330190, win 0, length 0
このセットアップの目的は、ネットワーク内の任意のクライアントをインターネットゲートウェイとして使用することです。この図には10.8.0.42しかありませんが、他のクライアントが使用する可能性のある専用のインターネットアクセスを持つクライアントが複数存在する可能性があります。
更新:以下に示すように、次の構成をテストしました。
box0:
Sudo ip route add default via 10.8.0.42 dev tun0 table 3
Sudo ip rule add fwmark 2 table 3
Sudo ip route flush cache
Sudo iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 2
Sudo sysctl -w net.ipv4.conf.eth0.rp_filter=0
Sudo iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 80 -j SNAT --to-source 10.8.0.15
Sudo iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 443 -j SNAT --to-source 10.8.0.15
ボックス1:
Sudo sysctl -w net.ipv4.ip_forward=1
Sudo iptables -A POSTROUTING -t nat -s 10.8.0.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.0.2
Sudo iptables -A POSTROUTING -t nat -s 10.8.0.0/24 -p tcp --dport 443 -j SNAT --to-source 192.168.0.2
Box1のtcpdump出力は同じままです。
12:24:05.788127 IP 10.8.0.15.45844 > 10.8.0.42.80: Flags [S], seq 4169666416, win 29200, options [mss 1308,sackOK,TS val 15420789 ecr 0,nop,wscale 6], length 0
12:24:05.788414 IP 10.8.0.42.80 > 10.8.0.15.45844: Flags [R.], seq 0, ack 4169666417, win 0, length 0
12:24:06.786406 IP 10.8.0.15.45844 > 10.8.0.42.80: Flags [S], seq 4169666416, win 29200, options [mss 1308,sackOK,TS val 15420889 ecr 0,nop,wscale 6], length 0
12:24:06.786694 IP 10.8.0.42.80 > 10.8.0.15.45844: Flags [R.], seq 0, ack 1, win 0, length 0
12:24:08.789821 IP 10.8.0.15.45844 > 10.8.0.42.80: Flags [S], seq 4169666416, win 29200, options [mss 1308,sackOK,TS val 15421089 ecr 0,nop,wscale 6], length 0
12:24:08.790111 IP 10.8.0.42.80 > 10.8.0.15.45844: Flags [R.], seq 0, ack 1, win 0, length 0
Box0のtcpdump出力:
11:26:14.220391 IP 10.8.0.15.33420 > 158.69.242.138.80: Flags [S], seq 2659446178, win 29200, options [mss 1460,sackOK,TS val 15433635 ecr 0,nop,wscale 6], length 0
11:26:14.308915 IP 10.8.0.42.80 > 10.8.0.15.33420: Flags [R.], seq 0, ack 2659446179, win 0, length 0
11:26:15.211761 IP 10.8.0.15.33420 > 158.69.242.138.80: Flags [S], seq 2659446178, win 29200, options [mss 1460,sackOK,TS val 15433735 ecr 0,nop,wscale 6], length 0
11:26:15.337652 IP 10.8.0.42.80 > 10.8.0.15.33420: Flags [R.], seq 0, ack 1, win 0, length 0
主な問題は、httpリクエストのURL(ここでは158.69.242.138)のIPではなく、box1に到着したときのtcpパケットの宛先が10.8.0.42であるということだと思います。しかし、この宛先がどこで変更されているのかわかりません。
私には、eth0
およびwlan0
インターフェースを備えたホストが、eth0
が接続されているネットワーク内のデバイスから発信されたhttpトラフィックに対してSNATを実行するように見えます。
あなたはこのようにそれを行うことができます:
ホスト10.8.0.15
で、デフォルトゲートウェイとして10.8.0.42
を設定します。
ip route add default via 10.8.0.42 dev eth0
ホスト10.8.0.42
で、SNATを有効にします。
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.0.2
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -p tcp --dport 443 -j SNAT --to-source 192.168.0.2
これにより、ポート80と443、つまりhttpとhttpsに対してNATが有効になります。さらにポートを追加できます。同じパスを介してDNSを解決する場合は、ルールなどを追加する必要があります。
そのインターフェイスを介してすべてのトラフィックをルーティングする場合は、次のコマンドを使用できます。
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 192.168.0.2
編集:更新された質問を反映する情報を追加しました:
あなたの質問からのこれらの行は、クライアントデバイスがhttp/httpsトラフィックを他のゲートウェイにルーティングするようにする必要があります:
Sudo ip rule add fwmark 2 table 3
Sudo ip route add default via 10.8.0.42 table 3
Sudo ip route flush cache
Sudo iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2
編集:クライアントデバイス上のルーティングは、この回答に記載されている手順で処理できます: https://unix.stackexchange.com/questions/21093/output-traffic-on-different-interfaces-based-on- destination-port#21118
基本的には、必要のない最後のDNATルールを除いて、質問と同じです。
ルール Sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 10.8.0.42
は、すべてのhttpトラフィックを10.8.0.42(ルーティング先)ではなく、10.8.0.42(宛先がある)にリダイレクトします。 tcpdumpでわかるように、サーバー10.8.0.42はポート80での接続を受け入れません。
このルールは削除できます。