web-dev-qa-db-ja.com

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台のマシンで、HTTPサーバーを80ではなくポート8000​​で実行しています。通常、着信インターフェースとして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を使用します。

これをどのように管理できるかについての提案はありますか?

事前にありがとう、ロブ

2
NightDragon

答えは構成に結びついているので、私はいくつかの仮定をします。実際の構成に合わせて回答を調整する必要があります。

  • wan1のLANおよびゲートウェイwan1の任意に84.114.7.0として選択/ 24および84.114.7.254。

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

Linuxの場合 ip linkip address および ip route は、廃止予定のifconfigおよびrouteではなく、常に使用する必要があります。 routeはとにかく追加のルーティングテーブルを処理できません。

念のため、iptablesまたは実際にはnetfilterはルーティングされませんただし、そのアクションによって、IPルーティングスタックによって行われるルーティングの決定を変更できます。この schematic は、ルーティングの決定が行われる場所を示しています。 1つの場所にのみ存在するルーティングされた(ローカルではなく)トラフィックの場合、前に変更が発生する必要があります:raw/PREROUTINGmangle/PREROUTINGまたはnat/PREROUTINGraw多くの場合非実用的であり、nat限られた場合のみ、ほとんどmangle

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

したがって、ここでは原則、アクティブなまま Strict Reverse Path Forwardingrp_filter )は、 wan1からのパケットを受け入れ、通常どおりeth0にルーティングして代替テーブル(rp_filterを渡すことができます)。この追加のルーティングテーブルはメインルーティングテーブルを複製する必要がありますが、代替パス(wan1)に必要なルートのみを使用しているため、 「通常の」パス(wan0)。他のルート(VPNなど)がwan1を通過するフローに関与する必要がある場合、それらのルートも追加する必要がある可能性があります。これに対処するには、他の追加のルールとテーブルを作成する必要があります。

Linuxはカーネル3.6でルーティングキャッシュの使用を中止したため、ルーティングスタック内の何もHost1からクライアントにwan1そして、それらはwan0を通るメインのデフォルトルートを使用して出て行くことになります、このインターフェース(netfilterの間違ったIPでNAT処理されている)はルートに依存せず、すでにNAT接続の最初のパケットを受信したときに行われ、おそらくISPの次のルーターによって厳密なリバースパスフィルタリングもドロップしている可能性があります。netfilter機能により、パケットのマークをconntrackのマークにコピーしてパケットに戻すには、これが接続のルートメモリとして機能します。したがって、iptablesおよびnetfilterconntrackは、2つの関連機能に使用されます:パケットをマークするルーティング決定を変更し、返信paでこのマークを復元するため同じ接続の一部として識別されるソケット。

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

  • ルーティングパーツ

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

    ip rule add fwmark 101 lookup 101
    

    mainルーティングテーブルに似たエントリから、wan0エントリを差し引いて、テーブルに入力します。 :

    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/netfilterパーツ

    以下のコマンドではさまざまな最適化が可能ですが、おそらく改善することができます。

    保存済みの潜在的な以前のマークを復元して、返信パケットが元のパケットと同じマークを取得するようにします。

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

    wan1から到着するパケットにマークを付けて、上記のルーティング決定を変更します。

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

    マークがある場合は、conntrackに保存します(natパケットごとではなく、接続フローごとに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
1
A.B