FirewallD使用服务和区域的概念,而不是iptables规则和链。使用它,您可以配置应该允许或禁止与系统之间的通信。FirewallD使用firewall-cmd实用程序来管理防火墙配置。
LinuxEA # firewall-cmd --list-all
FirewallD is not running
启动并启用
LinuxEA # systemctl start firewalld
LinuxEA # systemctl enable firewalld
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.
状态已经运行
LinuxEA # firewall-cmd --state
running
以下是FirewallD中包含的预定义区域:这些可以使用firewall-cmd --get-zones来获取
icmp-host- prohibited
或icmp6-adm-prohibited
消息阻止。使用FirewallD配置防火墙
默认情况下,public域是启用防火墙服务后的默认区域。
LinuxEA # firewall-cmd --get-default-zone
public
使用--get-zones
可以看到所有区域
LinuxEA # firewall-cmd --get-zones
block dmz drop external home internal public trusted work
--get-active-zones 查看网络接口使用了哪些区域
LinuxEA # firewall-cmd --get-active-zones
public
interfaces: eth0
可以使用--set-default-zone=""和--get-default-zone来设置和查看
# firewall-cmd --set-default-zone=drop 比如更改为home域或者drop域
# firewall-cmd --get-default-zone
对外开放服务
打开http和https
临时打开对外开放http和https
LinuxEA # firewall-cmd --zone=drop --add-service=http
success
LinuxEA # firewall-cmd --zone=drop --add-service=https
success
永久写入: --permanent
LinuxEA # firewall-cmd --zone=drop --permanent --add-service=http
success
LinuxEA # firewall-cmd --zone=drop --permanent --add-service=https
success
或者这样
LinuxEA # firewall-cmd --zone=drop --permanent --add-port 80/tcp
success
LinuxEA # firewall-cmd --zone=drop --permanent --add-port 443/tcp
success
- 如果有多个端口,比如开启:80到100端口
LinuxEA # firewall-cmd --zone=drop --permanent --add-port 80-100/tcp
OR
LinuxEA # firewall-cmd --zone=drop --permanent --add-port={80/tcp,443/tcp,8080/tcp,9000-9086/tcp}
success
- 如果有多个服务
LinuxEA # firewall-cmd --zone=drop --permanent --add-service={http,https,dns,jenkins}
success
如果要查看这些端口,则可以使用--info-service=NAME,这些信息预置在/usr/lib/firewalld/services目录下。
如下:
LinuxEA # firewall-cmd --info-service=jenkins
jenkins
ports: 8080/tcp
protocols:
source-ports:
modules:
destination:
includes:
helpers:
而后重新加载
LinuxEA # firewall-cmd --reload
success
使用--list-all查看
LinuxEA # firewall-cmd --list-all
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: ens33
sources:
services: dns http https jenkins
ports: 80/tcp 443/tcp 8080/tcp 9000-9086/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
删除规则
LinuxEA # firewall-cmd --zone=drop --permanent --remove-service=http
success
LinuxEA # firewall-cmd --zone=drop --permanent --remove-service=https
success
或者
LinuxEA # firewall-cmd --zone=drop --permanent --remove-port 80/tcp
success
LinuxEA # firewall-cmd --zone=drop --permanent --remove-port 443/tcp
success
LinuxEA # firewall-cmd --reload
success
LinuxEA # firewall-cmd --list-all
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: ens33
sources:
services: dns jenkins
ports: 8080/tcp 9000-9086/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
源ip地址管理
可以将区域绑定到网络接口和地址: 对于drop区域,放行172.16.100.0/24网段
LinuxEA # firewall-cmd --permanent --zone=drop --add-source=172.16.100.0/24
success
LinuxEA # firewall-cmd --reload
success
移除--remove-source
LinuxEA # firewall-cmd --permanent --zone=drop --remove-source=172.16.100.0/24
success
LinuxEA # firewall-cmd --reload
success
LinuxEA # firewall-cmd --list-all
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: ens33
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
还有修改-change-source
可以对Mac地址进行管理
firewall-cmd --permanent --zone=drop --add-source=80-FA-5B-25-3B-1A
丰富的Rich Rules
由于rich规则所使用的语法很难记住,因此请记住man firewalld.richlanguage命令和最后的“示例”部分。格式如下:
firewall-cmd --add-rich-rule 'rule ...'
- 允许172.16.100.107所有的连接请求。--add-rich-rule
firewall-cmd --permanent --zone=drop --add-rich-rule="rule family="ipv4" source address="172.16.100.107" accept"
log 可以使用log选项记录日志到 /var/log/messages
firewall-cmd --permanent --zone=drop --add-rich-rule="rule family="ipv4" source address="172.16.100.107" log accept"
使用--list-all
LinuxEA # firewall-cmd --list-all
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: ens33
sources:
services: dns jenkins
ports: 8080/tcp 9000-9086/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="172.16.100.107" accept
rule family="ipv4" source address="172.16.100.107" log accept
或者这样添加ip段 172.16.100.0/24
LinuxEA # firewall-cmd --permanent --zone=drop --add-rich-rule='rule family="ipv4" source address="172.16.100.0/24" port port="22-23" protocol="tcp" accept'
success
LinuxEA # firewall-cmd --reload
success
- 删除允许172.16.100.107所有的连接请求。 --remove-rich-rule
firewall-cmd --permanent --zone=drop --remove-rich-rule="rule family="ipv4" source address="172.16.100.107" accept"
-
允许ip和拒绝ip
# 根据ip接受所有端口 firewall-cmd --permanent --zone=drop --add-rich-rule="rule family="ipv4" source address="172.16.100.107" accept" # 根据ip拒绝所有端口 firewall-cmd --permanent --zone=drop --add-rich-rule="rule family="ipv4" source address="172.16.100.107" drop"
-
禁用ping
firewall-cmd --permanent --zone=drop --add-rich-rule='rule protocol value=icmp drop'
- 删除zone
删除/etc/firewalld/zones下的zone命名的xml文件而后重新加载即可
Direct rules
firewall-cmd工具中的--direct
选项可以在运行时添加和删除链。直接接口模式可以让服务或者程序在运行时候添加特定的防火墙。作用于文件 /etc/firewalld/direct.xml
将规则添加到INPUT链,放行8090端口
LinuxEA # firewall-cmd --direct --permanent --zone=drop --add-rule ipv4 filter INPUT 0 -p tcp --dport 8090 -j ACCEPT
success
查看iptables
LinuxEA # iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8090
用firewall查看
LinuxEA # firewall-cmd --direct --get-all-rules
ipv4 filter INPUT 0 -p tcp --dport 8090 -j ACCEPT
请注意,此命令(该--get-rules
选项)仅列出以前使用该--add-rule
选项添加的规则。它没有列出通过其他方式添加的现有iptables规则。
删除
LinuxEA # firewall-cmd --direct --permanent --zone=drop --remove-rule ipv4 filter INPUT 0 -p tcp --dport 8090 -j ACCEPT
如果你在初始化系统这条命令可以放行ssh
firewall-offline-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
ip set管理
firewall有ipset的功能。 ipset是一组IP地址或网络。不同的区域类别,属于hash:ip或hash:net。
配置黑名单ip
创建ip组:blacklist1
LinuxEA # firewall-cmd --permanent --zone=drop --new-ipset=blacklist1 --type=hash:ip
success
LinuxEA # firewall-cmd --reload
success
添加ip成员
- 注意:添加--option=family=inet6以创建IPv6 ipset。
LinuxEA # firewall-cmd --permanent --ipset=blacklist1 --add-entry=172.16.100.101
success
LinuxEA # firewall-cmd --permanent --ipset=blacklist1 --add-entry=172.16.100.3
success
添加拒绝规则
LinuxEA # firewall-cmd --permanent --add-rich-rule='rule source ipset=blacklist1 drop'
success
获取blacklist1成员
LinuxEA # firewall-cmd --info-ipset=blacklist1
blacklist1
type: hash:ip
options:
entries: 172.16.100.101 172.16.100.3
删除组内ip成员
LinuxEA # firewall-cmd --ipset=blacklist1 --remove-entry=172.16.100.101
success
LinuxEA # firewall-cmd --ipset=blacklist1 --get-entries
172.16.100.3
配置黑名单ip段
创建新的黑名单netblacklist,类型hash:net
LinuxEA # firewall-cmd --permanent --new-ipset=netblacklist --type=hash:net --option=family=inet --option=hashsize=4096 --option=maxelem=200000
success
LinuxEA # firewall-cmd --reload
success
LinuxEA # firewall-cmd --info-ipset=netblacklist
netblacklist
type: hash:net
options: family=inet hashsize=4096 maxelem=200000
entries:
添加两个网段
LinuxEA # firewall-cmd --permanent --ipset=netblacklist --add-entry=172.16.100.0/24
success
LinuxEA # firewall-cmd --permanent --ipset=netblacklist --add-entry=192.168.2.0/24
success
LinuxEA # firewall-cmd --info-ipset=netblacklist
netblacklist
type: hash:net
options: family=inet hashsize=4096 maxelem=200000
entries: 172.16.100.0/24 192.168.2.0/24
或者添加一个ip文件列表
LinuxEA # cat > iplist.txt <<EOL
> 10.10.1.0/23
> 192.168.0.3
> 172.16.100.0/24
> 172.16.90.0/24
> EOL
--add-entries-from-file添加,改成--remove-entries-from-file就删除
LinuxEA # firewall-cmd --permanent --ipset=netblacklist --add-entries-from-file=iplist.txt
success
firewall-cmd --permanent --ipset=netblacklist --remove-entries-from-file=iplist.txt
单个添加和单个删除
LinuxEA # firewall-cmd --permanent --ipset=netblacklist --add-entry=172.16.100.118
success
firewall-cmd --permanent --ipset=netblacklist --remove-entry=172.16.100.118
LinuxEA # firewall-cmd --reload
success
LinuxEA # firewall-cmd --info-ipset=netblacklist
netblacklist
type: hash:net
options: family=inet hashsize=4096 maxelem=200000
entries: 172.16.100.0/24 192.168.2.0/24 10.10.1.0/23 192.168.0.3 172.16.90.0/24
没有丢弃参数,没有iptables命令,也没有与IP数据包相关的内容。这是因为使用的是firewalld的源功能,当一个IP地址与源(源接口,源IP甚至源MAC地址)匹配时,上述规则会将IP地址重定向到特定区域,在这种情况下为“阻止”。
作用到某个区域
firewall-cmd --permanent --zone=drop --add-source=ipset:netblacklist
从区域内删除
firewall-cmd --permanent --zone=drop --remove-source=ipset:netblacklist
管理命令
查看ipset
LinuxEA # firewall-cmd --permanent --get-ipsets
blacklist1 netblacklist
查看ipset表
LinuxEA # firewall-cmd --permanent --info-ipset=netblacklist
netblacklist
type: hash:net
options: family=inet hashsize=4096 maxelem=200000
entries: 172.16.100.0/24 192.168.2.0/24 10.10.1.0/23 192.168.0.3 172.16.90.0/24
LinuxEA # firewall-cmd --permanent --info-ipset=blacklist1
blacklist1
type: hash:ip
options:
entries:
端口转发
sysctl -w net.ipv4.ip_forward=1
如果防火墙是您的网络网关,并且不希望所有人都知道您的内部地址,则可以设置两个区域,一个称为内部区域,另一个称为外部区域,并在外部区域上配置伪装。 这样,所有数据包都将获取您的防火墙IP地址作为源地址。
端口转发是一种将特定端口的入站网络流量转发到另一个内部地址或备用端口的方法
端口转发需要masquerading ,因此创建
LinuxEA # firewall-cmd --zone=external --add-masquerade
success
如果希望暂时将所有要发送给端口22的数据包转发到端口tcp 3753
LinuxEA # firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3753
success
把80端口转发到后端的172.25.100.2 8080
firewall-cmd --permanent --add-forward port=80:proto=tcp:toaddr=172.25.100.2:toport=8080
要删除端口转发,使用-remove-forward-port选项
firewall-cmd --zone=external --remove-forward-port=port=22:proto=tcp:toport=3753
如果要定义目标IP地址:
LinuxEA # firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toport=3753:toaddr=172.16.100.101
success
LinuxEA # firewall-cmd --reload
success
--permanent永久生效
示例:
假如现在希望通过SSH从public (10.10.1.0/24)访问dmz网络(10.8.8.0/24)上的服务器。为此,我们需要放置一些端口转发规则。
以下规则配置端口转发,以便将与10.10.1.79:2271的连接转发到10.8.8.71:22,并进行SSH日志记录
# firewall-cmd --permanent --zone=public --add-forward-port='port=2271:proto=tcp:toport=22:toaddr=10.8.8.71'
# firewall-cmd --permanent --zone=public --add-rich-rule='rule service name=ssh log prefix="SSH_" level="debug" limit value=1/m reject'
# firewall-cmd --reload
普通配置示例
# 创建linuxea区域
firewall-cmd --permanent --new-zone=linuxea
firewall-cmd --reload
-
删除zone只需要删除/etc/firewalld/zones下的zone命名的xml文件而后重新加载即可
# 修改默认域为linuxea firewall-cmd --set-default-zone=linuxea # 放行https,http firewall-cmd --permanent --zone=linuxea --add-service={http,https} # 运行172.16.100.101登录ssh firewall-cmd --permanent --zone=linuxea --add-rich-rule='rule family="ipv4" source address="172.16.100.101" port port="22" protocol="tcp" accept' # 允许10.100.10.0/24网段访问8080端口 firewall-cmd --permanent --zone=linuxea --add-rich-rule='rule family="ipv4" source address="10.100.10.0/24" port port="8080" protocol="tcp" accept' # 拒绝10.100.100.4访问80端口 firewall-cmd --permanent --zone=linuxea --add-rich-rule='rule family="ipv4" source address="10.100.100.4" port port="80" protocol="tcp" drop'
# 重载
LinuxEA # firewall-cmd --reload
success
# 查看规则
LinuxEA # firewall-cmd --list-all
linuxea (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="172.16.100.101" port port="22" protocol="tcp" accept
rule family="ipv4" source address="10.100.100.4" port port="80" protocol="tcp" drop
rule family="ipv4" source address="10.100.10.0/24" port port="8080" protocol="tcp" accept
紧急模式
firewall-cmd --panic-on 执行端口所有连接
firewall-cmd --panic-off 关闭
firewall-cmd --query-panic 查询