CentOS7 防火墙配置-详解

时间:2021-11-23 20:10:44

CentOS 7 防火墙配置

1、防火墙的简述

防火墙对服务器起到一定的保护作用,所以了解一些相关的操作是很有必要的。

在CentOS 7.x中,有了一种新的防火墙策略叫FireWall , 在6.x中用的是iptables。

Centos 7 中防火墙是一个非常的强大的功能了, Firewalld 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态 防火墙管理工具。它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配 置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。

防火墙守护 firewalld 服务引入了一个信任级别的概念来管理与之相关联的连接与接口。它支持 ipv4 与 ipv6,并支持网桥,采用 firewall-cmd (command) 或 firewall-config (gui) 来动态的管理 kernel netfilter 的临时或永久的接口规则,并实时生效而无需重启服务。

Firewall 能将不同的网络连接归类到不同的信任级别,Zone 提供了以下几个级别

drop: 丢弃所有进入的包,而不给出任何响应
block: 拒绝所有外部发起的连接,允许内部发起的连接
public: 允许指定的进入连接
external: 同上,对伪装的进入连接,一般用于路由转发
dmz: 允许受限制的进入连接
work: 允许受信任的计算机被限制的进入连接,类似 workgroup
home: 同上,类似 homegroup
internal: 同上,范围针对所有互联网用户
trusted: 信任所有连接

2、 图形化和命令行

你可以通过图形界面工具 firewall-config 或者命令行客户端 firewall-cmd
启用或者关 闭防火墙特性。

  • 在CentOS 7.x中,防火墙的基本命令是 firewall-cmd
  • 命令行方式

使用命令行工具 firewall-cmd 支持全部防火墙特性。 使用它,只需要如下yum安装firewalld(实际我们不需要安装,默认已经装好了)

[root@localhost ~]# yum
install firewalld -y
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# rpm -ql  firewalld | grep '/usr/bin/firewall-cmd'
/usr/bin/firewall-cmd
[root@localhost ~]# firewall-cmd --state
running

  • 图形化界面方式

如果需要图形界面的话,要安装firewalld还需要再安装firewall-config的rpm包,

[root@localhost ~]# yum
install firewalld firewall-config -y

3、 查看帮助文档

先通过man
firewall-cmd 来简单看看它的帮助文档。

[root@localhost ~]# man
firewall-cmd
[root@localhost ~]# firewall-cmd --help          # 或 firewall-cmd -h
[root@localhost ~]# firewall-cmd --version    查看防火墙版本

4、 状态|启动|停止|重启

4.1 查看防火墙状态

  • 查看方式1:

[root@localhost ~]#
firewall-cmd --state

# remark:如果终端输出running就表示防火墙已经开启了,反之就没有。

  • 查看方式2:

[root@localhost ~]# systemctl
status firewalld

# remark:如果终端输出有Active: active (running)就表示防火墙已经开启了,反之就没有。

4.2 添加开机启动

[root@localhost ~]# systemctl
enable firewalld # 开机启动
[root@localhost ~]# systemctl disable firewalld
# 取消开机启动

[root@localhost ~]# systemctl
is-enabled firewalld      #查看服务是否开机启动
[root@localhost ~]# systemctl list-unit-files|grep
enabled  #查看已启动的服务列表
[root@localhost ~]# systemctl --failed                 
#查看启动失败的服务列表

4.3 启动防火墙

[root@localhost ~]# systemctl
start firewalld

4.4 停止防火墙

[root@localhost ~]# systemctl
stop firewalld

4.5 重启防火墙

  • 方式1,建议用此方法,会重新加载配置

[root@localhost ~]#
firewall-cmd --reload     # 更新规则,不重启服务,用此条命令即可
[root@localhost ~]#  firewall-cmd --complete-reload # 更新规则,重启服务,一般不用此条命令

  • 方式2

[root@localhost ~]# systemctl
restart firewalld

5、查已有配置和端口

5.1 命令查看配置

[root@localhost ~]#
firewall-cmd --list-all
#如果要查看指定级别则用firewall-cmd --zone=public --list-all
public
  target:
default
 
icmp-block-inversion: no
 
interfaces:
 
sources:
 
services: ssh dhcpv6-client
  ports:
80/tcp
 
protocols:
 
masquerade: no
 
forward-ports:
 
source-ports:
 
icmp-blocks:
  rich
rules:
    rule
family="ipv4" source address="122.144.131.91" port
port="111" protocol="tcp" accept
    rule
family="ipv4" source address="180.168.69.242" port
port="2200" protocol="tcp" accept
    rule
family="ipv4" source address="27.115.59.166" port
port="2200" protocol="tcp" accept
    rule
family="ipv4" source address="122.144.131.90" port
port="2200" protocol="tcp" accept
    rule
family="ipv4" source address="122.144.208.19" port
port="10050" protocol="tcp" accept

5.2 配置文件查看

[root@localhost ~]# 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="ssh"/>
 
<service name="dhcpv6-client"/>
 
<port protocol="tcp" port="80"/>
 
<rule family="ipv4">
   
<source address="122.144.131.91"/>
   
<port protocol="tcp" port="111"/>
   
<accept/>
 
</rule>
 
<rule family="ipv4">
   
<source address="180.168.69.242"/>
   
<port protocol="tcp" port="2200"/>
   
<accept/>
 
</rule>
 
<rule family="ipv4">
   
<source address="27.115.59.166"/>
   
<port protocol="tcp" port="2200"/>
   
<accept/>
 
</rule>
 
<rule family="ipv4">
   
<source address="122.144.131.90"/>
   
<port protocol="tcp" port="2200"/>
   
<accept/>
 
</rule>
 
<rule family="ipv4">
   
<source address="122.144.208.19"/>
   
<port protocol="tcp" port="10050"/>
   
<accept/>
 
</rule>
</zone>

5.3 查看已开放的端口

  • 方式1:查看所有已经开放端口,注意这里不会把开放的特定IP+特定端口的列出来,要想全部列出来则用上面的firewall-cmd --list-all,

[root@localhost ~]#
firewall-cmd --list-ports
80/tcp

  • 方式2:查看特定已经开放的端口

执行下面的命令后,如果指定的端口已经开放就会输出yes,反之就输出no

[root@localhost ~]#
firewall-cmd --zone=public --query-port=81/tcp

6、添加和删除端口

这一步的操作就好比在Windows上的防火墙中新建一个入站规则。

6.1 添加单独端口add

只添加一个单独的端口(示例为81) ,注:如果是udp则把tcp改为udp即可,注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --zone=public --add-port=81/tcp --permanent
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

6.2 添加连续端口add

添加一组连续的端口(示例为82到85) ,注:如果是udp则把tcp改为udp即可,注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --zone=public --add-port=82-85/tcp --permanent
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

6.3 删除端口remove

只是把添加端口命令中add改为remove即可删除,其它的都不用动,注:如果是udp则把tcp改为udp即可,

注意:这里有--permanent

[root@localhost ~]# firewall-cmd
--list-all   #先查看一下开放的规则和端口
[root@localhost ~]# firewall-cmd --zone=public
--remove-port=81/tcp --permanent
[root@localhost ~]# firewall-cmd --zone=public
--remove-port=82-85/tcp --permanent
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

7、添加特定IP+特定端口

7.1 添加特定IP+单个端口add

注:如果是udp则把tcp改为udp即可,注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --permanent --add-rich-rule="rule family="ipv4"
source address="122.144.131.91/24" port protocol="tcp"
port="111" accept"

7.2 添加特定IP+多个端口add

注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --permanent --add-rich-rule="rule family="ipv4"
source address="122.144.131.91/24" port protocol="tcp" port="4001-4004"
accept"
[root@localhost ~]# firewall-cmd --permanent
--add-rich-rule="rule family="ipv4" source
address="192.168.142.166" port protocol="tcp"
port="10-51000" accept"

7.3 删除IP+端口规则remove

只需要把其中的add改为remove即可,其它的都不用动,注:如果是udp则把tcp改为udp即可,注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --list-all   #先查看一下开放的规则和端口
[root@localhost ~]# firewall-cmd --permanent
--remove-rich-rule="rule family="ipv4" source
address="122.144.131.91/24" port protocol="tcp"
port="111" accept"
[root@localhost ~]# firewall-cmd --permanent
--remove-rich-rule="rule family="ipv4" source
address="122.144.131.91/24" port protocol="tcp"
port="4001-4004" accept"
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

8、查看Zone区域信息

8.1 查看已被激活的Zone

[root@localhost ~]#
firewall-cmd --get-default-zone  #查看默认区域
public
[root@localhost ~]# firewall-cmd
--get-active-zones  #查看已被激活的Zone
public
 
interfaces: em1

8.2 查看指定接口的Zone

[root@localhost ~]#
firewall-cmd --get-zone-of-interface=em1
public

8.3 查看指定级别的接口

[root@localhost ~]#
firewall-cmd --zone=public --list-interfaces
em1

8.4
查看指定级别的所有信息

[root@localhost ~]#
firewall-cmd --zone=public --list-all #查看所有级别firewall-cmd --list-all

8.5 查看所有级别被允许的信息

[root@localhost ~]#
firewall-cmd --get-service
[root@localhost ~]# firewall-cmd --get-service
--permanent  #查重启后所有Zones级别中被允许的服务

8.6
更改所属区域

显示所有公共区域(public)

[root@localhost ~]#
firewall-cmd --zone=public --list-all

临时修改网络接口(enp0s3)为内部区域(internal),注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --zone=internal --change-interface=enp03s
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

永久修改网络接口enp03s为内部区域(internal),注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --permanent --zone=internal --change-interface=enp03s
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

9、端口转发

9.1
配置 ip 地址伪装

注意:这里有--permanent

#查看伪装
[root@localhost ~]# firewall-cmd
--zone=external --query-masquerade

#打开伪装
[root@localhost ~]# firewall-cmd --permanent
--zone=external --add-masquerade
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

#关闭伪装
[root@localhost ~]# firewall-cmd --permanent
--zone=external --remove-masquerade
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

9.2
端口转发

第一步:要进行端口转发,则首先需要开启伪装,注意:如果不开启伪装IP,端口转发会失败,如果要删除则把add改为remove即可,注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --permanent --zone=external --add-masquerade
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

然后,转发 tcp 22 端口至 3753,如果要删除则把add改为remove即可,注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --permanent --zone=external
--add-forward-port=port=22:proto=tcp:toport=3753
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

转发 22 端口数据至另一个 ip 的相同端口上,如果要删除则把add改为remove即可,注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.100
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

转发 22 端口数据至另一 ip 的 2055 端口上,如果要删除则把add改为remove即可,注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --permanent --zone=external
--add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.100
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

10、服务管理

一些服务,对应多个端口,在防火墙允许某项服务则可能意味着允许该服务对应的多个端口,

10.1 查看所有服务

[root@localhost ~]#
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client
bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc
ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns
docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps
freeipa-replication freeipa-trust ftp ganglia-client ganglia-master
high-availability http https imap imaps ipp ipp-client ipsec iscsi-target
kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls
managesieve mdns mosh mountd ms-wbt mssql mysql nfs nfs3 nrpe ntp openvpn
ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi
pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster
quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp
smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog
syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm
vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

10.2
查看当前允许的服务

! 特别注意:比如下面的ssh服务已经被允许开放,那么sshd对应的端口比如有两个端口22号端口和2200端口则就会被外部允许访问,即使防火墙这两个端口没有开放,也是可以访问的!!

[root@localhost ~]#
firewall-cmd --list-services --zone=public  #查看所有被允许开放的服务
ssh dhcpv6-client
[root@localhost ~]# firewall-cmd
--query-service=http --zone=public    #查看特定的服务是否开放

10.3 给区域添加服务add

注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --add-service=ftp --zone=public 
--permanent
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

10.4 删除区域服务remove

将add改为remove即可,注意:这里有--permanent

[root@localhost ~]#
firewall-cmd --remove-service=ftp --zone=public 
--permanent
[root@localhost ~]# firewall-cmd --reload #此步不能少,必须重新加载配置才能生效
[root@localhost ~]# firewall-cmd --list-all   #查看是否已生效
[root@localhost ~]# firewall-cmd --list-ports #查看是否已生效

11、应急模式

11.1
应急模式阻断所有网络

启动应急模式阻断所有网络连接,以防出现紧急状况,注意:此情况会断开所有的网络连接,远程连接勿使用

[root@localhost ~]#
firewalld-cmd --panic-on

11.2 禁用应急模式

[root@localhost ~]#
firewalld-cmd --panic-off

11.3 查询应急模式

[root@localhost ~]#
firewalld-cmd --query-panic