iptablesは開いている場合はトラフィックをVPNトンネルに転送します

iptablesは開いている場合はトラフィックをVPNトンネルに転送します

次のガイドを使用して、ラズベリー パイをアクセス ポイントとして設定しました。

Raspberry Pi 3 を Wi-Fi アクセス ポイントとして使用する

すべてのトラフィック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

FORWARD チェーン:

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

Pi は問題なく接続され、別のパブリック 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

には両方のルール セットが必要です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インターフェース経由で到達できる可能性が高いデフォルト ゲートウェイではなくethernet 、インターフェース経由でトラフィックを転送しますvpn

関連情報