iptablesはトラフィックをVPNトンネルに転送します(有効になっている場合)

iptablesはトラフィックをVPNトンネルに転送します(有効になっている場合)

次のガイドを使用して、Raspberry Piをアクセスポイントとして設定しました。

WiFiアクセスポイントとしてRaspberry Pi 3

すべてのトラフィックを転送しwlan0てNATしています。eth0良い結果!

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 

tun0-00これで、インターフェイスの使用と転送を除いて同じルールを設定したいと思います。みんな私のトラフィックはVPNトンネルを通過します。私はすべてを送信したいと思うし、何もホストネットワークに漏れたくありません。次のように考えてみてください。

sudo iptables -t nat -A POSTROUTING -o tun0-00 -j MASQUERADE
sudo iptables -A FORWARD -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o tun0-00 -j ACCEPT

残念ながら、これらのiptablesルールは不完全であることを知っています。問題は、eth0トラフィック転送の元のルールがまだ存在することですeth0

トンネルが開いている場合は、すべてのトラフィックをトンネル経由で送信したいと思います。それ以外の場合eth0

修正する:

私のルールを挿入するには、-Iフラグを使用します。

sudo iptables -t nat -I POSTROUTING 1 -o tun0-00 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0-00 -j ACCEPT

フォワードチェーン:

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  wlan0  tun0-00  0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     all  --  tun0-00 wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        0     0 ACCEPT     all  --  eth0   wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        0     0 ACCEPT     all  --  wlan0  eth0    0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     all  --  wlan1  wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
6        0     0 ACCEPT     all  --  wlan0  wlan1   0.0.0.0/0            0.0.0.0/0           

それでも残念ですが、配信が機能していないようです。

クライアントVPNの設定

敏感に見えるコンテンツを削除しました。

dev tun
persist-tun
persist-key
cipher AES-256-CBC
auth SHA1
tls-client
client
resolv-retry infinite
remote XXX.XXX.XXX.XXX PORT_NUM udp
lport XXX
verify-x509-name "VPN_Certificate" name
pkcs12 CERT_NAME.p12
tls-auth CERTIFICATE-tls.key 1
ns-cert-type server
redirect-gateway local def1

パイはよく接続され、さまざまなパブリックIPを反映しています。クライアントはまだ pi をゲートウェイとしてマークしますが、接続できなくなりました。

解決策

redirect-gateway def1まず、piの.ovpnファイルに追加する必要があります。

次に、インターフェイス名を正しく入力する必要があります。狂った人になった気分だったtun0-00のにどうやら序盤に見て、その時が唯一存在していたようだ。インターフェイスは本当にtun0

したがって、適切なiptablesコマンドは次のようになります。

sudo iptables -t nat -I POSTROUTING 1 -o tun0 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0 -j ACCEPT

今はうまくいきます!

答え1

2つのルールセットが必要ですiptables。これらの 2 つのルールセットは、指定されたインターフェイスから発信されるトラフィックが適切に偽装されることを保証します。私の提案は次のとおりです。あなたの提案より少し簡単です。

# Masquerade outgoing traffic
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# Allow return traffic
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Forward everything
iptables -A FORWARD -j ACCEPT

パズルから欠落している部分はパスです。トンネルが稼働している場合、「すべての」発信トラフィックはそれを使用したいと思います。それ以外の場合は、通常のパスを使用してください。

これが処理されるOpenVPN内でredirect-gateway def1クライアント構成のパラメータを使用します。

答え2

便利なツールは、行番号とともに既存のルールをリストすることです。

iptables --line-numbers -t filter -L FORWARD

次のオプションを使用してルールを削除できます-D

iptables -t filter -D FORWARD 1

オプションを使用して、指定した場所に新しいルールを挿入できます-I

iptables -t filter -I FORWARD 0 blah-blah-blah

これにより、テーブルの先頭に新しいルールが挿入されるため、最初のステップで参照されます。

編集する:

FORWARD通常、一致するにはテーブル内のルールが1つだけ必要です-m state --state RELATED,ESTABLISHED

-I FORWARD 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

接続トレースを使用すると、既知のすべての接続をルーティングできるためです。

はい、設定する必要がありますポリシールーティング インターフェイスを介してアクセスする可能性が最も高いがインターフェイスを介してアクセスできないwlanデフォルトゲートウェイにトラフィックを転送します。ethernetvpn

関連情報