我的系统在同一接口上有两个不同的 IP 地址。两个 IP 连接到同一网络。其中之一设置为默认路由;这样做的副作用是,如果数据包通过非默认路由 IP 进入,则回复将通过默认路由接口发回。有办法解决这个问题吗?我期望响应是从与请求来源相同的 IP 地址发送的。
输出ip address
`5: eth-access: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 96:52:79:33:7a:90 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.12/28 scope global eth-access
valid_lft forever preferred_lft forever
inet 192.168.0.13/28 scope global secondary eth-access
valid_lft forever preferred_lft forever `
以下是使用错误源 IP 的 SNMP 请求详细信息。请求来自 IP“13”,但应答来自“12”:
17:55:24.692149 IP (tos 0x0, ttl 63, id 35960, offset 0, flags [DF], proto UDP (17), length 76)
192.168.0.116.55421 > 192.168.0.13.161: { SNMPv2c C="Test" { GetNextRequest(26) R=361171477 .1.3.6.1.2.1.1 } }
17:55:24.693519 IP (tos 0x0, ttl 64, id 22807, offset 0, flags [DF], proto UDP (17), length 133)
192.168.0.12.161 > 192.168.0.116.55421: { SNMPv2c C="Test" { GetResponse(83) R=361171477 .1.3.6.1.2.1.1.1.0="SunOS Node1 5.11 pn-tpOS-2.6.1-2060112460 i86pc" } }
为了解决这个问题,我为“13”ip 创建了单独的 ip 表。但它并没有解决问题。
echo 252 snmp >> /etc/iproute2/rt_tables
ip rule add from 192.168.0.13 table snmp
ip route add default via 1192.168.0.1 dev eth-access src 192.168.0.13 table snmp
ip route add 192.168.0.0/28 dev eth-access src 192.168.0.13 table snmp
这是系统的输出:
# ip rule list
0: from all lookup local
32765: from 192.168.0.13 lookup snmp
32766: from all lookup main
32767: from all lookup default
# ip route list table snmp
default via 192.168.0.1 dev eth-access src 192.168.0.13
192.168.0.0/28 dev eth-access scope link src 192.168.0.13
有什么方法可以确保使用与请求中相同的源 IP 地址。如果我们在一个接口上有来自同一子网的两个 IP。
编辑:为了澄清:我需要确保该服务器使用与请求的目标 IP 相同的源 IP 来回复请求。即,如果请求来自目标 IP 192.168.0.13,则响应应为源 IP 192.168.0.13。当前,当请求来自 IP 地址 192.168.0.13 时,对 SNMP 请求的响应将使用 IP 地址 192.168.0.12 作为源 IP。
编辑:解决方案最后,我意识到我正在执行此测试的工具能够接受此响应。为了进行测试,我使用来自另一台服务器的 SNMPwalk 命令,该服务器不接受响应。 (我假设是因为源地址不同)。但实际的 SNMP 工具似乎更慷慨,并且在我这边接受了响应,没有进行任何更改。我不确定这是如何工作的,但想分享一下。感谢大家的帮助。