web-dev-qa-db-ja.com

Linuxマシンをセカンダリルーター/ ISPに接続する:ルーティングを正しく設定する方法は?

要約:

既存のネットワーク設定にセカンダリISPを追加すると、(ルーティングと思われる)問題が発生します。Router1を介した着信トラフィックは応答されませんが、ローカルトラフィックとRouter0を介した着信は正常に機能しています。

Router1を介した着信トラフィックを機能させながら、現在機能しているパーツを正常に機能させるにはどうすればよいですか?

詳細:

以下の図を、状況の基本的な部分とともにスケッチしました(実際には、各LANにはより多くのデバイスがありますが、それらは重要ではありません)。

これは状況です:

  • 2つの内部ネットワークがあります。LAN0192.168.x.0/24で、LAN1192.168.y.0/24です。どちらも内部トラフィックに対しては正常に機能します(たとえば、 http using cURL )。
  • LAN0は常にRouter0およびISP0を介してInternetに接続されています。
  • LAN1には常にRouter1がありましたが、現在はISP1を介してInternetに接続されています。
  • LAN0上にあり、Router0を経由するデフォルトルートを持つマシンは、発信トラフィックと着信トラフィックに対して正常に機能します。
  • LAN1上にあり、Router1を経由するデフォルトルートを持つマシンは、発信トラフィックと着信トラフィックに対して正常に機能します。
  • LAN0およびLAN1の内部トラフィックは常に正常に機能しています。
  • WindowsBRouter1を介した着信トラフィックは正しく到着します。WindowsCからRDP経由で接続できます。
  • LinuxBRouter1を介した着信トラフィックが到着しますが( tcpdump による)、curl http://e.f.g.h fron LinuxCが示すように応答されません。 tcpdump onLinuxBは次のことを示しています:

tcpdump出力形式 -に [〜#〜] syn [〜#〜] フラグが設定されているパケットのみが表示されます。

LinuxB:/tmp/LinuxB.eth1.80 # tcpdump -i eth1 'port 80'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
13:35:19.489779 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047182 ecr 0,sackOK,eol], length 0
13:35:19.788841 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047478 ecr 0,sackOK,eol], length 0
13:35:19.888835 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047578 ecr 0,sackOK,eol], length 0
13:35:19.989412 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047678 ecr 0,sackOK,eol], length 0
13:35:20.089685 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047778 ecr 0,sackOK,eol], length 0
13:35:20.190836 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047877 ecr 0,sackOK,eol], length 0
13:35:20.392123 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287048072 ecr 0,sackOK,eol], length 0
13:35:20.693692 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:21.197162 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:22.204134 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:24.115961 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:27.852374 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:31.967049 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0

これはLinuxBルートテーブルです。

LinuxB:/tmp/LinuxB.eth1.80 # route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.x.1     0.0.0.0         UG    0      0        0 eth0
loopback        *               255.0.0.0       U     0      0        0 lo
link-local      *               255.255.0.0     U     0      0        0 eth0
192.168.x.0     *               255.255.255.0   U     0      0        0 eth0
192.168.x.0     *               255.255.255.0   U     0      0        0 eth1

WindowsCからWindowsBへのRDP経由の接続は正常に機能するため、これは確かにルーティングの問題であると再開します。これはWindowsBルートテーブルです。

C:\temp>route print
===========================================================================
Interface List
0x1 ........................... MS TCP Loopback interface
0x2 ...00 0c 29 35 77 e1 ...... AMD PCNET Family PCI Ethernet Adapter - Packet Scheduler Miniport
0x3 ...00 0c 29 35 77 eb ...... VMware Accelerated AMD PCNet Adapter - Packet Scheduler Miniport
===========================================================================
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.x.1     192.168.x.4      10
          0.0.0.0          0.0.0.0      192.168.y.1     192.168.y.4       5
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
      192.168.x.0    255.255.255.0      192.168.x.4     192.168.x.4      10
      192.168.x.4  255.255.255.255        127.0.0.1       127.0.0.1      10
    192.168.x.255  255.255.255.255      192.168.x.4     192.168.x.4      10
      192.168.y.0    255.255.255.0      192.168.y.4     192.168.y.4      10
      192.168.y.4  255.255.255.255        127.0.0.1       127.0.0.1      10
    192.168.y.255  255.255.255.255      192.168.y.4     192.168.y.4      10
        224.0.0.0        240.0.0.0      192.168.x.4     192.168.x.4      10
        224.0.0.0        240.0.0.0      192.168.y.4     192.168.y.4      10
  255.255.255.255  255.255.255.255      192.168.x.4     192.168.x.4       1
  255.255.255.255  255.255.255.255      192.168.y.4     192.168.y.4       1
Default Gateway:       192.168.y.1
===========================================================================
Persistent Routes:
  Network Address          Netmask  Gateway Address  Metric
          0.0.0.0          0.0.0.0      192.168.y.1       5
          0.0.0.0          0.0.0.0      192.168.x.1      10

では、LinuxBのルーティングを次のようにするにはどうすればよいですか。

  • デフォルトルートをLinuxBから192.168.x.1に維持して、発信トラフィックがRouter0/ISP0を使用し続けるようにします。
  • LAN0LAN0からの着信リクエストに引き続き応答します
  • LAN1LAN1からの着信リクエストに引き続き応答します
  • Router0a.b.c.d/192.168.x.1)から192.168.x.1経由で着信リクエストに応答し続けます
  • Router1e.f.g.h/192.168.y.1)から192.168.y.1経由で着信リクエストへの応答を開始します
  • ボーナス:Router1フェイルオーバーまたはRouter0との負荷分散があります

追記:

以下のPNG画像[〜#〜] uml [〜#〜] 無料のオンライン PlantUML エンジンを介してテキストで生成されます。元のUMLテキストを表示する場合は、 PNG画像リンク をこの PlantUMLフォーム に貼り付けてから、Submitを押します。

enter image description here

ずっと前にそのようなことをするためのシェルスクリプトを持っていましたが、申し訳ありませんが、それを見つけることができました。そのため、当時実装したソリューションへのポインタしか提供できません。私は主にメモリから書いているので、いくつかの例が欠落しています:

  1. アップリンクごとに1つのルーティングテーブルがありました(ipルート...テーブル101、ipルート...テーブル102)。それは/ etc/iproute2/rt_tablesに入ります。

    101 isp1 102 isp2

    これらのテーブルも設定する必要があります。

    ip route add default via $ Gateway1 dev $ Interface1 table isp1 ip route add default via $ Gateway2 dev $ Interface2 table isp2

    #デフォルトのテーブルを忘れないでください:

    ip route add default via $ DefaultGateway dev $ DefaultInterface

  2. Iptables接続追跡を有効にする(modprobe nf_conntrack)

  3. 新規着信接続のiptablesルールを-jに設定します。パケットに何らかの方法でマークを付けます(例:0x201、0x202)
  4. インターフェイスを経由して送信されるトラフィックが正しいルーティングテーブルを使用するようにするIPルールを設定します

    ip rule add from $ Ip1 table isp1 ip rule add from $ Ip2 table isp2

  5. 「0x201とマークされたパケットはルーティングテーブル201を検索する」というipルール(ip rule add ...)を設定します。これは、アップリンクごとに1つのルールです。

すべてが整っていると、WANアップリンクとの接続を受信および開始でき、発信接続のバランスを取ることもできます。

それが基本です。 Iptables + "ip route" + "iprule"そしてあなたは行ってもいいです。

1
marc.fargas