netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能
iptables只是Linux防火墙的命令行管理工具而已,位于用户空间,真正实现防火墙功能的是 netfilter,位于内核空间,它是Linux内核中实现包过滤的内部结构
iptables的四表五链
iptables内置了4张表,分别为raw,managle,nat,filter,其实现的功能如下
filter: 过滤,防火墙
nat: 即network address translation, 网络地址转换
mangle:拆解报文,做出修改,封装报文
raw:连接追踪机制
这4张表的优先级是:raw–>mangle–>nat–>filter
iptables定义了5条链,分别是PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING,称为称为钩子函数。5条链的作用如下
INPUT:进来的数据包应用此规则链中的策略
OUTPUT:外出的数据包应用此规则链中的策略
FORWARD:转发数据包时应用此规则链中的策略
PREROUTING:对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING:对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
iptables可以在这5处地方写规则,当数据包经过每一个钩子函数时,iptables就会从钩子函数中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包
iptables表和链的关系
注:在CentOS 7中NAT表增加了INPUT链(CentOS 6没有),源地址转换(SNAT)也可以写在INPUT链上
数据包的流向路线
流入:PREROUTING --> INPUT ,即是图中①--->②
流出:OUTPUT --> POSTROUTING ,即是图中⑤--->⑥
转发:PREROUTING --> FORWARD --> POSTROUTING,即是图中 ①--->③--->④--->⑥
iptables的基本语法格式
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转给其它链处理)
-t 表名
表名可以是filter, nat, mangle, raw,省略时为filter
命令选项
链管理:
-F:flush,清空规则链;省略链,表示清空指定表上的所有的链
-N:new, 创建新的自定义规则链
-X:delete-chain, 删除用户自定义的空的规则链
-Z:zero,清零,置零规则计数器
-P:Policy,为指定链设置默认策略;对filter表中的链而言,默认策略通常有ACCEPT, DROP, REJECT
-E: rename,重命令自定义链;引用计数不为0的自定义链,无法改名,也无法删除
规则管理:
-A:append,将新规则追加于指定链的尾部
-I:insert,将新规则插入至指定链的指定位置
-D:delete,删除指定链上的指定规则
有两种指定方式:
(1) 指定匹配条件
(2) 指定规则编号
-R:replace,替换指定链上的指定规则
查看:
-L:list,列出指定链上的所有规则;
-n: numberic,以数字格式显示地址和端口号
-v: verbose,显示规则详细信息;
-vv, -vvv 显示规则更详细信息
--line-numbers:显示规则编号
-x: exactly, 显示计数器计数结果的精确值
其它:
-V:version,查看版本
-h:help,获取帮助
链名
链名可以是 PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING,也可以是自定义链
条件匹配
基本匹配:
[!] -s, --src, --source IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围,!表示取反
[!] -d, --dst, --destination IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围,!表示取反
-p, --protocol {tcp|udp|icmp}:检查报文中的协议,即ip首部中的protocols所标识的协议
-i, --in-interface IFACE:数据报文的流入接口;仅能用于PREROUTING, INPUT及FORWARD链上
-o, --out-interface IFACE:数据报文的流出接口;仅能用于FORWARD, OUTPUT及POSTROUTING链上
扩展匹配:格式为 -m macth_name --spec_options ,其中 macth_name 为扩展名, --spec_options为扩展的的选项,有隐式扩展和显示扩展两类
隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m tcp|udp|icmp 选项
-p tcp
--dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口
--sport PORT[-PORT]:源端口,可以是单个端口或连续多个端口
--tcp-flags LIST1 LIST2:匹配指定的TCP标记,有两个参数列表,列表内部用逗号为分隔符,两个列表之间用空格分开,
LIST1用作参数检查,LIST2用作参数匹配。可用标志有:
SYN( 同步; 表示开始会话请求 ), ACK(应答),
FIN(结束; 结束会话),RST(复位;中断一个连接) ,
PSH(推送; 数据包立即发送),URG(紧急 ),
ALL(指选定所有的标记),NONE(指未选定任何标记)
--syn:SYN标志设置为1,其它标志未设置,相当于--tcp-flags ALL SYN
-p udp
--dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口
--sport PORT[-PORT]:源端口,可以是单个端口或连续多个端口
-p icmp
--icmp-type,常用数字表示其类型:
0:echo-reply(回显应答,即ping应答)
8: echo-request(回显请求,即ping请求)
显式扩展: 必须使用-m选项指定使用的扩展,常用的显示扩展有:
multiport,iprange,string,time,connlimit,limit,state等
-j 目标动作或跳转
ACCEPT: 接受
DROP: 丢弃
REJECT: 拒绝,使用--reject-with选项可以提示信息,有以下可用值
icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-prohibited
icmp-admin-pro-hibited
未做设置设置的话默认是icmp-port-unreachable
RETURN: 返回调用链
REDIRECT:端口重定向
--to-ports
LOG: 记录日志
--log-level 记录日志级别,有debug,info,notice,warning,error, crit,alert,emerg
--log-prefix 给记录日志加上标签,最多29个字符
MARK:做防火墙标记
DNAT:目标地址转换
--to-destination
SNAT:源地址转换
--to-source
MASQUERADE:地址伪装
自定义链:由自定义链上的规则进行匹配检查
iptables添加规则时的考量点
a 要实现哪种功能:判断添加在哪张表上
b 报文流经的路径:判断添加在哪个链上
iptables添加规则时遵循的法则
a 同类规则(访问同一应用),匹配范围小的放上面;
b 不同类规则(访问不同应用),匹配到报文频率较大的放上面;
c 将那些可由一条规则描述的多个规则合并为一个
查看iptables规则
下面是CentOS 6安装好后的默认iptables规则
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
20736 26M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 104 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
37 1936 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 13144 packets, 569K bytes)
pkts bytes target prot opt in out source destination
这些字段对应的含义如下
pkts:由规则或链所匹配到的报文的个数
bytes:由规则或链匹配到的所有报文大小之和
taregt:匹配成功后采取的动作
prot:规则对应的协议
opt:规则对应的选项
in:数据包流入接口
out:数据包流出接口
source:规则对应的源地址,可以是一个ip,也可以是一个网段,0.0.0.0/0表示任意地址
destination:规则对应的目标地址,可以是一个ip,也可以是一个网段,0.0.0.0/0表示任意地址
下面来设置iptables常见简单策略(主机地址为172.16.8.20)
清空iptables规则(远程连接的话先确认INPUT,OUTPUT,FORWARD默认策略为ACCEPT)
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -X
[root@localhost ~]# iptables -Z
放行SSH端口
[root@localhost ~]# iptables -A INPUT -d 172.16.8.20 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 172.16.8.20 -p tcp --sport 22 -j ACCEPT
设置INPUT,OUTPUT,FORWARD默认策略为DROP
[root@localhost ~]# iptbales -P INPUT DROP
[root@localhost ~]# iptables -P FORWARD DROP
[root@localhost ~]# iptables -P OUTPUT DROP
设置主机能往外ping,外面主机无法ping进来
[root@localhost ~]# iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT -p icmp --icmp-type 8 -j ACCEPT
放行本地会环接口
[root@localhost ~]# iptables -I INPUT 2 -i lo -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT 2 -o lo -j ACCEPT
放行DNS端口
[root@localhost ~]# iptables -A INPUT -d 172.16.8.20 -p udp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 172.16.8.20 -p udp --sport 53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -d 172.16.8.20 -p udp --sport 53 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 172.16.8.20 -p udp --dport 53 -j ACCEPT
保存iptables规则
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
或
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
重载iptables规则
[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables
或
[root@localhost ~]# service iptables restart
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
这样一个简单基础的iptables 规则就建立起来了