Chion82 / netfilter-full-cone-nat

A kernel module to turn MASQUERADE into full cone SNAT
GNU General Public License v2.0
427 stars 121 forks source link

nf_conntrack: table full, dropping packet #7

Closed ZhYuLn closed 6 years ago

ZhYuLn commented 6 years ago

@Chion82 您好,我发现我在使用fullconenat模块的时候,系统在运行一段时间之后会在内核提示nf_conntrack: table full, dropping packet,我只对了系统的udp数据做cone nat,请问下这个可以用什么方式来避免

Chion82 commented 6 years ago

试试加大内核参数 net.ipv4.netfilter.ip_conntrack_max ,如果不能解决,贴一下 iptables 的规则

ZhYuLn commented 6 years ago

@Chion82 加大内核的conntrack_max之后能够暂时解决这个问题,不过conntrack释放不了的话count还是会一直增加; 以下是我的iptables规则: iptables -t nat -A PREROUTING -i eth0 -p udp -j FULLCONENAT iptables -t nat -A POSTROUTING -o eth0 ! -p udp -j MASQUERADE iptables -t nat -A POSTROUTING -o eth0 -p udp -j FULLCONENAT

Chion82 commented 6 years ago

conntrack是可以超时自动释放的,本模块不会干预内核默认的conntrack gc行为。你的iptables规则看上去没有问题。再试试检查这两个内核参数: net.ipv4.netfilter.ip_conntrack_tcp_timeout_established net.netfilter.nf_conntrack_generic_timeout

ZhYuLn commented 6 years ago

@Chion82 我是ubuntu 14.04,只有net.netfilter.nf_conntrack_tcp_timeout_established这个参数,没有找到net.ipv4.netfilter.ip_conntrack_tcp_timeout_established。 参数值为: net.netfilter.nf_conntrack_tcp_timeout_established = 600 (这个参数第一次为默认的43200,后面table full 之后我修改为600,不过还是出现table full的现象) net.netfilter.nf_conntrack_generic_timeout = 600

ZhYuLn commented 6 years ago

我尝试过在使用fullconenat时,让hping3遍历65535个端口去建立连接,在nf_conntrack_count达到65535后,等待连接数释放,最后看到大约释放到剩下12500时就不再释放了。

Chion82 commented 6 years ago

@ZhYuLn 贴一下这个的输出:

sysctl -a | grep conntrack | grep timeout

iptables 在filter、mangle和raw表还有没有其他规则? 另外通过 conntrack -L 看一下滞留的conntrack是什么。

ZhYuLn commented 6 years ago

@Chion82 以下是我测试完后的conntrack_count以及 conntrack -L的信息:

git

我隔段时间会再次查看conntrack,就截图中的数量不再往下降了。conntrack -L里面我看不到由hping3发起的udp conntrack。

以下是我sysctl -a后的参数信息: net.netfilter.nf_conntrack_events_retry_timeout = 15 net.netfilter.nf_conntrack_generic_timeout = 600 net.netfilter.nf_conntrack_icmp_timeout = 30 net.netfilter.nf_conntrack_tcp_timeout_close = 10 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_established = 600 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30 net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300 net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60 net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300 net.netfilter.nf_conntrack_udp_timeout = 30 net.netfilter.nf_conntrack_udp_timeout_stream = 180

Chion82 commented 6 years ago

@ZhYuLn 问题定位到了。本模块中调用 nf_conntrack_find_get() 时会增加 conntrack 的引用计数,而没有及时释放引用计数所致。这个问题已经修复了,请拉取最新代码重新编译。

ZhYuLn commented 6 years ago

@Chion82 嗯嗯,非常感谢您这么快速的更新。我重新编译下,测试完后结果如何再反馈给您。

ZhYuLn commented 6 years ago

@Chion82 您好,我这边再次使用同样的方法来测试,能够很完美的释放掉连接数了。对了,冒昧问下作者,关于nat的您后面是否会增加HAIRPIN模块呢。

Chion82 commented 6 years ago

@ZhYuLn hairpin nat正在整合到本模块中,之后会提供配置说明。

ZhYuLn commented 6 years ago

@Chion82 嗯嗯,非常期待您的新模块