0%

CentOS7 Firewall防火墙的简单使用

FirewallD 是 CentOS 7 服务器上默认可用的防火墙管理工具。基本上,它是 iptables 的封装,有图形配置工具 firewall-config 和命令行工具 firewall-cmd。使用 iptables 服务,每次改动都要求刷新旧规则,并且从 /etc/sysconfig/iptables 读取新规则,然而 firewalld 只应用改动了的不同部分。

防火墙基本操作

查询防火墙状态

1
2
3
4
5
firewall-cmd --state   # 显示firewalld的状态;
systemctl status firewalld # 显示firewalld的状态;
firewall-cmd --zone=public --list-all #查询public区域的所有信息
firewall-cmd --zone=public --list-ports #查询public区域放行的端口信息
firewall-cmd --zone=public --list-services #查询public区域放行的服务信息

应急模式

1
2
3
firewall-cmd --query-panic  # 查看是否为应急模式
firewall-cmd --panic-on # 拒绝所有包,远程连接会立即断开,只有本地能登陆
firewall-cmd --panic-off # 取消拒绝状态,但需要重启firewalld后才可以远程ssh

启动、关闭防火墙

1
2
3
4
systemctl start firewalld	#启动防火墙
systemctl enable firewalld #开机自启动
systemctl stop firewalld #关闭防火墙
systemctl disable firewalld #关闭开机自启动

重新加载防火墙设置

1
2
3
4
firewall-cmd --reload	#不中断用户连接
firewall-cmd --complete-reload #中断用户连接
firewall-cmd --runtime-to-permanent #将当前防火墙的规则永久保存
firewall-cmd --check-config # 检查配置正确性

区域

FirewallD 使用服务(service )和区域(zone)来代替 iptables 的规则(rule)和链(chain)。

默认情况下,有以下的区域(zone)可用:

drop丢弃所有传入的网络数据包并且无回应,只有传出网络连接可用
block拒绝所有传入网络数据包并回应一条主机禁止的 ICMP 消息,只有传出网络连接可用。
public只接受被选择的传入网络连接,用于公共区域。
external用于启用了地址伪装的外部网络,只接受选定的传入网络连接
dmzDMZ 隔离区,外部受限地访问内部网络,只接受选定的传入网络连接
work对于处在你工作区域内的计算机,只接受被选择的传入网络连接
home对于处在你家庭区域内的计算机,只接受被选择的传入网络连接
internal对于处在你内部网络的计算机,只接受被选择的传入网络连接
trusted所有网络连接都接受
1
2
3
4
5
6
firewall-cmd --get-zones	#列出所有可用的区域
firewall-cmd --get-default-zone #列出默认的区域
firewall-cmd --set-default-zone=dmz #设置默认的区域
firewall-cmd --get-zone-of-interface=ens33 #查看指定接口所属区域
firewall-cmd --zone=dmz --change-interface=ens33 #永久修改网络接口ens33为dmz区域
firewall-cmd --zone=dmz --remove-interface=ens33 #删除绑定在ens33接口上的Zone网络区

端口管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查询打开的端口
firewall-cmd --list-ports

#放行
firewall-cmd --add-port=portid[-portid]/protocol [--permanent] [--zone=zone]
firewall-cmd --add-port=80/tcp --zone=public --permanent
参数(portid[-portid]):要开放的端口号,如果是一个范围则使用10000-12000表达一个范围。
参数(protocol):TCP/UDP协议
可选参数(zone):将规则添加到哪个Zone网络区中,如果缺省该参数则添加到默认Zone网络区中。
可选选项(–permanent):规则永久保存,重新加载防火墙后生效。如果缺省该参数则修改的规则立即生效,但是重新加载防火墙后规则会失效。

#移除
firewall-cmd --remove-service=https [--permanent] [--zone=zone]
firewall-cmd --zone=public --remove-port=80/tcp --permanent

# 加载配置文件、使规则生效
firewall-cmd --reload

服务管理

FirewallD 服务使用 XML 配置文件,记录了 firewalld 服务信息,XML 配置文件存储在 /usr/lib/firewalld/services//etc/firewalld/services/ 目录下。

查询服务

1
2
3
4
firewall-cmd --get-services	#查询所有支持的服务
firewall-cmd --add-service=telnet #添加服务
firewall-cmd --list-services #查询放行的服务
firewall-cmd --permanent --service=telnet --get-port #查看服务对应的端口号

禁ping

1
2
3
4
5
6
7
8
9
# tcp/ip实现方式
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all 或
sysctl -w net.ipv4.icmp_echo_ignore_all=1

# firewalld实现方式
firewall-cmd --permanent --add-icmp-block=echo-request #开启禁ping
firewall-cmd --permanent --remove-icmp-block=echo-request #关闭禁ping
firewall-cmd --reload

放行/关闭服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#放行
firewall-cmd --add-service=service [--permanent] [--zone=zone] [--timeout=timeval]
例:firewall-cmd --add-service=zabbix-agent --zone=public --permanent

参数(–-add-service):要放行的服务名,如ssh、http、https。
可选参数(–-zone=zone):将此规则添加到网络区,如果缺省该参数,添加到默认网络区内。
可选参数(–-timeout=timeval):临时生效时间,不可与--permanent连用。表达方式可以是--timeout=[100s | 100m | 100h]。(timeval is either a number (of seconds) or number followed by one of characters s(seconds), m(minutes), h(hours))
可选选项(–permanent):规则永久保存,重新加载防火墙后生效。如果缺省该参数则修改的规则立即生效,但是重新加载防火墙后规则会失效。
#移除
firewall-cmd --remove-service=service [--permanent] [--zone=zone]
firewall-cmd --remove-service=zabbix-agent --zone=public --permanent

# 加载配置文件、使规则生效
firewall-cmd --reload

端口转发

端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。 如果配置好端口转发之后不能用,可以检查下面两个问题:

  • 比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了
  • 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP
1
2
3
firewall-cmd --query-masquerade	# 检查是否允许伪装IP
firewall-cmd --add-masquerade # 允许防火墙伪装IP(转发到其他IP上时必须开启,仅转发本地端口则非必须开启)
firewall-cmd --remove-masquerade # 禁止防火墙伪装IP
1
2
3
4
5
firewall-cmd --add-forward-port=port=[访问端口]:协议=[tcp/udp]:toaddr=[需要转发的主机地址]:toport=[需要转发的端口]

firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口
  • 当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。
  • 端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。

参考链接:

https://wangchujiang.com/linux-command/c/firewall-cmd.html

https://blog.yeefire.com/2020_02/Linux_Firewalld.html