iptables学习笔记(3)
上两篇文章简单的介绍了下iptables的相关概念以及数据包在iptables中的处理规则。本篇blog将正式介绍下说了这么久的iptables的使用及其编写规则。
一、iptables的命令格式
[-t 表名]
:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
-A
:新增一条规则,到该规则链列表的最后一行
-I
:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1
-D
:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除
-R
:替换某条规则,规则替换不会改变顺序,而且必须指定编号。
-P
:设置某条规则链的默认动作
-nL
:-L
、-n
,查看当前运行的防火墙规则列表
chain名
:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
[规则编号]
:插入、删除、替换规则时用,--line-numbers
显示号码
[-i|o 网卡名称]
:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出
[-p 协议类型]
:可以指定规则应用的协议,包含tcp、udp和icmp等
[-s 源IP地址]
:源主机的IP地址或子网地址
[--sport 源端口号]
:数据包的IP的源端口号
[-d目标IP地址]
:目标主机的IP地址或子网地址
[--dport目标端口号]
:数据包的IP的目标端口号
-m
:extend matches,这个选项用于提供更多的匹配参数,如:
-m state –state ESTABLISHED,RELATED
-m tcp –dport 22
-m multiport –dports 80,8080
-m icmp –icmp-type 8
<-j 动作>
:处理数据包的动作,包括ACCEPT、DROP、REJECT等
二、基本操作规则
1. iptables -nL 查看本机关于iptables的设置情况,默认查看的是-t filter,可以指定-t nat
iptables -L 尽可能地以易读的形式显示当前正在使用的规则集。
2. iptables-save > iptables.rule
保存当前的防火墙规则设置,它把规则集保存到一个特殊格式的文本文件里命令行中。当主机重启时这些iptables配置的规则将会失效,当然这也是为了防止错误的配置防火墙。默认读取和保存的配置文件地址为/etc/sysconfig/iptables
。另一个命令是iptables-restore,它是用来把这个文件重新装入内核空间的。
使用iptables-save和iptables-restore的一个最重要的 原因是,它们能在相当程度上提高装载、保存规则的速度。使用脚本更改规则的问题是,改动每个规则都要 调运命令iptables,而每一次调用iptables,它首先要把Netfilter内核空间中的整个规则集都提取出来, 然后再插入或附加,或做其他的改动,最后,再把新的规则集从它的内存空间插入到内核空间中。这会花费很多时间。
这两个命令最好的地方在于 一次调用就可以装载和保存规则集,而不象脚本中每个规则都要调用一次iptables。 iptables-save运行一次就可以把整个规则集从内核里提取出来,并保存到文件里,而iptables-restore每次装入一个规则表。换句话说,对于一个很大的规则集,如果用脚 本来设置,那这些规则就会反反复复地被卸载、安装很多次,而我们现在可以把整个规则集一次就保存下 来,安装时则是一次一个表,这可是节省了大量的时间。
3. 清空iptables规则
如想删除INPUT链的第10条规则,可以使用 iptables -D INPUT 10
对于需要清空整个链,使用选项-F 如,清空整个 INPUT链,使用的命令就是iptables -F INPUT
对于重置策略,先执行:/sbin/iptables -P INPUT ACCEPT ;再执行 /sbin/iptables -F
4. 显示当前所有被跟踪的连接
cat /proc/net/ip_conntrack | less
5. 2.设置chain策略
对于filter table,默认的chain策略为ACCEPT,我们可以通过以下命令修改chain的策略:
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP
以上命令配置将接收、转发和发出包均丢弃,施行比较严格的包管理。由于接收和发包均被设置为丢弃,当进一步配置其他规则的时候,需要注意针对INPUT和OUTPUT分别配置。当然,如果信任本机器往外发包,以上第三条规则可不必配置。
三、常见配置情形
1. 端口转发
首先要开启端口转发器必须先修改内核运行参数ip_forward,打开转发:
# echo 1 > /proc/sys/net/ipv4/ip_forward //此方法临时生效,需永久生效可修改/etc/sysctl.conf文件
开启本机端口转发:
# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
根据上一篇blog文《iptables学习笔记(2)》可知,实际上在数据包进入INPUT链之前,修改了目标地址(端口),于是不难理解在开放端口时需要设置的是放行8080端口,无需考虑80:
# iptables -A INPUT -s 172.29.88.0/24 -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
此时当外部访问80端口便自动转到8080(浏览器地址栏上不会改变),而且又具有很高的性能。
2. 日志记录
为22端口的INPUT包增加日志功能,插在input的第1个规则前面,为避免日志信息塞满/var/log/message
,用--limit
限制:
iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG
编辑日志配置文件/etc/rsyslog.conf
,添加kern.=notice /var/log/iptables.log
,可以将日志记录到自定义的文件中。
配置好之后重启日志服务:service rsyslog restart
3. 禁止访问某ip/域名
【例1】 iptables -I FORWARD -d www.ooxx.com -j DROP #禁止访问域名www.ooxx.com 【例2】 iptables -I FORWARD -d 20.20.20.20 -j DROP #禁止访问IP地址20.20.20.20
4. 禁止某客户机上网
【例1】 iptables -I FORWARD -s 192.168.1.X -j DROP #禁止IP地址为192.168.1.X的客户机上网 【例2】 iptables -I FORWARD -s 192.168.1.0/24 -j DROP #禁止192.168.1.0子网里所有的客户机上网
5. 端口映射
#将WAN 口NAT到PC
iptables -t nat -A PREROUTING -i $INTERNET_IF -d $INTERNET_ADDR -j DNAT –to-destination 192.168.0.1
#将WAN口81端口NAT到192.168.1.2的80端口
iptables -t nat -A PREROUTING -p tcp --dport 81 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.1.2:80
6. 屏蔽指定ip
有时候我们发现某个ip不停的往服务器发包,这时我们可以使用以下命令,将指定ip发来的包丢弃:
iptables -A INPUT -i eth0 -p tcp -s xx.xx.xx.xx -j DROP
以上命令设置将由xx.xx.xx.xx ip发往eth0网口的tcp包丢弃。
7. 应用服务配置
设置只能由指定的网段、指定的网口连接本机SSH服务:
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLESHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
若要支持由本机通过SSH连接其他机器,由于在本机端口建立连接,因而还需要设置以下规则:
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state ESTABLESHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
类似的,对于HTTP/HTTPS(80/443)、pop3(110)、rsync(873)、MySQL(3306)等基于tcp连接的服务,也可以参照上述命令配置。
8. 抵御DDOS攻击
SYN洪水是攻击者发送海量的SYN请求到目标服务器上的一种DoS攻击方法,下面的脚本用于预防轻量级的DoS攻击:
iptables -N syn-flood (如果您的防火墙默认配置有“ :syn-flood - [0:0] ”则不许要该项,因为重复了) iptables -A INPUT -p tcp --syn -j syn-flood iptables -I syn-flood -p tcp -m limit --limit 2/s --limit-burst 5 -j RETURN iptables -A syn-flood -j REJECT # 防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃 # 需要iptables v1.4.19以上版本:iptables -V iptables -A INPUT -p tcp --syn -i eth0 --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP #用Iptables抵御DDOS (参数与上相同) iptables -A INPUT -p tcp --syn -m limit --limit 5/s --limit-burst 10 -j ACCEPT iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT iptables -A FORWARD -p icmp -m limit --limit 2/s --limit-burst 10 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -s ! 172.29.73.0/24 -j DROP
参考资料:
Linux的iptables常用配置范例(1):http://www.ha97.com/3928.html
Iptables 指南 1.1.19:https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html
iptables常用实例备查:http://seanlook.com/2014/02/26/iptables-example/