web-dev-qa-db-ja.com

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

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

wifiアクセスポイントとしてのRaspberry Pi

wlan0eth0に転送し、すべてのトラフィックをNAT処理しています。よく働く!

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トンネル経由で転送allすることを除いて、同じルールを設定したいと思います。私はそれをすべて送信したいのですが、ホストネットワークに漏洩するものはありません。 Thinkinは次のようになります。

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

今はうまくいきます!

8
Shrout1

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

不足しているパズルの部分はルーティングです。トンネルが稼働している場合は、「すべての」発信トラフィックがそれを使用するようにします。それ以外の場合は、通常のルートを使用します。

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

13
roaima

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

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

-Dオプションでルールを削除できます:

iptables -t filter -D FORWARD 1

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

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

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

編集:

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

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

接続追跡により、既知のすべての接続をルーティングできるようになります。

そして、はい、wlanインターフェースを介して到達できる可能性が最も高いデフォルトゲートウェイにethernetトラフィックを転送しないように policy routing を設定する必要がありますが、vpnインターフェース。

2
Serge