iptables与firewalld

2019-06-14

简介

Centos 7 开始使用firewalld服务替代iptables服务,所以在centos 7中查看iptables的运行状态systemctl iptables status会报错,但是依然可以使用iptables管理内核的netfilter,需要关闭firewalld,安装iptables

iptables服务和firewalld服务都不是真正的防火墙,只是用来定义防火墙规则功能的管理工具,将定义好的规则交由内核中的netfilter从而实现真正的防火墙功能。

防火墙主要通过NetfilterTCPwrappers两个机制来管理的。Netfilter是数据包过滤机制,TCPwrappers是程序管理机制。Netfilter机制正是由以上两个软件firewalld, iptables维护的。

IPTABLES

iptables分为iptablesip6tables,分别对IP v4和IP v6防火墙设置。

iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链。

常见的控制类型包括:

1
2
3
4
5
6
7
ACCEPT     允许通过

LOG   记录日志信息,然后传给下一条规则继续匹配

REJECT   拒绝通过,必要时给出提示

DROP   直接丢弃,不给出任何回应。

在前面iptables的使用中,我们用到了DROPACCEPT

规则链则依据处理数据包的位置不同而进行分类,五链:

1
2
3
4
5
6
7
8
9
PREROUTING  进行路由选择前处理数据包

INPUT   处理入站数据包

OUTPUT   处理出站数据包

FORWARD   处理转发的数据包

POSTROUTING  在进行路由选择后处理数据包

iptables中的规则表是用于容纳规则链,规则表默认是允许状态,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。

四表:

1
2
3
4
5
6
7
raw表:确定是否对该数据包进行状态跟踪

mangle表:为数据包设置标记

nat表:修改数据包中的源,目标IP地址或端口

filter表:确定是否放行该数据包(过滤)

image

规则表的先后顺序: 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
3
iptables -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-configsystem-config-firewall,提供命令行工具firewall-cmd,用于配置firewalld永久性或非永久性运行时间的改变。

firewalld底层使用的是iptables命令,即firewalld是对iptables的一个封装,python实现,让你更容易管理iptables规则。

FirewallD 使用 XML 进行配置,配置文件位于两个目录中:

  • /usr/lib/FirewallD 下保存默认配置,如默认区域和公用服务。 避免修改它们,因为每次 firewall 软件包更新时都会覆盖这些文件。
  • /etc/firewalld 下保存系统配置文件。 这些文件将覆盖默认配置。

firewalld将网络划分成不同的区域,针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。

区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal 区域上允许 DHCP,但在external 区域仅允许HTTPSSH。未明确设置为特定区域的任何接口将添加到默认区域。

命令参数:

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

参考:

https://www.cnblogs.com/lgh344902118/p/7169006.html

https://linux.cn/article-8098-1.html