2つの異なるISPから2つのインターネット接続があり、2つのISP間のネットワークで送受信されるトラフィックのバランスをとる必要があります。 Debian GNU/Linuxを使用しています。
私のセットアップはこのようなものです-
eth0
(192.168.0.0/24)-ローカルネットワーク
eth1
(192.168.1.0/24)-ISP#1
eth2
(192.168.2.0/24)-ISP#2
私のローカルネットワークはeth0経由でこのサーバーに接続されており、ボックスはLAN内のすべてのマシンのDHCPサーバー兼ゲートウェイです。
サーバーは2つのISP間で負荷分散を行う必要があり、NAT処理も行う必要があります。
lartc.org のルーティング手順に従いましたが、NAT処理を適切に行うための手順が必要です。
任意の助けをいただければ幸いです。
PS-pFsenseについて知っていますが、Linuxを使用する必要があります。
Lartc.orgとiptablesメソッドの両方を使用して負荷分散を実行しましたが、iptablesメソッドの方が理解と実装が簡単です。唯一の欠点は、かなり最近のiptablesバージョンを使用できるようにする必要があることです統計モジュール
いくつかのことを考えてみましょう:
LAN:eth0:192.168.0.1/24
ISP1:eth1:192.168.1.1/24、ゲートウェイ:192.168.1.2/24
ISP2:eth2:192.168.2.1/24、ゲートウェイ:192.168.2.2/24
だからここに私がiptablesメソッドを使用してどのようにするかです:
最初に/ etc/iproute2/rt_tablesを編集して、ルートテーブル番号とISP名の間にマップを追加します
...
10 ISP1
20 ISP2
...
したがって、表10および20は、それぞれISP1およびISP2用です。これらのテーブルに、メインテーブルからのルートをこのコードスニペット(hxxp://linux-ip.net/html/adv-multi-internet.htmlから取得)に入力する必要があります
ip route show table main | grep -Ev '^default' \
| while read ROUTE ; do
ip route add table ISP1 $ROUTE
done
そして、そのISP1のゲートウェイを介してISP1にデフォルトゲートウェイを追加します。
ip route add default via 192.168.1.2 table ISP1
ISP2についても同じことを行います
これで、ISPごとに1つずつ、計2つのルートテーブルができました。
ここで、iptablesを使用して、各ルートテーブルにパケットを均等に分散します。この作業の詳細については、こちら( http://www.diegolima.org/wordpress/?p=36 )とこちら( http://home.regit。 org /?page_id = 7 )
# 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
まあNATは簡単です:
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
mefatの回答は私を大いに助けましたが、2つのISPテーブルへのすべてのメインテーブルルールの1回限りのコピーではなく、メインテーブルの後にデフォルトのルールを追加するためにルールプリオを使用する方が良い方法かもしれません。
/ etc/iproute2/rt_tablesを通常どおりに設定します。
...
10 ISP1
20 ISP2
...
ご了承ください
ip rule show
ルール0-> local、32766-> mainおよび32767-> defaultを表示します。詳細については、man ip
をご覧ください。
決定的に、ルーティングプロセスは低プリオルールから高プリオルールまで機能しますが、32767は最高のルール番号ではありません。したがって、メインルーティングテーブルにデフォルトルートがない場合(ただし、VPNの動的に変更されるすべての種類のルートが含まれている可能性があります)、一致しない場合、デフォルト(通常は空)に陥り、より高いプリオルールを探します。
こちらの「スロー」セクションを参照してください: 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
を必要とします。それ以外の場合は、メインで設定します。デバイスが再起動すると、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>
したがって、一方の接続で長時間実行されているダウンロードがあり、もう一方の接続の負荷が軽い場合は、負荷の軽い接続を優先する必要があります。