ネットワーク初心者です。ホストには 2 つのインターフェースがあり、OpenVPN クライアントからも 2 つのインターフェースがありますeth0
。IPtun0
アドレスは次のとおりです。
eth0 192.168.1.22
tun0 10.1.0.8
質問1
のために発信する宛先アドレスを に変更してトラフィックをブロックすると、tun0
VPN の使用が強制されますか?
いいえ、しかし tun0 にゲートウェイ アドレスを使用すると可能です。 以下でテスト済み:
iptables -t nat -N VPN
iptables -t nat -I OUTPUT -j VPN
iptables -t nat -A VPN -p tcp -j DNAT --to-destination 10.1.0.170
10.1.0.170
VPN のゲートウェイ アドレスはどこにありましたか ( を使用して見つかりましたip route
)。
- 上記の例では、
-N
nat テーブル (-t
) の NEW ( ) チェーンを作成します。 - VPN チェーンへのジャンプは
OUT
(ローカル アプリの直後) から行われます。OUT-I
内の他のルールを置き換えるには、 insert() を使用します。 - 任意のソースから発信されるトラフィックの宛先が
tun0
デバイスのゲートウェイに変更されることを意味します。
質問2(a)
送信トラフィックの場合、宛先アドレスはインターフェースの IP アドレスですかeth0
、それともゲートウェイ アドレスですか?eth0
デフォルトのインターフェース/ゲートウェイであると想定します。
質問2(b)
ローカル アプリから生成されたトラフィックの送信元アドレスは何ですか?
質問3
これは iptables だけで解決できますか、それともルーティング テーブルを変更する必要がありますか? 両方のインターフェイスが同じホスト (つまり、同じ Debian ボックス) 上にあるためです。
追加情報
私は原理を理解して、自分のケースに適用できるようにしようとしています。合計で 3 つの I アドレス サブネットがあり、3 番目は別の仮想インターフェイスに関連付けられた 172.17.42.1/16 の範囲にありますdocker0
。
基本的に私はトラフィックをただVPN経由で172.17.42.8。
答え1
まず第一に、ArchLinux wiki iptables ページからリンクされている優れた図は、さまざまなiptables
チェーンを通るパケット フローを識別するのに役立ちます (回答の下部)。
バックアップ
iptables-save > back.up.file
Linux ディストリビューションの種類を確認してください。私はsudo
root ではなかったので、追加する必要がありました。
質問2(a)、2(b)
送信元アドレスと送信先アドレスを決定するには、関数LOG
とTRACE
関数が非常に便利であることがわかりました。
iptables -t filter -I OUTPUT -m limit --limit 5/m --limit-burst 10 -j LOG --log-prefix "ABC-LOG-PREFIX "
デフォルトのテーブルは ですが、特に他のテーブルなどfilter
を調べたい場合に構文を確認できるように明示的に記述しました。他のルールが適用される前にパケットをログに記録したかったので、このルールを挿入しました。ログ ファイルが飽和状態にならないようにレート制限を追加しました。最後に、ログ ファイルを簡単に検索できるようにプレフィックスを追加しました。たとえば、Linux Mint の場合:mangle
nat
-I
-m limit --limit 5/m --limit-burst 10
--log-prefix
cat /var/log/kern.log | grep "ABC-LOG-PREFIX"
次に、デバッグのために、TRACE
コマンドはプロセス全体を通してパケットを追跡します。
IPTABLES -t raw -A PREROUTING -p tcp -j TRACE
警告、これは追跡します全てtcpパケットの詳細については、管理者ベルリン
質問3
両方のインターフェース (eth0
およびtun0
) は同じホスト上にあるため、以下のパケット フィルター図から、送信トラフィックは同じポイントから開始されることがわかります。パケットがたどるルートは、デフォルト ゲートウェイとそれに関連付けられたインターフェースによって決まります。これは、次のコマンドをiproute2
実行して決定できます。
ip route
これにより、デフォルト ゲートウェイ、どのインターフェイスがどのアドレス範囲に使用されているかが表示されます。
パケットフロー図
答え2
私の理解するところによると、スプリット トンネリングについて話している (または、それを無効にしようとしている) ようです。
OpenVPN の redirect-gateway ディレクティブを見てみましょう。https://openvpn.net/index.php/open-source/documentation/howto.html#リダイレクト
答え3
次の例では、VPNデバイス名はtun0(OpenVPN)で、VPNゲートウェイは172.21.23.172です。
#1 - Linux ルーターに VPN をインストールする (私は ipvanish w. openvpn を使用しています)
#2 - iptablesを使用してトラフィックをルーティングする
sudo iptables -t nat -A POSTROUTING -o [VPN dev] -j MASQUERADE
例:
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
#3 - ルーティング テーブルを構成する (すべてのトラフィックが VPN 経由でルーティングされるようにするため)
sudo ip route add default via [VPN ipv4 address] dev [VPN dev]
例:
sudo ip route add default via 172.21.23.172 dev tun0
#4 - 次のコマンドを実行して、ネットワーク上のデバイスが実際に VPN 経由でルーティングされていることを確認します。
Windows: tracert 1.1.1.1
Linux:traceroute 1.1.1.1
完了です!