概念

iptables 是Linux防火墙工作在用户空间的管理工具,所以其实它不是真正意义上的防火墙,它只是将用户的安全设定执行到对应的安全框架(netfilter)中,netfilter才是防火墙的真正框架,位于内核空间。

netfilter/iptables组成Linux平台上的包过滤防火墙,可以完成封包过滤、重定向和网络地址转换等功能。

iptables是由表、链、规则这样的架构组成,其拥有四张表(filter/nat/mangle)、五条链(input/output/forward/prerouting/postrouting),它们负责的具体功能如下所示:

filter表:负责过滤数据包,包含规则链input、output、forward
nat表:负责网络地址转换,包含规则链prerouting、postrouting、output、input【centos6nat表不能存在input链】
mangle表:负责修改数据包、给数据包打标识、流量整形,包含规则链input、output、forward、postrouting、prerouting
raw表:处理异常,包含规则链prerouting、output

input链:匹配目标IP为本机的数据包
ouput链:匹配出口数据包
forward链:匹配流经本机的数据包
prerouting链:修改目的地址(DNAT)
postrouting链:修改源地址(SNAT)

iptables数据包流程

数据包先经过PREROUTING链,由该链确定数据报的走向:
1.目的地址是本机,则将数据包发送到INPUT链,让INPUT链决定是够接收下来发送到用户空间,流程是1->2;
2.若满足PREROUTING链上的nat表的转发规则,则发送给FORWARD链,然后再经过POSTROUTING链发送出去,流程是1->3->4->6;
3.主机发送数据包时,则是流程5->6

iptables安装启动命令

yum install -y iptables-services
systemctl start iptables
systemctl enable iptables

iptables保存新规则命令

iptables-save > /etc/sysconfig/iptables
systemctl restart iptables

iptables保存和恢复命令

iptables-save > /etc/sysconfig/iptables
cp /etc/sysconfig/iptables /opt/iptables.bak
iptables-restore < /opt/iptables.bak

/etc/sysconfig/iptables为iptables命令规则存放之处,要是熟悉iptables的也可以直接修改文件重启服务即可

iptables规则管理语法详解

iptables [-t table] command [链名] [条件匹配] [-j 目标动作]

-t table
指定规则变动的表,table选项有FILTER/NAT/MANGLE/RAW,默认使用filter表

-A
追加规则

-I
指定位置插入规则,iptables执行顺序是根须/etc/sysconfig/iptables文件从上到下执行的

-L
查看规则列表

-D
从规则列表中删除规则

-P
设置某条链的默认规则

-F
清空规则

-Z
将指定链所有计数器归零

-i
匹配数据进入的网络接口

-o
匹配数据流出的网络接口

-s
匹配源地址

-d
匹配目标地址

-p
匹配协议类型

--sport
匹配源端口

--dport
匹配目标端口

-j ACCEPT
允许数据包通过

-j DROP
丢弃数据包阻止通过

-j REDIRECT
本地端口映射

-j REJECT
拒绝数据包通过,会发送一条拒绝连接的信息

-j SNAT
源地址转换

-j DNAT
目的地址转换

-j MASQUERADE
动态地址转换

iptables常用附加模块

按包状态匹配
-m state --state 状态

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
//已运行服务端口全部放行

按来源MAC匹配
-m mac --mac-source MAC

iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
//拒绝来自某MAC地址的数据包

按包速率匹配
-m limit --limit 速率

iptables -A FORWARD -d 192.168.1.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.1.1 -j DROP
//limit 英语上看是限制的意思,但实际上只是按一定速率去匹配而已,50/s 表示 1 秒中转发 50 个数据包,要想限制的话后面要再跟一条DROP规则

多端口匹配
-m multiport <--sports|--dports|--ports> 端口 1[,端口 2,..,端口 n]

iptables -A INPUT -p tcp -m multiport --dports 22,53,80,443 -j ACCEPT
// 允许访问本机TCP/22,53,80,443端口

匹配IP地址范围

-m iprange <--src-range|--dst-range> IP地址1-IP地址2

iptables -A INPUT -m iprange --src-range 192.168.1.101-192.168.1.110 -j DROP
//将源地址是192.168.1.101到192.168.1.110的地址的报文丢弃

匹配字符串

-m string -algo bm --string "字符串"

iptables -A INPUT -m string --algo bm -string "ABC" -j REJECT
//将包含ABC字符串的报文丢弃

匹配时间

-m time <--timestart num|--timestop num|--weekday num>

iptables -A INPUT -p tcp -dport 22 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
//周末的九点到十八点拒绝连接22端口

限制IP链接数量

-m connlimit --connlimit-above num

iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
//每个IP最多只能占用2个ssh链接

iptables查看规则命令

iptables -L [-t 表名]
查看某个表的所有链的规则,不加表名默认指代filter

iptables -nL
以数字形式显示规则

iptables -nvL
显示更详细的规则列表
pkts:对应规则匹配到的报文的个数。
bytes:对应匹配到的报文包的大小总和。
target:规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。
prot:表示规则对应的协议,是否只针对某些协议应用此规则。
opt:表示规则对应的选项。
in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。

source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。

destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。