複数のインターネットプロバイダーを持つルーターとしてのLinux


16

ルーターとしてのLinux:3つのインターネットプロバイダーがあり、それぞれに独自のモデムがあります。

ゲートウェイアドレス192.168.1.1であるProvider1
Linuxルーターeth1 /192.168.1.2に接続

Provider2、ゲートウェイアドレス192.168.2.1
Linuxルーターeth2 /192.168.2.2に接続

Provider3、ゲートウェイアドレス192.168.3.1
Linuxルーターeth3 /192.168.3.2に接続

                                                                           ________
                                                   +------------+         /
                                                   |            |        |
                            +----------------------+ Provider 1 +--------|
        __                  |192.168.1.2           |192.168.1.1 |       /
    ___/  \_         +------+-------+              +------------+      |
  _/        \__      |    eth1      |              +------------+      /
 /             \ eth0|              |192.168.2.2   |            |      |
|Client network -----+  ROUTER  eth2|--------------+ Provider 2 +------|     Internet
 \10.0.0.0/24 __/    |              |              |192.168.2.1 |      |
   \__     __/       |    eth3      |              +------------+      \
      \___/          +------+-------+              +------------+       |
                            |192.168.3.2           |            |       \
                            +----------------------+ Provider 3 +-------|
                                                   |192.168.3.1 |       |
                                                   +------------+       \________

ネットワーク10.0.0.0/24のクライアントをソースIPによって異なるゲートウェイにルーティングしたいと思います。
クライアントネットワークへのインターフェイスは、すべてのクライアントのデフォルトゲートウェイであるeth0 /10.0.0.1です。

例:
10.0.0.11はProvider1 @ eth1
にルーティングする必要があります10.0.0.12はProvider2 @ eth2にルーティングする必要があり
ます...

私が使用する必要があると思うip routeiptablesSNATのために、私は正確にどのように考え出したていません。
ここに私がこれまでに持っているスクリプトがあります。
ipv4転送が有効になっています。

#!/bin/bash
# flush tables
ip route flush table connection1
ip route flush table connection2
ip route flush table connection3

# add the default gateways for each table
ip route add table connection1 default via 192.168.1.1
ip route add table connection2 default via 192.168.2.1
ip route add table connection3 default via 192.168.3.1

# add some IP addresses for marking
iptables -t mangle -A PREROUTING -s 10.0.0.11 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 10.0.0.12 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s 10.0.0.13 -j MARK --set-mark 3

# add the source nat rules for each outgoing interface
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.2
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.2.2
iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 192.168.3.2

# link routing tables to connections (?)
ip rule add fwmark 1 table connection1
ip rule add fwmark 2 table connection2
ip rule add fwmark 3 table connection3

#default route for anything not configured above should be eth2

あなたはそれが(接続追跡によってNAT'dされます)パケット2..nに適用できるようにマークを保存/復元するために、私が思うに、CONNMARKに追加する必要がある
derobert

ここで使用する構成からの抜粋を含む回答を追加しました。何でも明確にするために週末にチェックインしようとします
...-デロバート

回答:


13

ルーターの1つからの同様のセットアップを以下に示します(いくつかの無関係なものが切り取られています)。これは着信接続も処理することに注意してください。

ハードコードされたマーク番号の代わりに変数を使用することに注意してください。メンテナンスがとても簡単です!それらは別のスクリプトに保存され、ソースされます。テーブル名はで設定され/etc/iproute2/rt_tablesます。インターフェイス名はで設定され/etc/udev/rules.d/70-persistent-net.rulesます。

##### fwmark ######
iptables -t mangle -F
iptables -t mangle -X

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN # if already set, we're done
iptables -t mangle -A PREROUTING -i wan      -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A PREROUTING -i comcast  -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A PREROUTING -i vz-dsl   -j MARK --set-mark $MARK_VZDSL

iptables -t mangle -A POSTROUTING -o wan     -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A POSTROUTING -o comcast -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A POSTROUTING -o vz-dsl  -j MARK --set-mark $MARK_VZDSL
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

##### NAT ######
iptables -t nat -F
iptables -t nat -X
for local in «list of internal IP/netmask combos»; do
    iptables -t nat -A POSTROUTING -s $local -o wan     -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o comcast -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o vz-dsl  -j SNAT --to-source «IP»
done

# this is an example of what the incoming traffic rules look like
for extip in «list of external IPs»; do
    iptables -t nat -A PREROUTING   -p tcp -d $extip --dport «port» -j DNAT --to-destination «internal-IP»:443
done

そしてルール:

ip rule flush
ip rule add from all               pref 1000  lookup main 
ip rule add from A.B.C.D/29        pref 1500  lookup comcast # these IPs are the external ranges (we have multiple IPs on each connection)
ip rule add from E.F.G.H/29        pref 1501  lookup cavtel
ip rule add from I.J.K.L/31        pref 1502  lookup vzdsl
ip rule add from M.N.O.P/31        pref 1502  lookup vzdsl # yes, you can have multiple ranges
ip rule add fwmark $MARK_COMCAST   pref 2000  lookup comcast
ip rule add fwmark $MARK_CAVTEL    pref 2001  lookup cavtel
ip rule add fwmark $MARK_VZDSL     pref 2002  lookup vzdsl
ip rule add                        pref 2500  lookup comcast # the pref order here determines the default—we default to Comcast.
ip rule add                        pref 2501  lookup cavtel
ip rule add                        pref 2502  lookup vzdsl
ip rule add                        pref 32767 lookup default

ルーティングテーブルはで設定される/etc/network/interfacesため、インターフェースを停止すると、別のインターフェースを使用するように切り替わります。

iface comcast inet static
        address A.B.C.Q
        netmask 255.255.255.248
        up ip route add table comcast default via A.B.C.R dev comcast
        down ip route flush table comcast

注:あなたは(あなたがおそらくある)だけでなくフィルタリングをやっている場合もに適切なルールを追加する必要がありますFORWARDへのACCEPTトラフィック。特に着信トラフィックの場合。


どうもありがとうございました!これを自分のニーズに合わせて変更し、ボックスにロードして、この投稿を更新します。
フラブ

魔法のように機能します。ありがとうございます。「comcast」への優先順位/デフォルトルートを除きます。(私にとってはeth2である必要があります)しかし、一般的なルールip rule add from 10.0.0.0/24 pref 1400 lookup eth2を追加し、その後例外を作成することで、それを回避したと思います。
フラブ

1
@Flavでは、ファイアウォールマーク(PREROUTING)で例外を設定することもできます。ところで:リンクされた質問の1つ(unix.stackexchange.com/questions/70440/…)には、この構成の一部の詳細な説明があります。これらのip / maskルールは、実際には私の構成内の非NATトラフィック用です(SNATはPOSTROUTINGで発生するため、ipルールの後)
-derobert
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.