简介
Centos 7 开始使用firewalld服务替代iptables服务,所以在centos 7中查看iptables的运行状态systemctl iptables status会报错,但是依然可以使用iptables管理内核的netfilter,需要关闭firewalld,安装iptables。
iptables服务和firewalld服务都不是真正的防火墙,只是用来定义防火墙规则功能的管理工具,将定义好的规则交由内核中的netfilter从而实现真正的防火墙功能。
防火墙主要通过Netfilter与TCPwrappers两个机制来管理的。Netfilter是数据包过滤机制,TCPwrappers是程序管理机制。Netfilter机制正是由以上两个软件firewalld, iptables维护的。
IPTABLES
iptables分为iptables和ip6tables,分别对IP v4和IP v6防火墙设置。
iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链。
常见的控制类型包括:1
2
3
4
5
6
7ACCEPT 允许通过
LOG 记录日志信息,然后传给下一条规则继续匹配
REJECT 拒绝通过,必要时给出提示
DROP 直接丢弃,不给出任何回应。
在前面iptables的使用中,我们用到了DROP和ACCEPT。
规则链则依据处理数据包的位置不同而进行分类,五链:1
2
3
4
5
6
7
8
9PREROUTING 进行路由选择前处理数据包
INPUT 处理入站数据包
OUTPUT 处理出站数据包
FORWARD 处理转发的数据包
POSTROUTING 在进行路由选择后处理数据包
iptables中的规则表是用于容纳规则链,规则表默认是允许状态,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。
四表:1
2
3
4
5
6
7raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中的源,目标IP地址或端口
filter表:确定是否放行该数据包(过滤)

规则表的先后顺序: raw-mangle-nat-filter
规则链的先后顺序:
入站顺序: PREROUTING - INPUT
出站顺序: OUTPUT - POSTROUTING
转发顺序: PREROUTING - FORWARD - POSTROUTING
注意事项:
没有指定规则表则默认指filter表。
不指定规则链则指表内所有的规则链
在规则链中匹配规则时会依次检查,匹配即停止(LOG规则除外),若没匹配项则按链的默认状态处理。
基本的命令参数:
iptables命令用于管理防火墙的规则策略,格式为:iptables [-t 表名] 选项[链名][条件] [-j 控制类型]不指定表,默认netfilter
| 参数 | 作用 | |
|---|---|---|
| -P | 设置默认策略:iptables -P INPUT (DROP | ACCEPT) |
| -F | 清空规则链 | |
| -L | 查看规则链 | |
| -A | 在规则链的末尾加入新的规则 | |
| -I num | 在规则链的头部加入新规则 | |
| -D num | 删除某一条规则 | |
| -s | 匹配来源地址IP/MASK,加叹号”!”表示除这个IP外 | |
| -d | 匹配目标地址 | |
| -i 网卡名称 | 匹配从这块网卡流入的数据 | |
| -o 网卡名称 | 匹配从这块网卡流出的数据 | |
| -p | 匹配协议,如tcp,udp,icmp | |
| –dport num | 匹配目标端口号 | |
| –sport num | 匹配来源端口号 |
如前面iptables使用中使用到的命令:1
2
3iptables -I -s 10.0.0.2 -j DROP
iptables -I INPUT -p tcp --dport 80 -s 10.0.0.2 -j DROP
iptables -A INPUT -j DROP
禁止所有的ping操作:1
iptables -I INPUT -p icmp -j DROP
FIREWALLD
firewalld提供图形化配置工具firewall-config、system-config-firewall,提供命令行工具firewall-cmd,用于配置firewalld永久性或非永久性运行时间的改变。
firewalld底层使用的是iptables命令,即firewalld是对iptables的一个封装,python实现,让你更容易管理iptables规则。
FirewallD 使用 XML 进行配置,配置文件位于两个目录中:
- /usr/lib/FirewallD 下保存默认配置,如默认区域和公用服务。 避免修改它们,因为每次
firewall软件包更新时都会覆盖这些文件。 - /etc/firewalld 下保存系统配置文件。 这些文件将覆盖默认配置。
firewalld将网络划分成不同的区域,针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。
区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal 区域上允许 DHCP,但在external 区域仅允许HTTP和SSH。未明确设置为特定区域的任何接口将添加到默认区域。
命令参数:
| 参数 | 作用 |
|---|---|
| –get-default-zone | 查询默认的区域名称 |
| –set-default=<区域名称> | 设置默认区域,永久生效 |
| –get-zone | 显示可用的区域 |
| –get-services | 显示预先定义的服务 |
| –get-active-zones | 显示当前正在使用的区域与网卡名称 |
| –add-source= | 将来源于此IP或子网的流量导向指定的区域 |
| –remove-source | 不再将此IP或子网的流量导向某个指定区域 |
| –add-interface=<网卡名称> | 将来自于该网卡的所有流量都导向某个指定区域 |
| –change-interface=<网卡名称> | 将某个网卡与区域关联 |
| –list-all | 显示当前区域的网卡配置参数,资源,端口以及服务等信息 |
| –list-all-zones | 显示所有区域的网卡配置参数,资源,端口以及服务等信息 |
| –add-service=<服务名> | 设置默认区域允许该服务的流量 |
| –add-port=<端口/协议> | 允许默认区域允许该端口的流量 |
| –remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
| –remove-port=<端口/协议> | 允许默认区域不再允许该端口的流量 |
| –reload | 让“永久生效”的配置规则立即生效,覆盖当前的 |
| –permanent | 设置为永久生效 |
firewalld服务中有两份规则策略配置记录:
- RunTime: 当前正在生效的
- Permanent: 永久生效的
修改永久生效的策略时,必须执行”-reload”参数后才能立刻生效,否则需要重启后再生效。
找到默认区域:1
2[root@VM_0_12_centos ~]# firewall-cmd --get-default-zone
public
查看所有区域的配置:1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@VM_0_12_centos zones]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
可用看到我的是public区
在public中分别查询ssh与http服务是否被允许:1
2
3
4[root@VM_0_12_centos ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@VM_0_12_centos ~]# firewall-cmd --zone=public --query-service=http
no
让http能通过防火墙:1
2[root@VM_0_12_centos ~]# firewall-cmd --add-service=http
success
将其改为永久生效:1
[root@VM_0_12_centos ~]# firewall-cmd --permanent --zone=public --add-service=http
禁用http服务:1
firewall-cmd --zone=public --remove-service=http --permanent
开放/禁用12345端口的TCP流量:1
2firewall-cmd --zone=public --add-port=12345/tcp --permanent
firewall-cmd --zone=public --remove-port=12345/tcp --permanent
配置端口转发,将 80 端口的流量转发到 12345 端口:1
firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345
区别
iptables service在/etc/sysconfig/iptables中存储配置,而firewalld将配置存储在/usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种XML文件里。
使用iptables service每一个单独更改意味着清除所有旧有的规则,再从/etc/sysconfig/iptables里读取所有的新规则,而使用firewalld使用区域和服务而不是链式规则,动态管理规则集,允许更新规则而不破坏现有会话和连接。