简介
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
使用区域和服务而不是链式规则,动态管理规则集,允许更新规则而不破坏现有会话和连接。