使用 iptables NAT 时软件包丢失

使用 iptables NAT 时软件包丢失

我们正在使用由 iptables 创建的 NAT。但是,当通过 NAT 服务器的连接(或会话)很多时,数据包开始丢失。系统日志等中没有日志。我认为这是由 sysctl 配置引起的,但我不知道如何修复或增加允许的连接数量。

编辑:非常抱歉没有提供更多信息。因此信息如下;

NAT 基于 64 位 Ubuntu 12.04 LTS。NAT 服务器上有两个接口,一个有公共 IP,一个有本地 IP。本地 IP 子网为 255.255.0.0。

编辑 2:关于“很多”:我真的不知道有多少,但我知道这是 Ubuntu 的原始版本。我的意思是我们还没有调整任何东西。

谢谢

答案1

第一个答案与 FreeBSD 有关。问题相同,但 Ubuntu 上的参数不同:

原版 Ubuntu 可以走很长一段路。当您开始调整这些参数时,您可能会引入比您修复的更多的问题。由于您提供的信息不足,我的建议是,在您更好地了解网络部分之前,不要触碰这些参数。如果您真的遇到其中一些参数的问题,您通常会在内核日志中看到条目。

300 台服务器位于只有 600 条规则的 NAT 后面,这不是一个很大的数字。如果它们只是一堆服务器,并且几乎没有入站和出站流量,那么这应该是小菜一碟。如果任何服务器的入站或出站流量很大,那么情况很快就会变糟。

首先要解决的问题是“很多”是多少。到目前为止,您显示的数字并不可怕。在开始使用 sysctl 调整网络堆栈之前,您应该真正确认您拥有大数字。对此要非常非常小心。

要查看是否有大量通过该框的并发连接,您可以执行以下操作:

wc -l /proc/net/tcp

netstat -s或者,您可以执行(Linux) 或(FreeBSD)来获取更多统计数据netstat -m。这将告诉您当前使用的数字。掌握这些信息后,您就可以决定是否需要进行调整。

繁忙的 NAT 最常见的问题是net.ipv4.netfilter.ip_conntrack_max控制跟踪的连接数。您可以使用以下命令查看跟踪表中有多少条目:

sysctl net.netfilter.nf_conntrack_count

检查您当前设置的最大值:

sysctl net.ipv4.netfilter.ip_conntrack_max

据我所知,默认值为 65536。只要您有内存,您可以根据需要增加这个数字。

davidgo 提到了 64K 个端口。您可以使用以下命令检查已配置的临时端口数量:

sysctl net.ipv4.ip_local_port_range

也许您需要在这里增加端口数量。

了解您放弃关闭套接字的速度有多快是很有趣的。这可能会留下挂起的套接字,在繁忙的服务器上,您希望更快地释放它们:

sysctl net.ipv4.tcp_fin_timeout

您可以通过将该值减少到 25 秒或者大约 10 秒来更快地释放端口。

这通常是需要调整的 - 但也有其他相关的:

sysctl -a | grep conntrack | grep timeout

您可以使用sysctl命令或编辑设置所有参数/etc/sysctl.conf

您的结果可能会有所不同,但为了让您了解,下面的数字是在一个相当繁忙的服务器上设置的:

net.ipv4.netfilter.ip_conntrack_max                     = 196608
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 86400

net.ipv4.tcp_tw_recycle                                 = 0
net.ipv4.tcp_tw_reuse                                   = 0
net.ipv4.tcp_orphan_retries                             = 1
net.ipv4.tcp_fin_timeout                                = 10
net.ipv4.tcp_max_orphans                                = 8192

net.ipv4.ip_local_port_range                            = 32768    61000

答案2

您没有告诉我们“大量”连接是什么,也没有向我们提供硬件详细信息,因此很难提供明确的答案。

您可能遇到了 NAT 的硬限制,因为端口数量有限(约 64k),而且在 Linux 实现中每个连接都需要自己的端口。您可以通过使用多个 IP 地址(不确定这是否适合您)来缓解/克服这个问题,或者如果许多连接都是 HTTP,则可以使用透明代理)

另外,您说的“服务器包”是什么意思?如果您指的是“数据包”,您可能会发现限制不是 NAT 限制,而是您的 Internet 连接大小的限制或连接的路由器可以处理的数据包数量的限制。[更多详细信息可能也会对我们有所帮助]

答案3

您没有说在哪个系统上运行 iptables。

如果您使用 FreeBSD,它会将网络包存储在 mbuf 集群中。

您可以使用以下命令调整 mbuf 集群的数量:sysctl kern.ipc.nmbclusters=65536

通过将其设置为 65000,您将使用 144 MB 的内存,并且在不调整地址空间的情况下,您不应该超过该值。

然后这就引出了内核地址空间的问题。在 i386 上,内核内存设置为 1Gb。您可以在内核配置文件中将其增加到 2 Gb:

options KVA_PAGES=512

在 amd64 上默认值为 2 Gb 并且不可调。

您可以增加 /boot/loader.conf 中设置的物理内存量(默认 320 Mb)

vm.kmem_size=1G

以上是 Igor Sysoev 的出色报告的摘要,可在此处找到:http://rerepi.wordpress.com/2008/04/19/tuning-freebsd-sysoev-rit/

您将在达到 64k 端口限制之前达到上述限制。如果您的服务器的防火墙非常繁忙,这种情况并非不可能。如果您运行的是 Linux,则可能适用类似的调整。

相关内容