iptables 配置以及使用伪装时由于缺少端口而丢弃的软件包的日志记录

iptables 配置以及使用伪装时由于缺少端口而丢弃的软件包的日志记录

我正在设置 iptables 以对服务器集群中的多个主机进行网络地址转换。通常会有来自多个服务器的连接突发到单个系统。需要进行网络地址转换,以便接收方可以将请求的来源列入白名单。配置非常简单:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

由于消息的突发,我担心到单个目的地的打开连接数(或在很短的时间内的连接)会引发这样的问题:nat 主机上没有更多端口可用于打开到单个目标系统的连接。

  1. 当这种情况发生时,有没有办法记录消息?

  2. 如果发生这种情况,在设置这样的帖子路由表日志记录时,有没有办法识别它?

iptables -t nat -I POSTROUTING -j LOG
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
421K   25M LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4
603K   36M MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0
  1. 是否可以通过添加多个静态 IP 地址并使用 SNAT 而不是如下伪装来避免丢弃数据包?
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4,1.2.3.5,9.8.7.6

非常感谢您的帮助。

答案1

这里有2个可能的问题:

  1. 连接发起方是否会耗尽源端口?
  2. NAT 设备是否会填满其连接跟踪表?

在这两种情况下,重要的是要注意一个 TCP 连接与另一个 TCP 连接的区别,所有:

  • 源 IP 地址
  • 源端口
  • 目标 IP 地址
  • 目的港

当 Linux 计算机发起 TCP 连接时,它会从 sysctl 中给出的端口范围中选择一个本地端口net.ipv4.ip_local_port_range(这也适用于 IPv6 TCP 连接)。默认情况下,该端口为32000 61999,这意味着该计算机可以与任何特定目标主机和端口组合建立 28232 个同时 TCP 连接。您不太可能需要提高该端口,但如果有必要,您可以将其设置为其限制1024 65535,从而提供 64512 个可能的同时连接。

[root@mistfall ~]# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768    60999
[root@mistfall ~]# sysctl -w net.ipv4.ip_local_port_range="1024 65535"
net.ipv4.ip_local_port_range = 1024 65535

对于 NAT 设备,它会保留一个连接跟踪表,用于跟踪每个连接的原始地址和端口以及 NAT 后的地址和端口。此表的默认大小取决于系统的 RAM 大小。检查 sysctlnet.netfilter.nf_conntrack_max以了解系统上的设置。

[root@mistfall ~]# sysctl net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_max = 262144

如果需要提高它,您还应该提高 conntrack 表哈希大小,这是一个哈希表,可加快对 conntrack 表的查找速度。这里的经验法则是它应该是 2 的幂,即上面设置的 conntrack 表大小的 1/4。这设置为模块选项,因此您需要将其放在文件中,例如/etc/modprobe.d/nf_conntrack.conf。例如,如果您设置net.netfilter.nf_conntrack_max为 524288,您还将设置:

options nf_conntrack expect_hashsize=131072 hashsize=131072

您可以在只读 sysctl 中检查 conntrack 表的当前大小net.netfilter.nf_conntrack_count

[root@localhost ~]# sysctl net.netfilter.nf_conntrack_count
net.netfilter.nf_conntrack_count = 3635

请注意,如果您使用的是 MASQUERADE/SNAT,那么您还需要担心 NAT 设备在连接到目标时会耗尽源端口。最好尽可能避免使用 NAT,不仅在这里,而且在任何地方(而且您似乎不太可能在这里真正需要 NAT;您正在用防火墙规则的小小不便来换取大问题)。您应该非常认真地考虑完全摆脱 NAT 并使用正常路由。

相关内容