http://www.linuxso.com/linuxpeixun/10332.html
先查看本机配置
- sudo iptables -L -n
如要重新配置,则先清除已有配置
- sudo iptables -F //清除预设表filter中的所有规则链的规则
- sudo iptables -X //清除预设表filter中使用者自定链中的规则
如果是远程通过ssh连接服务器进行配置,则先加入允许ssh的规则
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
设定预设规则,DROP掉INPUT链与FORWARD链
- sudo iptables -P INPUT DROP
- sudo iptables -P FORWARD DROP
INPUT链规则配置
允许来自于lo接口的数据访问本机
- sudo iptables -A INPUT -i lo -j ACCEPT
lo:loopback,回环接口,通常对应的IP地址为127.0.0.1(未开启之前,本机不能ping通本机)
允许icmp包通过,也就是允许ping
- sudo iptables -A INPUT -p icmp -j ACCEPT
开启web服务端口
- sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
FORWARD链规则配置
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
- sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
- sudo iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
- sudo iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个
- sudo iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
限制ICMP,允许每秒1个包,限制触发条件是10个包
- sudo iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
保存及调用
- iptables-save > /etc/iptables.rules (可能需要切换至root用户)
重启后会失效,重新调用配置
- sudo iptables-restore < /etc/iptables.rules
设置自动保存与调用
- sudo vim /etc/network/interfaces
在
- auto ath0
- iface ath0 inet dhcp
后面加上
- # Auto save and restore iptables rules
- pre-up iptables-restore < /etc/iptables.rules
- post-down iptables-save > /etc/iptables.rules
解决INPUT DROP后,引起sshd服务DNS反向解析不顺,从而导致登录等待时间过长的问题:
vim /etc/ssh/sshd_config
在最后添加下面一行,关闭 SSH 的 DNS 反解析
UseDNS no
重启sshd服务
sudo /etc/init.d/ssh restart
常见命令:
-A, --append 新增规则(追加方式)
-D, --delete 删除规则
-L, --list 列出某规则链中的所有规则 iptables -L INPUT
常见参数:
-p, --protocol 指定协议
-s --source 源地址
-d, --dst, --destination 指定目的地址
-i, --in-interface 指定入口网卡 iptables -A INPUT -i eth0 (-i eth+ 所有网卡)
--out-interface -o 指定出口网卡 iptables -A INPUT -o eth0 (-i eth+ 所有网卡)
--dport, --destination-port 目的端口
-j 指定对包的处理(ACCEPT、DROP、REJECT、REDIRECT)
-A:指定链名
-p:指定协议类型
-d:指定目标地址
--dport:指定目标端口(destination port 目的端口)
--sport:指定源端口(source port 源端口)
-j:指定动作类型
对于防火墙的设置,有两种策略:一种是全部通讯口都允许使用,只是阻止一些我们知道的不安全的或者容易被利用的口;另外一种,则是先屏蔽所有的通讯口,而只是允许我们需要使用的通讯端口。
- sudo iptables -P INPUT DROP //一旦执行,将马上阻断所有进站数据,远程配置时,注意顺序问题(ssh先加入允许)
- sudo iptables -P OUTPUT ACCEPT
- sudo iptables -P FORWARD DROP
注意-P中的P需要大写,表示Protocol。
可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过。
当超出了IPTABLES里filter表里的两个链规则(INPUT、FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃)。应该说这样配置是很安全的,我们要控制流入数据包。
而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在这个规则里的包怎么办呢,那就是通过。
为INPUT链添加规则
允许icmp包通过,也就是允许ping
允许loopback!(不然会导致DNS无法正常关闭等问题)
sudo iptables -A INPUT -i lo -p all -j ACCEPT
对于OUTPUT规则,因为预设的是ACCEPT,所以要添加DROP规则,减少不安全的端口链接。
- sudo iptables -A OUTPUT -p tcp --sport 31337 -j DROP
- sudo iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。
我们还可以把规则限制到只允许某个IP:
- sudo iptables -A INPUT -s 192.168.0.18 -p tcp --dport 22 -j ACCEPT
这表示只允许192.168.0.18的机器进行SSH连接。
如果要允许一个IP段,可以使用下面的写法:
- sudo iptables -A INPUT -s 192.168.0.1/255 -p tcp --dport 22 -j ACCEPT
这表示允许192.168.0.1/255IP段的机器进行连接。
但是,注意我们前面已经添加一条规则来允许所有IP连接22端口,需要把这条规则删除掉。
- sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
- sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
- sudo iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
- sudo iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个
- sudo iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包(在前面只允许ICMP包通过,在这里作限制)
- sudo iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
例如我给SSH加放行的语句:
添加input记录: iptables -A INPUT -p tcp --dport 22 -j ACCEPT
添加output记录: iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT