iptables: マルチWANとポート転送とポートリダイレクト

iptables: マルチWANとポート転送とポートリダイレクト

私は Gentoo Linux を実行しているので、ファイアウォールとネットワークの管理には単純な iptbales を使用しています。通常、すべてのトラフィックに wan0 を使用しますが、その背後に既に Web サーバーがあるため、2 番目の Web サーバーには wan1 (別のドメインにバインド) を使用します。

インターフェースは 3 つあります。

  • eth0 = LAN
  • wan0 = プライマリに使用される WAN (デフォルト ゲートウェイ)
  • wan1 = セカンダリ WAN

ゲートウェイに関する情報

> route -n 

Kernel IP Routentabelle
Ziel Router          Genmask         Flags Metric Ref    Use Iface
0.0.0.0         80.108.x.x      0.0.0.0         UG    0      0        0 wan0
192.168.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
80.108.x.0      0.0.0.0         255.255.254.0   U     0      0        0 wan0
84.114.y.0      0.0.0.0         255.255.255.0   U     0      0        0 wan1
127.0.0.0       127.0.0.1       255.0.0.0       UG    0      0        0 lo

NAT/MASQUEARDINGのデフォルトの初期化は

sysctl -q -w net.ipv4.conf.all.forwarding=1

iptables -N BLOCK
iptables -A BLOCK -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i eth0 -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i lo -j ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan1 -j MASQUERADE

このゲートウェイの背後では、いくつかの Web サーバーを実行しています。 1 台のマシンでは、ポート 80 ではなく 8000 で HTTP サーバーを実行しています。 通常、着信インターフェイスとして wan0 を使用する場合は、次のルールを使用します。

lan_host1="192.168.0.200"
iptables -A FORWARD -i wan0 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan0 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80

それはうまくいきます。wan0 は私が通常他の用途に使用する IP/ドメインに関連付けられているので、今度は wan1 を使用したいと思います。

wan1 に単純な変更を加えるだけで済むと思いました。

lan_host1="192.168.0.200"
iptables -A FORWARD -i wan1 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan1 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80

しかし、それは機能しません。問題は、wan0 がデフォルトの GW であることだと思います。したがって、wan1 で受信されたパッケージは lan_host1 に転送されますが、ゲートウェイに送り返されるときは、wan1 ではなく wan0 を介して送信されるか、少なくとも wan0 の IP を使用します。

これを管理する方法について何か提案はありますか?

よろしくお願いします、ロブ

答え1

回答は構成に関係するため、いくつかの仮定を立てています。実際の構成に合わせて回答を調整する必要があります。

  • わん1のLANとゲートウェイわん184.114.7.0/24 および 84.114.7.254 として任意に選択されます。

  • ファイアウォール ルールは考慮されていませんが、これらすべてがファイアウォール ルールと相互作用するべきではありません。

Linuxの場合ip linkip addressそしてip route常に、非推奨の の代わりに を使用する必要があります。ifconfigおそらく、追加のルーティング テーブルを処理できません。routeroute

念のためお知らせしますが、iptablesあるいは実際にはネットフィルターはルーティングは行いませんが、IPルーティングスタックによって行われたルーティング決定を変更することができます。概略図ルーティングの決定が行われる場所を示します。ルーティングされたトラフィック (ローカルで生成されたトラフィックではなく) は 1 か所のみに存在し、変更は次の前に行われる必要があります。生/プレルーティングマングル/PREROUTINGまたはnat/プレルーティング、 と多くの場合非現実的であり、ナット限られたケースのみ、ほとんどはマングル

基本的なマルチホームシステム、インターネットへの複数のパスを使用するには、通常、ポリシールーティング、ルートは通常通り宛先によって変わるだけでなく、ソースやポリシールールで使用される他のセレクタ(ここで行われるように)によっても変わる可能性があります。Linuxでは、ip rule別のルーティングテーブルを選択して、たとえば別のデフォルトルートを選択できます(デフォルトルートは1つだけですが、ルーティングテーブルごと)。

だからここでの原則は、アクティブであり続けること厳密なリバースパス転送rp_フィルター)は、わん1そして、いつものようにeth0代替テーブルを使用する(これにより、rp_フィルターこの追加のルーティングテーブルはメインのルーティングテーブルを複製しますが、代替パスに必要なルートのみを使用します(わん1) であり、通常の経路は「通常の」経路には含まれません (わん0)。他のルート(VPNなど)が通過するフローに関与する必要がある場合は、わん1おそらく、それらのルートも追加するか、それに対処するために他の追加ルールとテーブルを作成する必要があります。

Linuxはカーネル3.6でルーティングキャッシュの使用を中止したため、ルーティングスタックには応答パケットを送り返すように指示するものが何もありませんでした。ホスト1クライアントにわん1そして彼らは最終的にメインのデフォルトルートを使って外出することになるわん0、このインターフェースの間違ったIPでNATされました(ネットフィルタールートに依存しておらず、接続の最初のパケットを受信した時点でNATを実行することをすでに選択している)ため、ISPの次のルータで厳格なリバースパスフィルタリングも実行されている可能性があります。ネットフィルターパケットのマークをconntrackのマークにコピーしてパケットに戻す機能:これは接続のルートメモリとして機能します。iptablesそしてネットフィルター接続トラック2 つの関連する機能に使用されます。ルーティング決定を変更するためにパケットをマークすることと、同じ接続の一部として識別された応答パケットにこのマークを復元することです。

これらはすべて次のコマンドに変換されます:

  • ルーティング部分

マークされたパケット(任意のマーク値 101)には、追加のルーティング テーブル(無関係な任意の値も 101)を使用します。

    ip rule add fwmark 101 lookup 101

テーブルに同様のエントリを入力します主要ルーティングテーブル、マイナスわん0エントリー:

    ip route add table 101 192.168.0.0/16 dev eth0
    ip route add table 101 84.114.7.0/24 dev wan1
    ip route add table 101 default via 84.114.7.254 dev wan1
  • iptables/ネットフィルター一部

以下のコマンドではさまざまな最適化が可能であり、おそらく改善されるでしょう。

すでに保存されている潜在的な以前のマークを復元し、応答パケットが元のパケットと同じマークを取得するようにします。

    iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

到着したパケットをマークするわん1上記のルーティング決定を変更するには:

    iptables -t mangle -A PREROUTING -i wan1 -j MARK --set-mark 101 

マークがある場合は保存してください接続トラックナットテーブルは、パケットごとにではなく、接続フローごとに 1 回だけ実行します):

    iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark

実際、これはまだ失敗するだろう厳密なリバースパス転送チェックしてください、これは文書化されていない機能2010 年に追加されました。次の場所で使用する必要があります。

sysctl -w net.ipv4.conf.wan1.src_valid_mark=1

関連情報