Linuxでの複数のISP接続の負荷分散とNAT-ing


15

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-ingを適切に行うための手順が必要です。

任意の助けをいただければ幸いです。

PS-pFsenseについては知っていますが、Linuxを使用する必要があります。


2
どのような指示が必要ですか?すべてはlartc.orgで説明されています。特に問題はありますか?
ロレンツォーグ

回答:


19

私は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

さて、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

3
リンク付きの良い答え。これを行うために新しいiptablesを必ずしも必要とするわけではありません。統計の一致が存在する前は、同じサーバーがランダムおよびn番目の一致であったためです。
SiegeX 09

1
iptablesのマークに関して質問があります。投稿されたリンクでは、新しい状態に一致するパケットのみをマークしています。どうして違うやり方をしているのですか?
マティアス14年

ISP3、ISP4など、もう1つのネットワークを使用できますか?
ビトーマズコ

3

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.