概念
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,也可以是一个网段。