iptables が VPN 経由でトラフィックを誘導する

iptables が VPN 経由でトラフィックを誘導する

ネットワーク初心者です。ホストには 2 つのインターフェースがあり、OpenVPN クライアントからも 2 つのインターフェースがありますeth0。IPtun0アドレスは次のとおりです。

eth0    192.168.1.22
tun0    10.1.0.8

質問1

のために発信する宛先アドレスを に変更してトラフィックをブロックすると、tun0VPN の使用が強制されますか?

いいえ、しかし 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.170VPN のゲートウェイ アドレスはどこにありましたか ( を使用して見つかりましたip route)。

  1. 上記の例では、-Nnat テーブル ( -t) の NEW ( ) チェーンを作成します。
  2. VPN チェーンへのジャンプはOUT(ローカル アプリの直後) から行われます。OUT-I内の他のルールを置き換えるには、 insert() を使用します。
  3. 任意のソースから発信されるトラフィックの宛先が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 ディストリビューションの種類を確認してください。私はsudoroot ではなかったので、追加する必要がありました。

質問2(a)、2(b)

送信元アドレスと送信先アドレスを決定するには、関数LOGTRACE関数が非常に便利であることがわかりました。

iptables -t filter -I OUTPUT -m limit --limit 5/m --limit-burst 10 -j LOG  --log-prefix "ABC-LOG-PREFIX "

デフォルトのテーブルは ですが、特に他のテーブルなどfilterを調べたい場合に構文を確認できるように明示的に記述しました。他のルールが適用される前にパケットをログに記録したかったので、このルールを挿入しました。ログ ファイルが飽和状態にならないようにレート制限を追加しました。最後に、ログ ファイルを簡単に検索できるようにプレフィックスを追加しました。たとえば、Linux Mint の場合:manglenat-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

これにより、デフォルト ゲートウェイ、どのインターフェイスがどのアドレス範囲に使用されているかが表示されます。

パケットフロー図

iptables パケットフロー図

答え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.1Linux:traceroute 1.1.1.1

完了です!

関連情報