我在 ec2 Linux 服务器中有 2 个网络接口 (eth0 eth1)。配置第二个 NI (eth1) 后,我能够从 eth0 和 eth1 ping 两个公共 IP,以便通过 SSH 进行连接。
现在,我的想法是轮换所有传出数据包的两个网卡上的 IP。我曾经使用以下方法实现了类似的效果:在一个网卡下拥有多个 IPiptables使用这个脚本:
ip_list="xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy"
dest_port="443"
interface="eth0"
i=`echo $ip_list |wc -w`
for each in $lista; do
/sbin/iptables -t nat -A POSTROUTING -m state --state NEW -p tcp --dport $dest_port -o $interface -m statistic --mode nth --every $i --packet 0 -j SNAT --to-source $each
i=$((i-1))
done
但是对于 2 个 NIC,我不知道如何实现同样的效果...我尝试更改 $interface 以将它们切换到 eth0 和 eth1,但没有任何效果。无论我如何尝试,数据包总是从 eth0 发送至相同的公共 IP 地址。
这是有关我配置的第二个 NIC 的设置的附加信息,因为我猜测问题可能出在这里:
# ifconfig
eth0 Link encap:Ethernet HWaddr 06:90:23:13:e8:22
inet addr:172.31.21.40 Bcast:172.31.31.255 Mask:255.255.240.0
inet6 addr: fe80::490:23ff:fe13:e822/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:2818 errors:0 dropped:0 overruns:0 frame:0
TX packets:2326 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:327725 (327.7 KB) TX bytes:594758 (594.7 KB)
eth1 Link encap:Ethernet HWaddr 06:00:2e:05:47:ca
inet addr:172.31.26.216 Bcast:172.31.31.255 Mask:255.255.240.0
inet6 addr: fe80::400:2eff:fe05:47ca/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:1030 errors:0 dropped:0 overruns:0 frame:0
TX packets:935 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:85024 (85.0 KB) TX bytes:165754 (165.7 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:942 errors:0 dropped:0 overruns:0 frame:0
TX packets:942 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:323801 (323.8 KB) TX bytes:323801 (323.8 KB)
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.31.16.1 0.0.0.0 UG 0 0 0 eth0
172.31.16.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
172.31.16.0 0.0.0.0 255.255.240.0 U 0 0 0 eth1
# ip route show table 2
default via 172.31.16.1 dev eth1
# cat /proc/sys/net/ipv4/ip_forward
1
有什么想法我该如何处理这个问题吗?!
PD:我对网络还很陌生,所以请对我宽容一点……
答案1
DNAT 发生在 POSTROUTING 链中,即在 Linux 做出路由决定之后。Linux 通过查找路由表选择下一跳条目来选择 IP 数据包的传出接口。
这意味着,当数据包进入 POSTROUTING 链时,已经选择了用于传出数据包的接口。DNAT 规则不能与未绑定到传出数据包接口的 IP 地址一起使用。这就是为什么您的数据包将具有原始接口 IP 地址的原因。
要真正获得您想要的行为,您需要以某种方式改变路由决策,让 Linux 使用另一个接口。策略路由是用于改变 Linux 默认路由行为的机制。
但是,我不知道是否可以用它实现这种“每个传出 TCP 连接使用不同的接口”。这需要 TCP 连接状态跟踪,以确保单个 TCP 连接始终使用相同的传出接口。即使可以实现,也需要付出很多努力,并且需要对 TCP/IP 网络有很好的理解。