我们使用iptables做NAT。 但是,当有很多连接(或会话)通过NAT服务器包开始下降。 没有日志syslog等。我认为这是由sysctlconfiguration引起的,但我不知道如何修复或增加允许的连接数量。
编辑:深感抱歉没有提供额外的信息。 所以信息如下。
NAT基于64位Ubuntu 12.04 LTS。 在NAT服务器上有两个接口,一个是公网IP,一个是本地IP。 本地IP子网是255.255.0.0。
编辑2:关于“多”:我真的不知道多less,但我知道这是一个股票版本的Ubuntu。 我的意思是我们还没有调整任何东西。
谢谢
第一个答案与FreeBSD有关。 问题是相同的,但在Ubuntu上的参数是不同的:
股票Ubuntu有很长的路要走。 当你开始调整这些参数时,你可能会引入比你修复更多的问题。 从缺乏信息你给我的build议,将不会触及这些参数,直到你了解networking部分好一点。 如果你确实遇到了这些参数的问题,你通常会在你的内核日志中获得条目。
只有600条规则的NAT后面的300个服务器不是huges数字。 如果他们只是一小群入站和出站stream量的服务器,这应该是在公园散步。 如果任何一台服务器的入站或出站stream量很大,那么情况就会变得很糟糕。
要解决的第一个问题是“多less”是多less。 你到目前为止显示的数字是不可怕的。 在开始使用sysctl调整你的networking堆栈之前,你应该确认你有大数字。 对此非常非常小心。
要查看你是否有大量的并发连接,你可以做一个:
wc -l /proc/net/tcp
或者为了得到更多的统计数据,你可以使用netstat -s (Linux)或者netstat -m (FreeBSD)。 这会告诉你当前使用的数字。 有了这些信息,你可以决定是否需要调整。
繁忙的NAT最常见的问题是net.ipv4.netfilter.ip_conntrack_maxpipe辖你跟踪多less连接。 您可以看到跟踪表中有多less个条目:
sysctl net.netfilter.nf_conntrack_count
检查您设置的当前最大值:
sysctl net.ipv4.netfilter.ip_conntrack_max
AFAIK默认值是65536.只要您有内存,您可以根据需要增加此数字。
davidgo提到64K端口。 您可以使用以下命令检查configuration的临时端口的数量:
sysctl net.ipv4.ip_local_port_range
也许你需要增加这里的端口数量。
知道多快放弃closures套接字是很有趣的。 这样可以让挂起的sockets和一个忙碌的服务器上你想要更快地释放它们:
sysctl net.ipv4.tcp_fin_timeout
你可以快速释放端口,通过将thie值减less到大约10秒的25。
这通常是调整 – 但也有其他相关的:
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
你不知道你在哪个系统上运行iptables。
如果您使用的是FreeBSD,它会将networking包存储在mbuf集群中。
你可以调整mbuf集群的数量:sysctl kern.ipc.nmbclusters = 65536
通过将其设置为65000,您将使用144 MB的内存,如果不调整地址空间,则不应高于此值。
那么这就打开了内核中地址空间的问题。 在i386上,内核内存被设置为1Gb。 你可以在内核configuration文件中增加到2Gb:
options KVA_PAGES=512
在amd64上,默认值是2 Gb,不可调整。
您可以增加/boot/loader.conf中设置的物理内存量(默认320 Mb)
vm.kmem_size=1G
以上是Igor Sysoev的优秀报告摘要,可以在这里find: http : //rerepi.wordpress.com/2008/04/19/tuning-freebsd-sysoev-rit/
您将在64k端口限制之前达到上述限制。 如果你的服务器是一个非常繁忙的防火墙,不是不可能的。 如果您正在运行Linux,可能会应用类似的调整。
你还没有告知连接是多less,也没有提供硬件细节,所以很难提供明确的答案。
尽pipe有限的数量(大约64k)的端口,但是每个连接都需要在Linux实现上使用自己的端口,所以可能会遇到硬NAT限制。 您可以通过使用多个IP地址(不确定这是否是您的选项),或者如果很多连接是HTTP,使用透明代理来缓解/克服此问题)
另外,“服务器包”是什么意思? 如果您的意思是“数据包”,您可能会发现该限制不是NAT限制,而可能是Internet连接大小的限制或连接路由器可以处理的数据包数量的限制。 [更多细节也可以在这里帮助我们]