如何使iproute2多个上行链路与伪装一起工作

时间:2010-12-02 13:53:55

标签: linux networking routing

我遇到路由+ NAT的以下问题: 如果我有两个ISP,并且我在两个ISP链路上使用MASQUERADE的默认路由中使用两个nexthop,我看到路由缓存重新生成,但有时发送到新链路的数据包(在缓存重新生成后)使用错误的源地址进行伪装。 / p>

这是配置。

我通过两个不同的提供商与外界建立了两个链接: eth1 eth2 eth0是局域网

  

$ ip a(输出的一部分,因为我们还有3个接口禁用)
      2: eth1 :mtu 1500 qdisc pfifo_fast qlen 1000
      inet 192.168.1.254/24 brd 192.168.1.255范围全球eth1
      3: eth2 :mtu 1500 qdisc pfifo_fast qlen 1000
      inet 192.168.2.254/24 brd 192.168.2.255范围全球eth2
      6:eth0:mtu 1500 qdisc pfifo_fast qlen 1000
      inet 192.168.5.1/24 brd 192.168.5.255 scope global eth0

旋转表:

  

$ ip r       192.168.5.0/24 dev eth0 proto内核范围链接src 192.168.5.1
      192.168.2.0/24 dev eth2 proto kernel scope link src 192.168.2.254
      192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.254
      默认          nexthop via 192.168.1.1 dev eth1 weight 1
         nexthop via 192.168.2.1 dev eth2 weight 1

     

$ ip r s t eth1
      默认通过192.168.1.1 dev eth1

     

$ ip r s t eth2
      默认通过192.168.2.1 dev eth2

规则:

  

$ ip ru
      0:来自所有查找本地
      32450:从192.168.2.254查找eth2
      32717:从192.168.5.124查找eth1
       32766:来自所有查找主
      32767:来自所有查找默认值

Q1 :如果我从局域网中的两台PC进行ping操作:5.137和5.147,那么相同的IP(195.60.1.1)如何通过不同的链接进行ping操作( ping 195.60.1.1 在两台计算机上运行)?

  

$ ip r g 195.60.1.1 来自192.168.5.137 iif eth0
      195.60.169.6 from 192.168.5.137 via 192.168.1.1 dev eth1 src 192.168.5.1
          cache mtu 1500 advmss 1460 hoplimit 128 iif eth0

     

$ ip r g 195.60.1.1 来自192.168.5.147 iif eth0
      195.60.169.6 from 192.168.5.147 via 192.168.2.1 dev eth2 src 192.168.5.1
      cache mtu 1500 advmss 1460 hoplimit 128 iif eth0

我的案例中的路由应该对所有用户都相同。它应该始终通过相同的链接将数据包发送到同一目的地(即使源IP不同)。不是吗?

Q2 :有时我在外部接口的tcpdump中看到路由缓存已重新生成。这可以通过 ip r f t cache 强制执行。这有时会导致我的ping链接发生变化。但两台机器中的一台突然断开连接。从 tcpdump 我发现这是因为路由决定使用另一个链接,但MASQUERADE没有更新:

  

$ tcpdump -i eth1
      IP 192.168.2.254 > 195.60.1.1:ICMP回应请求,id 10677,seq 242,length 64
      IP 192.168.1.254> 195.60.1.1:ICMP echo请求,id 37387,seq 244,length 64       IP 195.60.1.1> 192.168.1.254:ICMP echo reply,id 37387,seq 244,length 64

第二个和第三个数据包是来自/到5.137的请求 - 回复

第一个数据包是来自.5.147的请求,由于MASQUERADE在路由缓存清除后没有更新,因此该接口上的错误的源地址 - 因此,没有回复,因为MASQUERADEd数据包的源地址是错的。

这是我的MASQUERADE设置

  

$ iptables -L -t nat
      Chain POSTROUTING(策略接受752K包,48M字节)
       pkts bytes target prot选择输出源目的地
      全部2840K 256M MASQUERADE - 任何eth1 192.168.5.0/24随时随地       2491K 229M MASQUERADE all - 任何eth2 192.168.5.0/24随时随地

我知道我可以使用conntrack标记数据包,但它有点复杂。我更愿意使用目标IP作为路由的关键。这种情况有什么问题?为什么路由缓存清除不通知NAT引擎有关路由的变化?

1 个答案:

答案 0 :(得分:3)

好的,终于找到了使用搜索引擎的答案。

这种特殊行为是Linux内核中至少自2005年以来就已知的错误.Julian Anastasov编写了一个补丁来解决此错误(请参阅http://www.ssi.bg/~ja/#routes

无论如何,发现所选择的具有负载平衡和NAT的方案并不好,因为它可能会破坏某些站点的授权,并且由于路由的重新调整导致Jabber和Skype闪烁,导致每个目的地的路由发生变化(从那以后)我们使用NAT,外部IP也发生了变化,Skype和其他服务认为您是从另一台计算机登录的。)

通过大型办公室共享多个链接的更好方法是按渠道分割用户。因此,我们为网络中的每台计算机分配了一个首选频道,如果该频道未启动,我们会为计算机选择任何其他频道。此策略为我们网络中的每台计算机保留相同的外部IP(NATing后)。设置首选渠道使我们能够通过更快的渠道发送关键员工,同时员工通过低cos宽但通道较慢的方式处理大文件。我们使用4个频道,因为我们地区的所有ISP每周至少下降2次,持续数小时。