web-dev-qa-db-ja.com

Linuxでの複数のISP接続の負荷分散とNAT処理

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を使用する必要があります。

15

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

まあNATは簡単です:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
19
mefat

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>したがって、一方の接続で長時間実行されているダウンロードがあり、もう一方の接続の負荷が軽い場合は、負荷の軽い接続を優先する必要があります。

3
lbt