mefatの答えは私を大いに助けましたが、2つのISPテーブルへのすべてのメインテーブルルールの1回限りのコピーではなく、メインテーブルの後にデフォルトルールを追加するためにルールprioを使用する方が良いかもしれません。
/ etc / iproute2 / rt_tablesを通常どおりセットアップします。
...
10 ISP1
20 ISP2
...
ご了承ください
ip rule show
ルール0-> local、32766-> main、および32767-> defaultを示します。詳細man ip
を参照してください。
重要なことに、ルーティングプロセスは低優先度から高優先度のルールまで機能しますが、32767は最高のルールではありません。メインルーティングテーブルにデフォルトルートがない場合(ただし、vpnなどの動的に変化するあらゆる種類のルートが含まれる場合)、一致しない場合は、デフォルト(通常は空)にフォールスルーし、より高いprioルールを探します。
「スロー」セクションを参照してください:http : //linux-ip.net/html/routing-tables.html
だから今セットアップ
ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2
そして、メインテーブルの後に確実に表示されるようにします。
ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000
使用する
ip rule show
これらのルールがメインよりも高いことを確認するために再び
次に、mefatが言ったようにCONNMARKマングリングを使用します。
# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
注意すべき点:pppdは、nodefaultroute
それ以外の場合はmainでセットアップする必要があります。デバイスが再起動すると、ISP1 / ISP2テーブルが消去されるため、スクリプトを使用して復元する必要があります。
/etc/ppp/ip-{up,down}.d/dual-routingのスクリプトを使用します
# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1
RULENUM=4
set_balance() {
iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}
# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2
これは接続ベースの負荷分散であるため、負荷を使用して統計ルールを監視および置換することを検討しますiptables -t mangle -R PREROUTING <n>
。ユーザースペースから。したがって、一方の接続で長時間実行されているダウンロードがあり、もう一方の接続の負荷が軽い場合は、負荷の軽い接続を選択する必要があります。