我们正在使用由 iptables 制作的 NAT。但是,当有大量通过 NAT 服务器的连接(或会话)时,包开始丢失。syslog 等中没有日志。我认为这是由 sysctl 配置引起的,但我不知道如何修复或增加允许的连接数量。
编辑:对于没有提供更多信息深表歉意。所以信息如下;
NAT 基于 64 位 Ubuntu 12.04 LTS。在 NAT 服务器上有两个接口,一个有公共 IP,一个有本地 IP。本地 IP 子网为 255.255.0.0。
编辑 2:关于“很多”:我真的不知道有多少,但我知道它是 Ubuntu 的库存版本。我的意思是我们还没有调整任何东西。
谢谢
您没有告知“大量”连接是什么,也没有向我们提供硬件详细信息,因此很难提供明确的答案。
您可能会遇到 NAT 的硬限制,因为端口数量有限(大约 64k),并且每个连接在 Linux 实现上都需要自己的端口。您可以通过使用多个 IP 地址来缓解/克服这个问题(不确定这是否适合您),或者如果很多连接都是 HTTP,则可以使用透明代理)
另外,“服务器包”是什么意思?如果您的意思是“数据包”,您可能会发现该限制不是 NAT 限制,而是您的 Internet 连接大小的限制或连接的路由器可以处理的数据包数量的限制。[更多细节在这里也可能对我们有所帮助]
你没有说你在哪个系统上运行 iptables。
如果您使用的是 FreeBSD,它会将网络包存储在 mbuf 集群中。
您可以使用以下命令调整 mbuf 集群的数量:sysctl kern.ipc.nmbclusters=65536
通过将其设置为 65000,您将使用 144 MB 内存,如果不调整地址空间,则不应超过该内存。
那么这就打开了内核中地址空间的问题。在 i386 上,内核内存设置为 1Gb。您可以在内核配置文件中将其增加到 2 Gb:
在 amd64 上,默认值为 2 Gb,并且不可调整。
您可以增加在 /boot/loader.conf 中设置的物理内存量(默认 320 Mb)
以上是 Igor Sysoev 优秀报告的总结,可以在这里找到:http ://rerepi.wordpress.com/2008/04/19/tuning-freebsd-sysoev-rit/
您将在 64k 端口限制之前达到上述限制。如果您的服务器是一个非常繁忙的防火墙,这并非不可能。如果您正在运行 Linux,则可能适用类似的调整。
第一个答案与 FreeBSD 有关。问题相同,但 Ubuntu 上的参数不同:
Stock Ubuntu 有很长的路要走。当您开始调整这些参数时,您可能会引入比您修复的问题更多的问题。由于缺乏信息,您给我的建议是在您更好地了解网络部分之前不要触摸这些参数。如果您确实对其中一些参数有疑问,您通常会在内核日志中获得条目。
NAT 后面只有 600 条规则的 300 台服务器并不是一个庞大的数字。如果它们只是一堆进出流量很小的服务器,那么这应该是在公园里散步。如果任何服务器正在处理大量的入站或出站流量,那么事情很快就会变糟。
首先要解决的问题是“手数”是多少。到目前为止,您显示的数字并不可怕。在开始使用 sysctl 调整网络堆栈之前,您应该真正确认您的数字很大。对此要非常小心。
要通过该框查看是否有大量并发连接,您可以执行以下操作:
或者要获得更多统计数据,您可以执行
netstat -s
(Linux) 或netstat -m
(FreeBSD)。这将告诉您当前使用的数字。有了这些信息,您就可以决定是否需要调整。繁忙的 NAT 最常见的问题是
net.ipv4.netfilter.ip_conntrack_max
它控制了您跟踪的连接数。您可以通过以下方式查看跟踪表中有多少条目:检查您设置的当前最大值:
AFAIK 默认值为 65536。只要您有内存,您可以根据需要增加此数字。
davidgo 提到了 64K 端口。您可以使用以下命令检查已配置的临时端口的数量:
也许你需要在这里增加端口的数量。
知道您丢弃关闭套接字的速度有多快很有趣。这可能会留下挂起的套接字,并且在繁忙的服务器上您希望更快地释放它们:
您可以通过将 thie 值减少到大约 10 秒的 25 来更快地释放端口。
这通常是要调整的 - 但还有其他相关的:
sysctl
您可以使用命令或编辑设置所有参数/etc/sysctl.conf
您的结果可能会有所不同,但为了让您了解以下数字是在相当繁忙的服务器上设置的: