AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 608068
Accepted
Harun Baris Bulut
Harun Baris Bulut
Asked: 2014-06-27 02:08:59 +0800 CST2014-06-27 02:08:59 +0800 CST 2014-06-27 02:08:59 +0800 CST

使用 iptables NAT 时包丢失

  • 772

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

编辑:对于没有提供更多信息深表歉意。所以信息如下;

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

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

谢谢

iptables
  • 3 3 个回答
  • 1390 Views

3 个回答

  • Voted
  1. davidgo
    2014-06-27T03:30:33+08:002014-06-27T03:30:33+08:00

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

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

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

    • 1
  2. Claus Andersen
    2014-06-27T03:48:46+08:002014-06-27T03:48:46+08:00

    你没有说你在哪个系统上运行 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,则可能适用类似的调整。

    • 1
  3. Best Answer
    Claus Andersen
    2014-07-03T01:58:14+08:002014-07-03T01:58:14+08:00

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

    Stock Ubuntu 有很长的路要走。当您开始调整这些参数时,您可能会引入比您修复的问题更多的问题。由于缺乏信息,您给我的建议是在您更好地了解网络部分之前不要触摸这些参数。如果您确实对其中一些参数有疑问,您通常会在内核日志中获得条目。

    NAT 后面只有 600 条规则的 300 台服务器并不是一个庞大的数字。如果它们只是一堆进出流量很小的服务器,那么这应该是在公园里散步。如果任何服务器正在处理大量的入站或出站流量,那么事情很快就会变糟。

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

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

    wc -l /proc/net/tcp
    

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

    繁忙的 NAT 最常见的问题是net.ipv4.netfilter.ip_conntrack_max它控制了您跟踪的连接数。您可以通过以下方式查看跟踪表中有多少条目:

    sysctl net.netfilter.nf_conntrack_count
    

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

    sysctl net.ipv4.netfilter.ip_conntrack_max
    

    AFAIK 默认值为 65536。只要您有内存,您可以根据需要增加此数字。

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

    sysctl net.ipv4.ip_local_port_range
    

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

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

    sysctl net.ipv4.tcp_fin_timeout
    

    您可以通过将 thie 值减少到大约 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
    
    • 1

相关问题

  • OpenVPN 的 Linux IP 转发 - 正确的防火墙设置?

  • iptables 单个规则中的多个源 IP

  • 存储 iptables 规则的规范方法是什么

  • 使用 iptables 和 dhcpd 进行端口转发

  • 根据 Apache 日志数据自动修改 iptables 以阻止行为不良的客户端

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve