基础网络升级(四)

其实到基础网络升级(三)应该就结束了,不过在使用过程中发现内网的路由之前规划的不是很好,老机房(192.168.10.0/24)的都是从一台 NAT 上出去,当时为了省事,把新机房(192.168.20.0/24, 192.168.30.0/24)的所有流量通过路由到了老机房,然后再从那台 NAT 出去。这样造成结果就是流量比较『混乱』,一个出口也同时存在 SPOF 的问题。比较好的方式还是老的不变,新的从新机房的 NAT 上出去,这样至少有两个出口,一个挂了还有挽救的措施 ;-)
要修改的地方不是很多,老机房的 NAT(192.168.10.254)、三层设备的路由不需要变。NAT 通过 MASQUERADE 的方式出去:
# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
MASQUERADE  all  —  0.0.0.0/0            0.0.0.0/0          

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

# cat /etc/iptables
-A POSTROUTING  -o eth0 -j MASQUERADE

老三层设备的静态路由信息,默认路由是指向 NAT 的 IP:
ip classless
ip route 0.0.0.0 0.0.0.0 192.168.10.254
ip route 192.168.20.0 255.255.255.0 192.168.1.2
ip route 192.168.30.0 255.255.255.0 192.168.1.2
no ip http server
ip http secure-server
!

新 NAT 机器(192.168.20.254):
# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
MASQUERADE  all  —  0.0.0.0/0            0.0.0.0/0          

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

# cat /etc/iptables
-A POSTROUTING -o em2 -j MASQUERADE

新三层设备,默认的路由指向新 NAT 设备:
ip classless
ip route 0.0.0.0 0.0.0.0 192.168.20.254
ip route 192.168.10.0 255.255.255.0 192.168.1.1
no ip http server
ip http secure-server
!

以上只是简化的模型,实际的比这个复杂些,不过思想不变。

通过 modprobe 彻底禁用 netfilter

要禁用 iptables 很简单,曲线救国,禁用掉模块就好了:
$ cat /etc/modprobe.d/blacklist-iptables.conf
alias ip_tables off

alias iptable off
alias iptable_nat off
alias iptable_filter off

alias nf_nat off
alias nf_conntrack_ipv4 off
alias nf_conntrack off
alias nf_defrag_ipv4 off

alias x_tables off

alias xt_limit off
alias xt_tcpudp off
alias xt_multiport off

alias ipt_REJECT off
alias ipt_LOG off

再启用上面的文件之前,记得先把 iptables 规则清空、rmmod 掉对应的模块。这也是另外一种防止 『dropping packet』 的方式。
netfilter 的模块在 /lib/modules/2.6.32-38-server/kernel/net/ipv4/netfilter/ 里面。
Continue reading

解决 nf_conntrack: table full, dropping packet 的几种思路

nf_conntrack 工作在 3 层,支持 IPv4 和 IPv6,而 ip_conntrack 只支持 IPv4。目前,大多的 ip_conntrack_* 已被 nf_conntrack_* 取代,很多 ip_conntrack_* 仅仅是个 alias,原先的 ip_conntrack 的 /proc/sys/net/ipv4/netfilter/ 依然存在,但是新的 nf_conntrack 在 /proc/sys/net/netfilter/ 中,这个应该是做个向下的兼容:
$ pwd
/proc/sys/net/ipv4/netfilter
$ ls
ip_conntrack_buckets          ip_conntrack_tcp_loose                ip_conntrack_tcp_timeout_syn_recv
ip_conntrack_checksum         ip_conntrack_tcp_max_retrans          ip_conntrack_tcp_timeout_syn_sent
ip_conntrack_count            ip_conntrack_tcp_timeout_close        ip_conntrack_tcp_timeout_syn_sent2
ip_conntrack_generic_timeout  ip_conntrack_tcp_timeout_close_wait   ip_conntrack_tcp_timeout_time_wait
ip_conntrack_icmp_timeout     ip_conntrack_tcp_timeout_established  ip_conntrack_udp_timeout
ip_conntrack_log_invalid      ip_conntrack_tcp_timeout_fin_wait     ip_conntrack_udp_timeout_stream
ip_conntrack_max              ip_conntrack_tcp_timeout_last_ack
ip_conntrack_tcp_be_liberal   ip_conntrack_tcp_timeout_max_retrans

$ pwd
/proc/sys/net/netfilter
$ ls
nf_conntrack_acct                  nf_conntrack_tcp_timeout_close
nf_conntrack_buckets               nf_conntrack_tcp_timeout_close_wait
nf_conntrack_checksum              nf_conntrack_tcp_timeout_established
nf_conntrack_count                 nf_conntrack_tcp_timeout_fin_wait
nf_conntrack_events                nf_conntrack_tcp_timeout_last_ack
nf_conntrack_events_retry_timeout  nf_conntrack_tcp_timeout_max_retrans
nf_conntrack_expect_max            nf_conntrack_tcp_timeout_syn_recv
nf_conntrack_generic_timeout       nf_conntrack_tcp_timeout_syn_sent
nf_conntrack_icmp_timeout          nf_conntrack_tcp_timeout_time_wait
nf_conntrack_log_invalid           nf_conntrack_tcp_timeout_unacknowledged
nf_conntrack_max                   nf_conntrack_udp_timeout
nf_conntrack_tcp_be_liberal        nf_conntrack_udp_timeout_stream
nf_conntrack_tcp_loose             nf_log/
conntrack_tcp_max_retrans
Continue reading

使用 iptables 限制网速

主要利用 limit 模块实现。 控制下载的速度:

# iptables -P FORWARD ACCEPT
# iptables -A FORWARD -m limit -d 10.18.101.0/24 --limit 600/sec -j ACCEPT
# iptables -A FORWARD -d 10.18.101.0/24 -j DROP

上面的 600 转化成速度的话,理论可以达到 900KB/s,实际测试下来偏差不大。
如果要控制上传速度,将 -d 改成 -s 即可。


实践下来,70 人的环境,会出现经常断网的情况,取消现象消失,怀疑是该模块导致,具体原因不明。