だから、ここに状況があります。
私は現在アクティブで、ネットワークからのトラフィックのルーティングに機能しているデュアルISPリンクを持っており、 Linuxでの複数のISP接続の負荷分散とNAT-ing
/etc/iproute2/rt_tables
に次のような2行があります。
...
10 COMCAST
20 CENTURYLINK
...
適切なデフォルトゲートウェイを使用して各テーブルにルートを設定し、次のようなルールを設定します。
ip rule add fwmark 1 table COMCAST prio 33000
ip rule add fwmark 2 table CENTURYLINK prio 33000
次に、iptablesベースのパケットマーキングとルーティングを設定します。
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
CONNMARK all -- anywhere anywhere CONNMARK restore
ACCEPT all -- anywhere anywhere mark match ! 0x0
MARK all -- anywhere anywhere MARK set 0x1
MARK all -- anywhere anywhere statistic mode random probability 0.33300000010 MARK set 0x2
CONNMARK all -- anywhere anywhere CONNMARK save
問題は、どちらかのISPに対してシステム全体のデフォルトルート(ip route list
のようにtable
引数なし)をそのままにしておくと、iptables
ルーティングが上書きされるように見えることです。クライアントマシンの場合-watch -n 1 ifconfig [interface]
によると、デフォルト以外の接続を通過するパケットはありません。システム全体のデフォルトルートを削除すると、ルーティングはすべてのクライアントマシンでうまく機能し、パケットの33%がCenturyLink回線を経由し、残りはComcast回線を経由します。これはすごい!
ただし、デフォルトルートがないと、ルーター自体でインターネット接続が必要なすべてのものが壊れます。たとえば、ルーターでapt-get update
を実行できません。では、iptables
ルーティング設定を上書きしないシステムのデフォルトルートを設定するにはどうすればよいですか? LARTCサイトの指示に従って、次のようにマルチパスルートを設定しようとしました。
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop dev $IF2 weight 1
(CenturyLink接続のデフォルトルートにはゲートウェイIPがなく、dev ppp0
だけであり、そのテーブルのデフォルトゲートウェイで機能するため、LARTCガイドから少し変更する必要がありました。)
ただし、マルチパスルートは、サーバーとそれがルーティングするクライアント上のすべてを破壊します。助けて?
私はこれを自分で理解することができました。
他の誰かが同様の状況に遭遇した場合の解決策は、fwmarkのip rule
エントリの優先度を変更することでした。私は読んでいませんでした 関連する質問に対するlbtの答え 十分注意深く;彼は特に、優先度を33000に設定すると、これらのルールがafterdefault
テーブルルックアップの後に実行されることを指摘します。これは、私が欲しいもの。そこで、ルールを次のように変更しました。
100: from all fwmark 0x1 lookup COMCAST
100: from all fwmark 0x2 lookup CENTURYLINK
そして今、デフォルトルートがあってもファイアウォールベースのルーティングが壊れることはなく、apt-get
と他のすべてのプログラムを問題なく実行できます。やったー!