Linux iptables详解(1)
防火墙其实就是实现Linux下访问控制的功能,通过一些规则来限制一些不安全因素的网络信息传输;准确的说,防火墙就是制定一些规则来管理所负责的范围内的主机数据封包的一种机制。通过防火墙,我们能够分析与过滤进出主机或者网络的封包数据,从而将不安全因素包隔离到安全区域之外。
一.防火墙概念
防火墙可分为主机防火墙和网络防火墙两种:
主机防火墙:通过在主机之上安装一些防火墙软件来保护系统的网络安全,如iptables,TCP Wrappers等,主要服务范围为当前主机。
网络防火墙:通过一些专业的硬件防火墙设备来提供封包数据的过滤,如checkpoint,netscreen等,主要服务范围为当前主机一侧的局域网。
二.iptables基础
无论是数据的还是发送亦或是转发,都要对数据包进行拆包分析TCP/IP协议,然后根据数据包的不同流向分别进行不同情况的转发,因此iptables应该工作在内核中的TCP/IP协议栈框架netfilter之上,而不是单单在某个协议之中。netfilter在内核中设置关卡,进出的报文符合放行条件的放行,符合阻拦条件的被阻止,于是,出现input关卡和output关卡。这些关卡在iptables里面被称为链。
客户端发来的报文访问目标地址是其他服务器,就会使用到iptables的其他关卡,就是“路由前”,“转发”,“路由后”,分别是PREROUTING,FORWARD,POSTROUTING。
因此我们可以想到到一些常用的场景当中,报文的流向为:
到本机某进程的报文:PREROUTING--》INPUT
由本机转发的报文:PREROUTING-->FORWARD-->POSTROUTING
有本机某进程发出的报文:OUTPUT-->POSTROUTING
三.链和表的概念
iptables从字面意义上讲是由ip和tables组成,因此防火墙里面有许多个table,每个表格里面都定义了许多规则,并且每个表格的用途不同。报文经过关卡的时候,必须匹配关卡上的规则,一个关卡上不止一条规则,把很多规则串到一条链条上的时候,就形成了链,经过关卡的报文都要把链上的规则匹配一遍。
iptables按用途和功能分为了四个表:
filter:负责过滤功能,根据定义的规则过滤符合条件的过滤包;
nat:网络地址转换功能;
mangle:拆解报文,重新修改,做出封装;
raw:关闭nat表上启用的连接追踪机制;
这四个表又由五个链组成,五个链对应上面的五个钩子函数,五个链分别是:
INPUT:通过路由表判断后目的地是本机,然后进入本机内部资源;
OUTPUT:由本机产生的数据向外部转发;
FORWARD:通过路由表判断后目的地不是本机,通过路由转发到其他地方;
PREROUTING:流入的数据包进入路由表之前;
POSTROUTING:传出的数据包到达网卡出口前
四.表链关系
每个链的规则都存在于那个表中呢?
PREROUTING 的规则可以存在于:raw表,mangle表,nat表;
INPUT 的规则可以存在于:mangle表,filter表;
OUTPUT 的规则可以存在于:raw表,mangle表,filter表,nat表;
FORWARD 的规则可以存在于:mangle表,filter表;
POSTROUTING 的规则可以存在于:mangle表,nat表
另外需要特别注意的是链上的规则在匹配过程中是由次序的,即为检查次序,因此在制定时要遵循以下法则:
1.同类规则,匹配范围小的放上面;
2.不同类规则,匹配报文几率较大的放上面;
3.应该设置默认策略
五.iptables规则
处理动作:
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给任何回应信息,过了超时时间才会有反应
REJECT:拒绝数据包通过,必要时给数据端发送一个相应信息,客户端刚请求就回收到拒绝信息
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题
MASQUERADE:是SANT的一种特殊形式。适用于动态的,临时会变的ip上
DANT:目标地址转换
REDIRECT:在本机做端口映射
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则链的策略只能设置为 ACCEPT DROP REJECT
六.iptables规则管理
1.列出表中的所有规则
[root@contos7 ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:bootpc
iptables -t raw-L
iptables -t mangle -L
iptables -t nat -L
同理可以查看其他表的所有规则,默认为filter
2.查看指定表中的指定链规则 -v查看出详细信息
iptables默认对我们进行名称解析,-n表示不对名称进行反解,直接显示ip地址
[root@contos7 ~]# iptables -t filter -vnL
Chain INPUT (policy ACCEPT 4631 packets, 893K bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0
0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT 109 packets, 14911 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68
3.增加规则
[root@contos7 ~]# iptables -t filter -I INPUT -s 172.18.250.66 -j DROP
[root@contos7 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 371 packets, 69013 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 172.18.250.66 0.0.0.0/0
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
这条规则就是说明拒绝172.18.250.66上的所有报文访问这台机器。
[root@contos7 ~]# iptables -A INPUT -s 172.18.250.77 -j ACCEPT
[root@contos7 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 18 packets, 2679 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 172.18.250.66 0.0.0.0/0
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
0 0 ACCEPT all -- * * 172.18.250.77 0.0.0.0/0
使用--line--number可以列出规则的序号
[root@contos7 ~]# iptables --line -nvL INPUT
Chain INPUT (policy ACCEPT 733 packets, 122K bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * * 172.18.250.66 0.0.0.0/0
2 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
3 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
4 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
5 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
6 0 0 ACCEPT all -- * * 172.18.250.77 0.0.0.0/0
4.删除规则
如果我们想删除filter表中INPUT中的条规则,则可以使用如下命令:
[root@contos7 ~]# iptables --line -nvL INPUT
Chain INPUT (policy ACCEPT 505 packets, 91958 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
2 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
3 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
4 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
[root@contos7 ~]# iptables -D INPUT 3
[root@contos7 ~]# iptables --line -nvL INPUT
Chain INPUT (policy ACCEPT 12 packets, 1493 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
2 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
3 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
5.保存规则
在默认情况下,我们对防火墙所做出的修改都是临时的,换句话说,当重启iptables服务或者重启服务器以后,我们对防火墙进行的添加修改都将消失,为了防止这种情况,我们需要对添加的规则进行保存。
[root@contos7 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@contos7 ~]# cat /etc/sysconfig/iptables