抽象的:
我在现有网络设置中添加辅助 ISP 时遇到了(我认为是路由)问题:通过的传入流量Router1
没有得到应答,但本地流量和传入流量Router0
工作正常。
我怎样才能使当前运行良好的部分保持正常运转,同时使传入流量正常Router1
运行?
阐述:
我在下面绘制了一张图表,显示了情况的基本内容(实际上每个 LAN 上都有更多设备,但这些并不重要)。
情况如下:
- 我有两个内部网络:
LAN0
is192.168.x.0/24
和LAN1
is192.168.y.0/24
。 这两个网络都适用于内部流量(例如http使用卷曲)。 LAN0
一直通过Router0
和连接ISP0
到Internet
。LAN1
一直 都有Router1
, 但 现在 已 连接ISP1
到 了Internet
。LAN0
只有打开并具有默认路由的机器才能Router0
正常工作以处理传出和传入的流量。LAN1
只有打开并具有默认路由的机器才能Router1
正常工作以处理传出和传入的流量。- 内部交通
LAN0
一直LAN1
畅通。 - 通过的传入流量正确
Router1
到达WindowsB
:我可以通过 RDP 从 连接到它WindowsC
。 - 传入流量通过
Router1
到达LinuxB
(根据tcpdump),但没有回答,因为curl http://e.f.g.h
前者LinuxC
用tcpdump 开启LinuxB
显示:
它仅显示符合以下条件的数据包:tcpdump 输出格式- 有一个同步标志设置:
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
由于通过 RDP 从到 的连接WindowsB
工作正常,因此我断定这确实是路由问题。这是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
- 继续回应
LAN0
来自LAN0
- 继续回应
LAN1
来自LAN1
- 继续通过
Router0
(a.b.c.d
/192.168.x.1
)回答传入的请求192.168.x.1
Router1
通过(e.f.g.h
/192.168.y.1
)开始应答传入请求192.168.y.1
- 奖励:具有
Router1
故障转移或负载平衡Router0
后记:
这下面的 PNG 图像生成于统一模型通过免费在线文本植物UML引擎。如果你想查看原始的 UML 文本,请粘贴PNG 图片链接进入这个PlantUML 表单,然后按Submit
。
答案1
很久以前,我有一个用于执行类似操作的 shell 脚本,但很抱歉,找不到它。所以我只能给你提供我当时实施的解决方案的指示。我主要根据记忆写作,因此缺少一些示例:
我为每个上行链路设置了一个路由表 (ip route ... table 101, ip route ... table 102)。这些路由表位于 /etc/iproute2/rt_tables 中。
101 isp1 102 isp2
您还需要设置这些表:
ip route 通过 $Gateway1 dev $Interface1 table isp1 添加默认 ip route 通过 $Gateway2 dev $Interface2 table isp2 添加默认
#不要忘记默认表:
ip route 通过 $DefaultGateway dev $DefaultInterface 添加默认
启用 iptables 连接跟踪(modprobe nf_conntrack)
- 为新传入连接设置 iptables 规则,以 -j 以某种方式标记数据包(即:0x201、0x202)
设置 IP 规则,确保通过接口传出的流量使用正确的路由表
ip 规则从 $Ip1 表 isp1 添加 ip 规则从 $Ip2 表 isp2 添加
设置一个 ip 规则(ip 规则添加...),规定“标记为 0x201 的数据包应查找路由表 201”,每个上行链路一个规则。
一切就绪后,您应该能够接收和发起与任何广域网上行链路的连接,甚至平衡传出连接。
这些就是基础知识。Iptables +“ip route”+“ip rule”,一切就绪。