荣耀之链论坛

 找回密码
 立即注册
搜索
查看: 3334|回复: 4

CentOS7使用firewalld

[复制链接]

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
发表于 2018-6-15 16:00 | 显示全部楼层 |阅读模式
1、firewalld的基本使用
启动: systemctl start firewalld
查看状态: systemctl status firewalld
开机自动启动: systemctl enable firewalld
停止: systemctl disable firewalld
禁用: systemctl stop firewalld

2.systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed

3.配置firewalld-cmd

查看版本: firewall-cmd --version
查看帮助: firewall-cmd --help
显示状态: firewall-cmd --state
查看所有打开的端口: firewall-cmd --zone=public --list-ports
更新防火墙规则: firewall-cmd --reload
查看区域信息:  firewall-cmd --get-active-zones
查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0
拒绝所有包:firewall-cmd --panic-on
取消拒绝状态: firewall-cmd --panic-off
查看是否拒绝: firewall-cmd --query-panic

4.全新的firewalld的默认规则是
允许RELATED,ESTABLISHED
禁止INVALID
允许icmp
允许ssh协议(默认的是22端口,不确定修改了ssh的config文件会不会自动修改防火墙允许的端口,我个人认为直接修改config文件的方式不会,但是最新的版本应该提供了命令修改ssh端口的方式,用那个方式修改的应该就可以自动更新防火墙端口)
其他全部drop的





下面是具体的使用方法:常用的都在这里了,不常用的命令可以翻手册

查看所有设置
firewall-cmd --list-all

查看开启的服务或者端口(一般不用这个命令)
firewall-cmd --permanent --zone=public --list-services
firewall-cmd --permanent --zone=public --list-ports

重新加载防火墙而不丢失状态信息
firewall-cmd --reload
如果您正在使用--complete-reload,则状态信息将丢失。这个选项只能用于遇到严重的防火墙问题时,例如,如果存在状态信息问题,即无法建立连接但防火墙规则正确

查看所有的zone(带已启用功能)(一般不用这个命令)
firewall-cmd --list-all-zones
firewall-cmd --zone=public --list-all #(这个命令也很少用)

获取网络连接的默认zone
firewall-cmd --get-default-zone


--permanent 这个参数表示永久 如果加了永久,新添加的项目需要reload才会生效

添加服务
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=mysql
系统服务所在目录
/usr/lib/firewalld/services/ssh.xml
自定义服务所在目录
vi /etc/firewalld/services/8080.xml   #服务的读取顺序是先自定义再系统,如果有重名的则只使用自定义的
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>8080 test这里应该可以随便填写</short>
  <description>描述,这个随便写</description>
  <port protocol="tcp" port="8080"/>
</service>
添加完自定义服务以后可以用上面的添加服务的方式添加防火墙,匹配文件名字
firewall-cmd --permanent --zone=public --add-service=8080
如果要修改系统服务的端口,先cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/再vi /etc/firewalld/services/ssh.xml 这样做的好处是不破话默认文件,万一改错了可以找回来
查询所有的系统服务
firewall-cmd --get-services


添加端口  #一般不建议直接添加端口,建议还是做成服务文件
firewall-cmd --permanent --zone=public --add-port=3306/tcp


端口转发 把2230号端口转发到127.0.0.2的2230端口    firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
firewall-cmd --permanent --add-forward-port=port=2230:proto=tcp:toaddr=127.0.0.2:toport=2230
查询是否有这条端口转发
firewall-cmd --query-forward-port=port=2230:proto=tcp:toaddr=127.0.0.2:toport=2230 #这里就不需要加--permanent了
删除这条端口转发
firewall-cmd --permanent --remove-forward-port=port=2230:proto=tcp:toaddr=127.0.0.2:toport=2230
添加了端口转发可以用iptables -t nat -n -v -L查看,在Chain PRE_public_allow这个链里面


设置某个ip 访问某个服务 ip 192.168.0.4/24访问http
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.4/24" service name="http" accept"



禁止某个IP访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.4/24" drop'

删除规则 基本上就是把添加的命令里面的add改为remove 同样的--permanent 这个参数表示永久
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.0.4/24" service name="http" accept"
firewall-cmd --permanent --zone=public --remove-port=3306/tcp
firewall-cmd --permanent --zone=public --remove-service=http
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.0.4/24" drop'



启用路由功能 可以使用--permanent参数
firewall-cmd [--zone=<zone>] --add-masquerade
firewall-cmd [--zone=<zone>] --remove-masquerade
firewall-cmd [--zone=<zone>] --query-masquerade






查看接口所在的zone 一般来说什么都不做的默认情况下就是public
firewall-cmd --get-zone-of-interface=eth0
firewall-cmd --get-active-zones

回复

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2018-6-15 16:11 | 显示全部楼层
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2018-8-17 01:27 | 显示全部楼层
在CentOS7开始,默认是没有iptables的,而是使用了firewall防火墙.
与时俱进,简单的整理了一下firewall的使用方法.
关于详细的介绍参考官网,就不搬字了.这个网站有中文选项.可以直接看中文.关于CentOS7 非常多是资料这里面都能找到.
官方文档地址:

https://access.redhat.com/docume ... uction_to_firewalld

正文开始
FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。

什么是动态防火墙?

我们首先需要弄明白的第一个问题是到底什么是动态防火墙。为了解答这个问题,我们先来回忆一下 iptables service 管理防火墙规则的模式:用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,再执行命令 service iptables reload 使变更的规则生效。在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。

如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。

这里有必要说明一下 firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。
什么是区域(zone)?

firewalld将网卡对应到不同的区域(zone),zone 默认共有9个,block dmz drop external home internal public trusted work.
不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public.
在最新版本的fedora(fedora21)当中随着 server 版和 workstation 版的分化则添加了两个不同的自定义 zone FedoraServer 和 FedoraWorkstation 分别对应两个版本。
使用下面的命令分别列出所有支持的 zone 和查看当前的默认 zone:

[root@test ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@test ~]# firewall-cmd --get-default-zone
public
区域(zone)说明如下:
iptables service 在 /etc/sysconfig/iptables 中储存配置
firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里

在/etc/firewalld/的区域设定是一系列可以被快速执行到网络接口的预设定。列表并简要说明如下:

drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共)
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
可接受所有的网络连接。
指定其中一个区域为默认区域是可行的。当接口连接加入了 NetworkManager,它们就被分配为默认区域。安装时,firewalld 里的默认区域被设定为公共区域。
什么是服务?

在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等.
与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70+ 种服务供我们使用.
当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中.
service 配置的好处显而易见:
第一,通过服务名字来管理规则更加人性化,
第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。
每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:

[root@test ~]# firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
[root@test ~]# firewall-cmd --list-services
dhcpv6-client ssh
动态添加一条防火墙规则如下:
假设自定义的 ssh 端口号为 12222,使用下面的命令来添加新端口的防火墙规则:

firewall-cmd --add-port=12222/tcp --permanent
如果需要使规则保存到 zone 配置文件,则需要加参数 –permanent
举例如下:

[root@test zones]# firewall-cmd --add-port=12222/tcp
success
[root@test zones]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
</zone>
[root@test zones]# firewall-cmd --add-port=12222/tcp --permanent
success
[root@test zones]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<port protocol="tcp" port="12222"/>
</zone>
# 注意:防火墙配置文件也可以手动修改,修改后记得重载,重载方法请看下文.

#####firewalld命令#####

# 关闭firewalld
[root@test zones]# systemctl stop firewalld.service

# 启动firewalld
[root@test zones]# systemctl start firewalld.service

# 把firewalld加入到系统服务
[root@test zones]# systemctl enable firewalld.service

# 从系统服务移除
[root@test zones]# systemctl disable firewalld.service
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'

# 查看firewalld状态 两种方法2选1即可
[root@test zones]# firewall-cmd --state
running
[root@test zones]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Tue 2015-10-06 11:49:06 CST; 2s ago
Main PID: 21716 (firewalld)
CGroup: /system.slice/firewalld.service
└─21716 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Oct 06 11:49:06 test systemd[1]: Starting firewalld - dynamic firewall daemon...
Oct 06 11:49:06 test systemd[1]: Started firewalld - dynamic firewall daemon.
# 重读防火墙
# 以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@test ~]# firewall-cmd --reload
success
# 以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@test ~]# firewall-cmd --complete-reload
success
# 注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

# 获取支持的区域(zone)列表

[root@test zones]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 获取所有支持的服务

[root@test zones]# firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
# 获取所有支持的ICMP类型

[root@test zones]# firewall-cmd --get-icmptypes
destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded
# 列出全部启用的区域的特性

[root@test zones]# firewall-cmd --list-all-zones
# 输出格式是:
<zone>
interfaces: <interface1> ..
services: <service1> ..
ports: <port1> ..
forward-ports: <forward port1> ..
icmp-blocks: <icmp type1> ..
# 输出区域 <zone> 全部启用的特性。如果生略区域,将显示默认区域的信息。
firewall-cmd [--zone=<zone>] –list-all

[root@test zones]# firewall-cmd --list-all
public (default, active)
interfaces: eno16777736
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[root@test zones]# firewall-cmd --zone=work --list-all
work
interfaces:
sources:
services: dhcpv6-client ipp-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
# 获取默认区域的网络设置

[root@test zones]# firewall-cmd --get-default-zone
public
# 设置默认区域

[root@test zones]# firewall-cmd --set-default-zone=work
success
# 注意:流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。

# 获取活动的区域

[root@test zones]# firewall-cmd --get-active-zones
work
interfaces: eno16777736
# 根据接口获取区域
firewall-cmd –get-zone-of-interface=<interface>

[root@test zones]# firewall-cmd --get-zone-of-interface=eno16777736
public
## 以下关于区域和接口的操作,就不一一举例了,可以根据实际情况修改.
# 将接口增加到区域

firewall-cmd [--zone=<zone>] --add-interface=<interface>
# 如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接口在重新加载后将重新应用。

# 修改接口所属区域

firewall-cmd [--zone=<zone>] --change-interface=<interface>
# 这个选项与 –add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接口将被添加到新的区域。

# 从区域中删除一个接口

firewall-cmd [--zone=<zone>] --remove-interface=<interface>
# 查询区域中是否包含某接口

firewall-cmd [--zone=<zone>] --query-interface=<interface>
# 注意:返回接口是否存在于该区域。没有输出。

# 列举区域中启用的服务

firewall-cmd [ --zone=<zone> ] --list-services
# 这两条简单点说,就是断网和连网.
# 启用应急模式阻断所有网络连接,以防出现紧急状况

firewall-cmd --panic-on
# 禁用应急模式

firewall-cmd --panic-off
# 查询应急模式

firewall-cmd --query-panic
# 启用区域中的一种服务

firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>]
# 此举启用区域中的一种服务。如果未指定区域,将使用默认区域。如果设定了超时时间,服务将只启用特定秒数。如果服务已经活跃,将不会有任何警告信息。
# 例: 使区域中的 ipp-client 服务生效60秒:

firewall-cmd --zone=home --add-service=ipp-client --timeout=60
# 例: 启用默认区域中的http服务:

firewall-cmd --add-service=http
# 禁用区域中的某种服务

firewall-cmd [--zone=<zone>] --remove-service=<service>
# 此举禁用区域中的某种服务。如果未指定区域,将使用默认区域。
# 例: 禁止 home 区域中的 http 服务:

firewall-cmd --zone=home --remove-service=http
# 区域种的服务将被禁用。如果服务没有启用,将不会有任何警告信息。

# 查询区域中是否启用了特定服务

firewall-cmd [--zone=<zone>] --query-service=<service>
# 如果服务启用,将返回1,否则返回0。没有输出信息。

# 启用区域端口和协议组合

firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]
# 此举将启用端口和协议的组合。端口可以是一个单独的端口 <port> 或者是一个端口范围 <port>-<port> 。协议可以是 tcp 或 udp。

# 禁用端口和协议组合

firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
# 查询区域中是否启用了端口和协议组合

firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>
# 如果启用,此命令将有返回值。没有输出信息。

# 启用区域中的 IP 伪装功能

firewall-cmd [--zone=<zone>] --add-masquerade
# 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。

# 禁用区域中的 IP 伪装

firewall-cmd [--zone=<zone>] --remove-masquerade
# 查询区域的伪装状态

firewall-cmd [--zone=<zone>] --query-masquerade
# 如果启用,此命令将有返回值。没有输出信息。

# 启用区域的 ICMP 阻塞功能

firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype>
# 此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文,以及错误应答。

# 禁止区域的 ICMP 阻塞功能

firewall-cmd [--zone=<zone>] --remove-icmp-block=<icmptype>
# 查询区域的 ICMP 阻塞功能

firewall-cmd [--zone=<zone>] --query-icmp-block=<icmptype>
# 如果启用,此命令将有返回值。没有输出信息。
# 例: 阻塞区域的响应应答报文:

firewall-cmd --zone=public --add-icmp-block=echo-reply
# 在区域中启用端口转发或映射

firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
# 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。

# 禁止区域的端口转发或者端口映射

firewall-cmd [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
# 查询区域的端口转发或者端口映射

firewall-cmd [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
# 如果启用,此命令将有返回值。没有输出信息。
# 例: 将区域 home 的 ssh 转发到 127.0.0.2

firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2
# 处理永久区域
# 永久选项不直接影响运行时的状态。这些选项仅在重载或者重启服务时可用。为了使用运行时和永久设置,需要分别设置两者。 选项 –permanent 需要是永久设置的第一个参数。

# 获取永久选项所支持的服务

firewall-cmd --permanent --get-services
# 获取永久选项所支持的ICMP类型列表

firewall-cmd --permanent --get-icmptypes
# 获取支持的永久区域

firewall-cmd --permanent --get-zones
# 启用区域中的服务

firewall-cmd --permanent [--zone=<zone>] --add-service=<service>
# 此举将永久启用区域中的服务。如果未指定区域,将使用默认区域。

# 禁用区域中的一种服务

firewall-cmd --permanent [--zone=<zone>] --remove-service=<service>
# 查询区域中的服务是否启用

firewall-cmd --permanent [--zone=<zone>] --query-service=<service>
# 如果服务启用,此命令将有返回值。此命令没有输出信息。
# 例: 永久启用 home 区域中的 ipp-client 服务

firewall-cmd --permanent --zone=home --add-service=ipp-client
# 永久启用区域中的一个端口-协议组合

firewall-cmd --permanent [--zone=<zone>] --add-port=<port>[-<port>]/<protocol>
# 永久禁用区域中的一个端口-协议组合

firewall-cmd --permanent [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
# 查询区域中的端口-协议组合是否永久启用

firewall-cmd --permanent [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>
# 如果服务启用,此命令将有返回值。此命令没有输出信息。

# 例: 永久启用 home 区域中的 https (tcp 443) 端口

firewall-cmd --permanent --zone=home --add-port=443/tcp
# 永久启用区域中的伪装

firewall-cmd --permanent [--zone=<zone>] --add-masquerade
# 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。

# 永久禁用区域中的伪装

firewall-cmd --permanent [--zone=<zone>] --remove-masquerade
# 查询区域中的伪装的永久状态

firewall-cmd --permanent [--zone=<zone>] --query-masquerade
# 如果服务启用,此命令将有返回值。此命令没有输出信息。

# 永久启用区域中的ICMP阻塞

firewall-cmd --permanent [--zone=<zone>] --add-icmp-block=<icmptype>
# 此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文或错误应答报文。

# 永久禁用区域中的ICMP阻塞

firewall-cmd --permanent [--zone=<zone>] --remove-icmp-block=<icmptype>
# 查询区域中的ICMP永久状态

firewall-cmd --permanent [--zone=<zone>] --query-icmp-block=<icmptype>
# 如果服务启用,此命令将有返回值。此命令没有输出信息。
# 例: 阻塞公共区域中的响应应答报文:

firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply
# 在区域中永久启用端口转发或映射

firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
# 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。

# 永久禁止区域的端口转发或者端口映射

firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
# 查询区域的端口转发或者端口映射状态

firewall-cmd --permanent [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
# 如果服务启用,此命令将有返回值。此命令没有输出信息。
# 例: 将 home 区域的 ssh 服务转发到 127.0.0.2

firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2
## 直接选项
# 直接选项主要用于使服务和应用程序能够增加规则。 规则不会被保存,在重新加载或者重启之后必须再次提交。传递的参数 <args> 与 iptables, ip6tables 以及 ebtables 一致。
# 选项 –direct 需要是直接选项的第一个参数。
# 将命令传递给防火墙。参数 <args> 可以是 iptables, ip6tables 以及 ebtables 命令行参数。

firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args>
# 为表 <table> 增加一个新链 <chain> 。

firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain>
# 从表 <table> 中删除链 <chain> 。

firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain>
# 查询 <chain> 链是否存在与表 <table>. 如果是,返回0,否则返回1.

firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain>
# 如果启用,此命令将有返回值。此命令没有输出信息。

# 获取用空格分隔的表 <table> 中链的列表。

firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table>
# 为表 <table> 增加一条参数为 <args> 的链 <chain> ,优先级设定为 <priority>。

firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>
# 从表 <table> 中删除带参数 <args> 的链 <chain>。

firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args>
# 查询 带参数 <args> 的链 <chain> 是否存在表 <table> 中. 如果是,返回0,否则返回1.

firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args>
# 如果启用,此命令将有返回值。此命令没有输出信息。

# 获取表 <table> 中所有增加到链 <chain> 的规则,并用换行分隔。

firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>
##########

#####通过配置文件来使用Firewalld的方法#####
系统本身已经内置了一些常用服务的防火墙规则,存放在/usr/lib/firewalld/services/
注意!
请勿编辑/usr/lib/firewalld/services/ ,只有 /etc/firewalld/services 的文件可以被编辑。

[root@test ~]# ls /usr/lib/firewalld/services/
amanda-client.xml dhcpv6.xml high-availability.xml ipp-client.xml kpasswd.xml libvirt.xml mysql.xml pmcd.xml pop3s.xml RH-Satellite-6.xml smtp.xml tftp.xml
bacula-client.xml dhcp.xml https.xml ipp.xml ldaps.xml mdns.xml nfs.xml pmproxy.xml postgresql.xml rpc-bind.xml ssh.xml transmission-client.xml
bacula.xml dns.xml http.xml ipsec.xml ldap.xml mountd.xml ntp.xml pmwebapis.xml proxy-dhcp.xml samba-client.xml telnet.xml vnc-server.xml
dhcpv6-client.xml ftp.xml imaps.xml kerberos.xml libvirt-tls.xml ms-wbt.xml openvpn.xml pmwebapi.xml radius.xml samba.xml tftp-client.xml wbem-https.xml
以下例子均以系统自带的public zone 为例子.

1. 如果想开放80端口供外网访问http服务,例子如下

1.1 将 http.xml复制到/etc/firewalld/services/下面,以服务形式管理防火墙,
# 这个cp命令其实是可以省略的,系统会优先去读取 /etc/firewalld 里面的文件,读取完毕后,会去/usr/lib/firewalld/services/ 再次读取.为了方便修改和管理,建议复制到/etc/firewalld

[root@test ~]# cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/
[root@test ~]# ls /etc/firewalld/services/
http.xml
[root@test ~]# ls /etc/firewalld/zones/
public.xml public.xml.old
1.2 修改public.xml,加入http服务

cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<service name="http"/> # 这行是后加的,要匹配 /etc/firewalld/services/文件夹下的文件名
</zone>
1.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@test ~]# firewall-cmd --reload
success
以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@test ~]# firewall-cmd --complete-reload
success
注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

2. 修改防火墙ssh的端口方法
2.1 复制ssh.xml文件到/etc/firewalld/services/

[root@test ~]# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
2.2 修改ssh.xml文件 12222为ssh端口

[root@test ~]# cat /etc/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="12222"/>
</service>
2.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@test ~]# firewall-cmd --reload
success
以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@test ~]# firewall-cmd --complete-reload
success
注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

3. 指定ip访问ssh端口
3.1 修改/etc/firewalld/zones/

# rule字段内为要限制的ip和使用的服务

[root@test ~]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>

<rule family="ipv4">
<source address="192.168.23.1"/>
<service name="ssh"/>
<accept/>
</rule>

</zone>
3.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@test ~]# firewall-cmd --reload
success
以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@test ~]# firewall-cmd --complete-reload
success
注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

4. 添加自定义服务 举例,添加8080端口为新的Service
4.1 添加新文件 8080.xml

cat /etc/firewalld/services/8080.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>8080 Test</short>
<description>此处为文字说明</description>
<port protocol="tcp" port="8080"/>
</service>
4.2 编辑public.xml 文件,加入相应的Server

cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<service name="8080"/> # 这行是后加的,要匹配 /etc/firewalld/services/8080.xml 文件名
</zone>
4.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@test ~]# firewall-cmd --reload
success
以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

[root@test ~]# firewall-cmd --complete-reload
success
注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

#####
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2018-8-25 16:43 | 显示全部楼层
ipset的使用
https://blog.csdn.net/github_36904248/article/details/82012579


一、ipset概述
ipset与iptable
· iptables是在Linux内核中配置防火墙规则的用户空间工具。在内核版本更新到2.4以来,iptable一直作为系统中主要的防火墙解决方案。CentOS7将原来的iptable替换为firewall,而firewall提供了对ipset的支持。
· ipset相当于iptable的扩展,它和iptable 处理方式,iptable通过链表线性存储然后遍历来实现匹配。而ipset通过通过索引的数据结构设计达到快速匹配。这种设计使得当set配置比较庞大的时候,也可以高效地进行匹配。

适用范围
· 存储多个IP地址或端口号,并在一个swoop中与iptables的集合相匹配;
· 在不影响性能的同时,针对IP地址或端口的变化动态更新iptables规则;
· 性能高,用一个iptables规则来表示复杂的IP地址和端口

安装
在CentOS7更新firewalld到最新版本,即可使用ipset,更新安装命令:
1
2
yum install firewalld
1
二、ipset使用
利用firewall-cmd对ipset进行操作
ipset的存储路径:/etc/firewalld/ipsets

命令集合:

获取指定ipset信息

firewall-cmd --info-ipset=[ipset_name]
1
增加ipset

firewall-cmd --permanent --new-ipset=[ipset_name] --type=[type] --option
1
其中option可不填,eg:–option=family=inet6指定该ipset使用IPV6地址。

删除指定ipset

firewall-cmd --permanent --delete-ipset=[ipset_name]
1
删除后,在ipset目录下会有一个备份文件,例如:原来的ipset为test_set.xml,则删除后会生成一个test_set.xml.old.

指定ipset中增加entry

firewall-cmd --permanent --ipset=[ipset_name] --add-entry=[xx.xx.xx.xx]
1
指定ipset中删除entry

firewall-cmd --permanent --ipset=[ipset_name] --remove-entry=[xx.xx.xx.xx]
1
删除entry
–permanent参数直接决定是否永久生效 需要执行firewall-cmd –reload,使其生效
不加–permanent是直接生效(runtime environment),不会保存在相应的ipset的XML文件中,重启firewalld服务将会失效

IPSet Options
–get-ipset-types Print the supported ipset types
–new-ipset=<ipset> –type=<ipset type> [–option=<key>[=<value>]]..
Add a new ipset [P only]
–new-ipset-from-file=<filename> [–name=<ipset>]
Add a new ipset from file with optional name [P only]
–delete-ipset=<ipset>
Delete an existing ipset [P only]
–load-ipset-defaults=<ipset>
Load ipset default settings [P only]
–info-ipset=<ipset> Print information about an ipset
–path-ipset=<ipset> Print file path of an ipset [P only]
–get-ipsets Print predefined ipsets
–ipset=<ipset> –set-description=<description>
Set new description to ipset [P only]
–ipset=<ipset> –get-description
Print description for ipset [P only]
–ipset=<ipset> –set-short=<description>
Set new short description to ipset [P only]
–ipset=<ipset> –get-short
Print short description for ipset [P only]
–ipset=<ipset> –add-entry=<entry>
Add a new entry to an ipset [P]
–ipset=<ipset> –remove-entry=<entry>
Remove an entry from an ipset [P]
–ipset=<ipset> –query-entry=<entry>
Return whether ipset has an entry [P]
–ipset=<ipset> –get-entries
List entries of an ipset [P]
–ipset=<ipset> –add-entries-from-file=<entry>
Add a new entries to an ipset [P]
–ipset=<ipset> –remove-entries-from-file=<entry>
Remove entries from an ipset [P]

三、ipset类型的区别
1、hash:ip

2、 hash:ip,mark

3、hash:ip,port

4、hash:ip,port,ip

5、hash:ip,port,net

6、 hash:mac

7、hash:net

8、hash:net,iface

9、hash:net,net

10、hash:net,port

11、hash:net,port,net

参考文献
1、https://www.linuxjournal.com/con ... onfigurations-ipset
2、https://firewalld.org/2015/12/ipset-support
3、https://firewalld.org/documentation/man-pages/firewalld.ipset
回复 支持 反对

使用道具 举报

1326

主题

2373

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10267
 楼主| 发表于 2023-12-9 05:33 | 显示全部楼层
不要用trusted

这个zone类型有问题  我实测把网卡改为trusted 经常出莫名其妙的问题

改为public 然后手动放行防火墙以后就再也没出过问题了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

荣耀之链

GMT+8, 2025-6-18 05:16 , Processed in 0.015083 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表