资源描述
iptables常见套路
【iptables filter表常见套路】
(注:以下的"[INPUT|FORWARD]"表示INPUT或者FORWARD)
#(1) 提高防火墙效率:已有连接直接放过(强制要求要有,而且必须放在最前面)
iptables -A [INPUT|FORWARD] -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#(2) 防攻击:NEW状态的新连接并且不带有syn位的tcp包,均认为是不合法的tcp请求,直接丢弃(建议要有)
#此条防攻击策略可有可无,因为安全是相对的,但是建议加上这条策略。
iptables -A [INPUT|FORWARD] -p tcp ! --syn -m state --state NEW -j DROP
#(3)访问控制:对访问防火墙本机或流经内网的数据只允许访问指定的端口(强制要求要有)
iptables -A [INPUT|FORWARD] -p tcp -m multiport --dport 22,80,443 -j ACCEPT
#(4)最后,设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT #注意OUTPUT这时是ACCEPT,即所有发出去的包全部放过,不做封禁。
###################################################################
【nat表常见套路】
# snat: 源地址转换,内网访问外网时
iptables -t nat -A POSTROUTING -o 外网网卡 -s 内网网段 -j SNAT --to 外网网卡ip
#或者使用MASQUEAGE让netfilter自己根据出口ip选源ip
iptables -t nat -A POSTROUTING -o 外网网卡 -s 内网网段 -j MASQUERADE
# dnat: 目标地址转换,外网访问内网服务器时
iptables -t nat -A PERROUTING -i外网网卡 -d 外网网卡ip -p tcp --dport 80 -j DNAT --to 内网服务器ip:80
###################################################################
【iptables策略保存及恢复】
Iptables-save > /etc/sysconfig/iptables
Iptables-restore < /etc/sysconfig/iptables
###################################################################
【内核参数调整】
vi /etc/sysctl.conf
#1,目的是为了增加TCP处理性能
net.ipv4.ip_forward=1
net.ipv4.ip_default_ttl=128
net.ipv4.icmp_echo_ignore_all=1
net.ipv4.icmp_echo_ignore_broadcasts
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_synack_retries=3
net.ipv4.tcp_fin_timeout=60
net.ipv4.tcp_max_syn_backlog=3200
sysctl -p 使刚刚修改的sysctl.conf配置生效
#2,目的是为了增加"状态跟踪"的内存缓冲区,进而增强防火墙处理性能。
(2.1)vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 655350
filter.ip_conntrack_tcp_timeout_established = 1800 #1800秒=30分钟
sysctl -p 使刚刚修改的sysctl.conf配置生效
(2.2)vi /etc/modprobe.conf
options ip_conntrackhashsize=1048576 #2的20次方
或者再命令行执行modprobeip_conntrackhashsize=1048576也可以,
###################################################################
下面看一个关于“状态跟踪”检测的故障分析:
[故障分析]
iptables开启状态跟踪后,导致一部分流量被拒绝。
[现象]
线上内核日志:/var/log/messages 打印:ip_conntrack: table full, dropping packet.
[原因]
由于iptables/netfilter使用了状态跟踪,这样会使用更多的内存,这条日志表示内存已经超过使用限制,
服务器开始丢弃多余的数据包,
[解决]
需要调大内存使用限制的参数,如下:
1, vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 655350
filter.ip_conntrack_tcp_timeout_established = 1800 #1800秒=30分钟
(连接跟踪表超时时间,通过测试这个参数的意义不大,和跟踪表自动清除的时间没有太大关系,但还是先减小,默认值是7天)
2, vi /etc/modprobe.conf
options ip_conntrackhashsize=1048576 #2的20次方
或者再命令行执行modprobeip_conntrackhashsize=1048576也可以
设置桶的数量。提高性能,可以减少内核遍历时间。
[结论]
这几个设置理由很简单,因为线上服务的流量可能很大,超出预期。
为了让iptalbes/netiflter发挥出最大的性能,给它多分配些内存空间,以防止流量太大,导致请求被拒绝。
展开阅读全文