2つのインターネット接続が可能なコンピュータがあります。 1つ目は、ローカルネットワークに接続し、ルータを介してインターネットにアクセスするために使用されるイーサネットインターフェイスです。 2番目は、ppp接続を持つGSMモデムを使用します。
次のようにインターフェイスを指定するときは、各接続を独立して使用できるようにしたいと思います。
ping -I eth0 www.google.com
ping -I ppp0 www.google.com
インターフェイスを選択せずに eth0 を介した接続が機能する場合、デフォルトは eth0 を使用しますが、eth0 を介した接続が機能しない場合は ppp0 が使用されます。
私はこれを読んだ記事そして、次のルールを作成しました。
# Main table
ip route add 10.0.0.0/24 dev eth0 src 10.0.0.100
ip route add 10.64.64.64 dev ppp0 src 10.123.122.101
ip route add default via 10.0.0.1
# Specific tables
ip route add 10.0.0.0/24 dev eth0 src 10.0.0.100 table eth0
ip route add default via 10.0.0.1 table eth0
ip route add 10.64.64.64 dev ppp0 src 10.123.122.101 table ppp0
ip route add default via 10.64.64.64 table ppp0
# Rules
ip rule add from 10.0.0.100 table eth0
ip rule add from 10.123.122.101 table ppp0
一見するとうまくいくようです。しかし、eth0テーブルは絶対に使用されていないようです。私は次のことが起こると予想しています。
ping -I eth0 www.google.ch # Use default gateway in table eth0
ping -I ppp0 www.google.ch # Use default gateway in table ppp0
ping www.google.ch # Use default gateway (main)
ただし、デフォルトゲートウェイ(デフォルト)を削除すると、eth0インターフェイスはまったく機能しません。明らかに私が理解していないものがあります。私が望むことを達成する方法を説明しますか?
@derobertの回答に基づいて編集します。
次の設定をテストしましたが、まだ同じエラーが発生します(ppp0では機能しますがeth0では機能しません)。
路線:
# ip rule list
0: from all lookup local
1500: from 10.0.0.100 lookup eth0
1501: from 10.123.122.101 lookup ppp0
2000: from all fwmark 0x1 lookup eth0
2001: from all fwmark 0x2 lookup ppp0
32766: from all lookup main
32767: from all lookup default
# ip route list table eth0
10.0.0.0/24 dev eth0 src 10.0.0.100
default via 10.0.0.1 dev eth0
# ip route list table ppp0
10.64.64.64 dev ppp0 src 10.123.122.101
default via 10.64.64.64 dev ppp0
# ip route list table main
10.64.64.64 dev ppp0 src 10.123.122.101
192.168.1.0/24 dev eth1 src 192.168.1.1
10.0.0.0/24 dev eth0 src 10.0.0.100
ファイアウォール:
# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
CONNMARK all -- anywhere anywhere CONNMARK restore
RETURN all -- anywhere anywhere mark match !0x0
MARK all -- anywhere anywhere MARK set 0x1
MARK all -- anywhere anywhere MARK set 0x2
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MARK all -- anywhere anywhere MARK set 0x1
MARK all -- anywhere anywhere MARK set 0x2
CONNMARK all -- anywhere anywhere CONNMARK save
# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 10.0.0.1 anywhere to:10.0.0.100
SNAT all -- 10.64.64.64 anywhere to:10.123.122.101
邪魔にならないように、他のすべてのファイアウォールルールを削除しました。私は次のような結果を得ます。
# ip route get 8.2.1.1 from 10.0.0.100
8.2.1.1 from 10.0.0.100 via 10.0.0.1 dev eth0
# ip route get 8.2.1.1 from 10.123.122.101
8.2.1.1 from 10.123.122.101 via 10.64.64.64 dev ppp0
# ping -I ppp0 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=45 time=350.108 ms
64 bytes from 8.8.8.8: seq=1 ttl=45 time=349.768 ms
64 bytes from 8.8.8.8: seq=2 ttl=45 time=329.671 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 329.671/343.182/350.108 ms
128# ping -I eth0 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
^C
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 0 packets received, 100% packet loss
ルールは大丈夫だったようですが、別の問題があったようです。ここでは、SNATの役割をよく理解していません。回答の設定を反映するルールを追加しましたが、間違っている可能性があります。
答え1
私の設定は少し複雑で、システムのNATと動的(内部)ルーティングも含みます。
いくつかの部分があります。ルールから始めましょう。
Maginot:~# ip rule ls
0: from all lookup local
1000: from all lookup main
1500: from 173.167.51.136/29 lookup comcast
1501: from 76.160.165.106/29 lookup cavtel
1502: from 151.200.251.90/31 lookup vzdsl
1502: from 151.200.251.92/31 lookup vzdsl
1502: from 151.200.251.94 lookup vzdsl
2000: from all fwmark 0x1 lookup comcast
2001: from all fwmark 0x2 lookup cavtel
2002: from all fwmark 0x3 lookup vzdsl
2500: from all lookup comcast
2501: from all lookup cavtel
2502: from all lookup vzdsl
32767: from all lookup default
(このテーブルの名前はにあります/etc/iproute2/rt_tables
。)
ご覧のとおり、現在、3つのISPがあり、各ISPには複数の静的IPアドレスがあります。規則1500-1502は、これらの送信元IPアドレスから適切なインターフェイスにトラフィックを送信します。規則2000-2002は、指定されたファイアウォールタグ(これについては説明します)を含むトラフィックを適切なインターフェイスに送信します。規則2500-2502は、ISPにまだ割り当てられていないトラフィックに対してISPの優先順位を付与します。いずれかが失敗した場合は、そのルールを削除してリスト内の次のルールを使用できます。
各ルーティングテーブルは非常に簡単です。
Maginot:~# ip route ls table comcast
default via 173.167.51.142 dev comcast
(ローカルとメインにはより多くのコンテンツがありますが、それぞれ直接接続と内部パスです。テーブルはデフォルトで空です。)
次に、接続がISPに割り当てられている場合は、その接続をそのまま維持することが重要です(受信接続を含む)。インターフェイスごとにIPアドレスが異なり、ISPが実際にリバースパスフィルタリングを備えているため、移動を試みることは不可能です。ファイアウォールルールを使用して同じISPに保存します。
SNATが完了したことを覚えておいてください後ろにルーティングのため、ip rule
戦略は役に立ちません。他のものを使用する必要があります(多分それは問題ですか?)
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN # if already set, we're done
iptables -t mangle -A PREROUTING -i wan -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A PREROUTING -i comcast -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A PREROUTING -i vz-dsl -j MARK --set-mark $MARK_VZDSL
iptables -t mangle -A POSTROUTING -o wan -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A POSTROUTING -o comcast -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A POSTROUTING -o vz-dsl -j MARK --set-mark $MARK_VZDSL
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark
これはこれを設定するシェルスクリプトからのものです。変数は$MARK_…
上記のルールで見たタグと一致します。とても簡単です。接続タグを復元します(タグはパケット単位であることを忘れないでください)。これで(接続タグから)タグがあると、タスクは完了しました。それ以外の場合は、関連するインターフェイスに従ってフラグが設定されます。
マークが復元されます。今後パスを指定して後でのみ保存してください。とにかくフラグは発信インターフェイスに設定されます(議論の余地があります)。
最後に、実際のNATルールがあります。いくつかのローカルプレフィックスがあります。このコードは for ループで実行され、プレフィックスごと$local
に設定されます。
iptables -t nat -A POSTROUTING -s $local -o wan -j SNAT --to-source 76.160.165.106
iptables -t nat -A POSTROUTING -s $local -o comcast -j SNAT --to-source 173.167.51.137
iptables -t nat -A POSTROUTING -s $local -o vz-dsl -j SNAT --to-source 151.200.251.90
(注:一部のDMZサーバーのDNATなど、より多くの規則があります。関連項目はすべてコピーしたようです。)
答え2
eth0デバイスの重みをppp0デバイスよりも高い優先順位に設定する必要があります。
例:
ip route append default scope global nexthop via 10.0.0.1 dev eth0 weight 2 nexthop via 10.64.64.65 dev ppp0 weight 3