私はGentoo Linuxを実行しているので、単純なiptbalesを使用してファイアウォールとネットワークを管理しています。通常、すべてのトラフィックにwan0を使用しますが、その背後にすでにWebサーバーがあるため、2番目のWebサーバーにwan1(別のドメインにバインド)を使用します。
私は3つのインターフェースを持っています:
ゲートウェイに関するいくつかの情報
> 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を使用します。
これをどのように管理できるかについての提案はありますか?
事前にありがとう、ロブ
答えは構成に結びついているので、私はいくつかの仮定をします。実際の構成に合わせて回答を調整する必要があります。
wan1のLANおよびゲートウェイwan1の任意に84.114.7.0として選択/ 24および84.114.7.254。
ファイアウォールルールは考慮されていませんが、これらすべてがファイアウォールルールと相互作用することはありません。
Linuxの場合 ip link
、 ip address
および ip route
は、廃止予定のifconfig
およびroute
ではなく、常に使用する必要があります。 route
はとにかく追加のルーティングテーブルを処理できません。
念のため、iptablesまたは実際にはnetfilterはルーティングされませんただし、そのアクションによって、IPルーティングスタックによって行われるルーティングの決定を変更できます。この schematic は、ルーティングの決定が行われる場所を示しています。 1つの場所にのみ存在するルーティングされた(ローカルではなく)トラフィックの場合、前に変更が発生する必要があります:raw/PREROUTING、mangle/PREROUTINGまたはnat/PREROUTING、raw多くの場合非実用的であり、nat限られた場合のみ、ほとんどmangle。
基本的なマルチホームシステム 、インターネットへの複数のパスを使用するには、通常 ポリシールーティング が必要です。この場合、ルートは通常の宛先だけでなく、ソース、またはポリシールールで使用される他のセレクター(ここで行います)。 Linuxでは ip rule
別のルーティングテーブルを選択して、たとえば別のデフォルトルートを選択できます(デフォルトルートは1つだけですが、ルーティングテーブルごとに1つ)。
したがって、ここでは原則、アクティブなまま Strict Reverse Path Forwarding ( rp_filter )は、 wan1からのパケットを受け入れ、通常どおりeth0にルーティングして代替テーブル(rp_filterを渡すことができます)。この追加のルーティングテーブルはメインルーティングテーブルを複製する必要がありますが、代替パス(wan1)に必要なルートのみを使用しているため、 「通常の」パス(wan0)。他のルート(VPNなど)がwan1を通過するフローに関与する必要がある場合、それらのルートも追加する必要がある可能性があります。これに対処するには、他の追加のルールとテーブルを作成する必要があります。
Linuxはカーネル3.6でルーティングキャッシュの使用を中止したため、ルーティングスタック内の何もHost1からクライアントにwan1そして、それらはwan0を通るメインのデフォルトルートを使用して出て行くことになります、このインターフェース(netfilterの間違ったIPでNAT処理されている)はルートに依存せず、すでにNAT接続の最初のパケットを受信したときに行われ、おそらくISPの次のルーターによって厳密なリバースパスフィルタリングもドロップしている可能性があります。netfilter機能により、パケットのマークをconntrackのマークにコピーしてパケットに戻すには、これが接続のルートメモリとして機能します。したがって、iptablesおよびnetfilterのconntrackは、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