Linux-iptables防火墙相关
IPTABLES防火墙
1.概述
Linux系统的防护墙:IP信息包过滤系统,实际由两个组件netfilter和iptables组成。主要工作在网络层,针对IP数据包。提现在对包内的IP地址、端口、协议等信息的处理上。
1.1 iptables与netfileter的关系
netfileter:属于“内核态”的防火墙功能体系,属于内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。处理规则集
iptables:属于用户态的防火墙管理体系。是一种用来管理Linux防火墙的命令程序,他使插入、修改和删除数据包过滤表中的规则变得容易,通常为与/sbin/iptables文件下。修改规则集
netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、nat和filter四个规则表,表中的所有规则配置后,立即生效,不需要重启服务。
1.2 四表五链
规则表的作用:容纳各种规则链
规则链的作用:容纳不同具体的防火墙规则。
四表:
raw表:确定是否对该数据包进行状态跟踪。包含两个规则链,OUTPUT、PREROUTING。
mangle表:修改数据包的内容,用来做流量整形的,给数据包设置标记。包含五个规则链。INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
nat表:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING。
fileter表:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链。INPUT、FORWARD、OUTPUT
五链:
INPUT:处理入战数据包,匹配目标IP为本机的数据包。
OUTPUT:处理出站数据包。一般不在本链上做配置。
FORWARD:处理转发数据包,匹配流经本机的数据包。
PREROUTINF链:在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于做DNAT。相当与把内网服务器的IP和端口映射到路由器的外网IP和端口上。
POSTROUTING链:在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。
数据包到达防火墙时,规则表之间的优先顺序:
raw > mangle > nat > filter
1.3 规则链的匹配顺序
主机型防火墙:
入站数据(来自外界的数据包,且目标地址是防火墙本机):PREROUTING --> INOUT --> 本机的应用程序
出站数据(从防火墙本机向外部地址发送的数据包):本机的应用程序 --> OUTPUT --> POSTROUTING
网络防火墙:
转发数据(需要经过防火墙转发的数据包):PREROUTING --> FORWARD --> POSTROUTING
规则链内的匹配顺序:
自上向下按顺序依次进行检查,找到相匹配的规则即停止(log策略除外,表示记录相关日志)
若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)
下图为iptable的数据流向图:
2. IPTABLES的使用
Centos7默认使用firewalld防火墙,没有安装iptables的管理程序,要使用iptables必须先关闭firewalld防火墙。
systemctl stop firewalld.service
systemctl disable firewalld.service
yum -y install iptables-services
systemctl start iptabels.service
iptables格式:
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j] 控制类型
常见控制类型(必须大写):
- ACCEPT:允许数据包通过
- DROP:直接丢弃数据包,不给任何回应信息
- REJECT:拒绝数据包通过,会给数据发送端一个响应信息
- SNAT:修改数据包的源地址
- DNAT:修改数据包的目的地址。
- MASQUERDE:伪装成一个非固定公网IP地址。
- LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一个规则,LOG只是辅助动作,没有真正处理数据包
常用管理选项:
参数 | 作用 |
---|---|
-P | 设置默认策略 |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I | 在规则链的头部加入新规则 |
-R | 修改、替换指定链中的某一条规则,可指定规则序号或具体内容 |
-D num | 删除某一条规则 |
-s | 匹配来源地址 IP/MASK,加叹号“!”表示除这个 IP 外 |
-d | 匹配目标地址 |
-i | 网卡名称 匹配从这块网卡流入的数据 |
-o | 网卡名称 匹配从这块网卡流出的数据 |
-p | 匹配协议,如 TCP、UDP、ICMP |
--dport num | 匹配目标端口号 |
--sport num | 匹配来源端口号 |
注意事项:
- 不指定表名,默认使用filter表。
- 不指定链名,默认指表内所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 控制类型使用大写字母,其余均小写
2.1 规则的增、删、改、查
2.1.1 查询规则
[root@localhost ~]# iptables -nL #默认查询filter表规则
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -nL -t nat ##-t后跟表名查询指定表规则
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
2.1.2 增加规则
[root@localhost ~]# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT ##允许源IP地址为192.168.0.0/24网段的包流进(包括所有的协议,这里也可以指定单个IP),该规则默认放在INPUT链最后,最后匹配该规则
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT all -- 192.168.0.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -I INPUT 2 -s 192.168.0.20 -j ACCEPT ##允许192.168.0.20的所有访问,并插入到INPUT链的第二条规则中,-I后不指定数字,则插入到第一行。
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 192.168.0.20 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT all -- 192.168.0.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2.1.3 删除规则
[root@localhost ~]# iptables -D INPUT 2 ##删除filter表,INPUT链的第二条规则
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT all -- 192.168.0.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2.1.4 修改规则
[root@localhost ~]# iptables -R INPUT 6 -s 192.168.0.20 -j ACCEPT #修改INOUT链第6条规则为允许192.168.0.20的所有访问。-R的修改需要将该规则的所有匹配项均输入,否则默认为空,不会继承上一条规则的配置,所以最好通过先增加一条规则,在删除原规则的方法进行修改比较保险
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT all -- 192.168.0.20 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -R INPUT 6 -s 192.168.0.30 #对第6条规则再次修改,由于没有输入控制项,该条规则中对应控制为空
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
all -- 192.168.0.30 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2.1.5 配置默认规则
默认规则是指当数据为匹配链中的所有规则的时候,对数据进行的默认操作,一般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为DROP,并设置白名单规则控制数据流入
[root@localhost ~]# iptables -P FORWARD DROP ##对filer表中的FORWARD链设置默认规则为DROP
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
all -- 192.168.0.30 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2.1.6 清空所有规则
iptables 【-t 表名】 -F 【链名】 ##不指定表名,则默认清理的是filter中的规则
[root@localhost ~]# iptables -F FORWARD #将FORWARD链的所有规则清空
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
all -- 192.168.0.30 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -F ##清空了filter表的所有规则
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
WARNING
- -F 仅仅是清空链中的规则,并不影响 -P 设置的默认规则,默认规则需要手动进行修改
- -P 设置了DROP后,使用-F 一定要小心防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决
- 如果不写表名和链名,默认清空filter表中所有链里的所有规则
2.1.7 注意事项
规则配置当配置完成后是立即生效的,如果不对配置的规则保存,当系统重启或重启iptables服务,规则则会重置。
[root@localhost ~]# systemctl restart iptables ##重启iptables服务
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
iptables的规则是保存在/etc/sysconfig/iptables文件里的,所以可以通过备份该文件,备份默认的iptabels规则。
[root@localhost ~]# iptables -I INPUT -s 192.168.0.20 -j DROP ##随便加个规则
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 192.168.0.20 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# service iptables save ##保存当前配置到/etc/sysconfig/iptables文件里
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@localhost ~]# systemctl restart iptables
[root@localhost ~]# iptables -nL ##重启服务后配置依然存在
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 192.168.0.20 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination