Linux网络命令之centos7防火墙firewall-cmd

一、firewall-cmd使用说明

  • firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念
  • firewalld有图形界面和工具界面,由于我在服务器上使用,图形界面请参照官方文档,本文以字符界面做介绍
  • firewalld的字符界面管理工具是 firewall-cmd,可以多参考firewalld-cmd –help命令学习
  • firewalld默认配置文件有两个:/usr/lib/firewalld/ (系统配置,尽量不要修改)和 /etc/firewalld/ (用户配置地址),用户配置文件主要是:/etc/firewalld/firewalld.conf

zone概念:
硬件防火墙默认一般有三个区,firewalld引入这一概念系统默认存在以下8个区域(根据文档自己理解,如果有误请指正):

  • drop:默认丢弃所有包
  • block:拒绝所有外部连接,允许内部发起的连接
  • public:指定外部连接可以进入
  • external:这个不太明白,功能上和上面相同,允许指定的外部连接
  • dmz:和硬件防火墙一样,受限制的公共连接可以进入
  • work:工作区,概念和workgoup一样,也是指定的外部连接允许
  • home:类似家庭组
  • internal:信任所有连接

centos7默认安装了firewalld,若没有安装,执行 yum install firewalld firewalld-config安装

二、应用

2.1 基础使用及状态

1
2
3
4
5
6
7
8
9
firewall-cmd --get-default-zone # 查看zone
firewall-cmd --get-active-zones # 查看運作中的zone和zone裡的介面
firewall-cmd --get-zones # 列出所有zone
firewall-cmd --set-default-zone=home
firewall-cmd --zone=public --list-all
firewall-cmd –new-zone=prod –permanet # 增加一个zone
firewall-cmd –complete-reload # 重启防火墙
firewall-cmd –set-default-zone=prod # 设置默认为prod
firewall-cmd –get-default-zone # 查看默认的zone(当然也可以用firewall-cmd –zone=prod –add-interface=eth0把指定接口设置成prod)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//临时关闭防火墙,重启后会重新自动打开
systemctl restart firewalld
//检查防火墙状态
firewall-cmd --state
firewall-cmd --list-all
//Disable firewall
systemctl disable firewalld
systemctl stop firewalld
systemctl status firewalld
//Enable firewall
systemctl enable firewalld
systemctl start firewalld
systemctl status firewalld
// centos6
service firewalld start||stop||restart
service firewalld status // 查看状态
firewall-cmd –version // 查看版本
firewall-cmd –help // 帮助信息
firewall-cmd –get-active-zones // 查看区域信息
firewall-cmd –get-zone-of-interface=eth0 // 查看指定接口所属区域
firewall-cmd –panic-on //拒绝所有包
firewall-cmd –panic-off //取消拒绝状态
firewall-cmd –query-panic //查看是否拒绝
firewall-cmd –reload // 更新防火墙规则
firewall-cmd –complete-reload // 断开再连接

2.2 服务器防火墙IP、端口配置

永久的开放需要的端口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#端口设置
firewall-cmd --zone=public --add-port=3000/tcp --permanent # 开放指定tcp端口,并永久生效
firewall-cmd --zone=public --add-port=5060-5059/udp --permanent # 开放指定区间udp端口,并永久生效
firewall-cmd --zone=public --add-port=80/tcp # 开启80端口
firewall-cmd --zone=public --remove-port=80/tcp # 移除80端口
firewall-cmd --zone=public --remove-port=5144/udp # 移除udp端口
#ip设置
firewall-cmd --zone=public --add-source=163.17.40.0/24 # 允许ip访问
firewall-cmd --zone=public --remove-source=163.17.40.0/24 # 移除ip访问
#服务服务设置
firewall-cmd --zone=public --add-service=http # 把http服务加入到区域
firewall-cmd --zone=public –remove-service=http # 移除http服务
firewall-cmd --zone=prod --add-service=samba # 开启samba服务
firewall-cmd --zone=prod --add-port=3690/tcp # 开启svn端口
firewall-cmd --zone=work --add-service=smtp # 添加 smtp 服务至 work zone
firewall-cmd --zone=work --remove-service=smtp # 移除 work zone 中的 smtp 服务
#网卡接口
firewall-cmd --zone=public --list-interfaces # 列出 public zone 所有网卡
firewall-cmd --zone=public --permanent --add-interface=eth0 # 将 eth0 添加至 public zone,永久
firewall-cmd --zone=work --permanent --change-interface=eth0 # eth0 存在与 public zone,将该网卡添加至 work zone,并将之从 public zone 中删除
firewall-cmd --zone=public --permanent --remove-interface=eth0 # 删除 public zone 中的 eth0,永久
# Postgresql端口设置。允许xxx.xx.xx.200访问5432端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xxx.xx.xx.200" port protocol="tcp" port="5432" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xxx.xxx.xxx.170" port protocol="tcp" port="3306" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xxx.xx.xx.200" port protocol="tcp" port="23333" accept"
#注意配置好后需要重载服务器
sudo firewall-cmd --reload
firewall-cmd --list-all #检查新的防火墙规则

2.3 复杂的防火墙设置

(1) rich-rules
firewalld复杂的设置配置参数是rich-rules, 可以先通过firewall-cmd --zone=public --list-rich-rules目录打印出所有的复杂设置。

1
2
3
4
5
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="163.17.40.0/24" port port="28001" protocol="tcp" accept'
firewall-cmd --zone=public --list-all
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.56.0/24" port port="3306" protocol="tcp" accept'

(2) 配置 external zone 中的 ip 地址伪装

1
2
3
firewall-cmd --zone=external --query-masquerade # 查看
firewall-cmd --zone=external --add-masquerade # 打开伪装
firewall-cmd --zone=external --remove-masquerade # 关闭伪装

(3) 配置 public zone 的端口转发

要打开端口转发,则需要先

1
2
3
4
5
firewall-cmd --zone=public --add-masquerade
firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=3753 # 然后转发 tcp 22 端口至 3753
firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.100 # 转发 22 端口数据至另一个 ip 的相同端口上
firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.100 # 转发 22 端口数据至另一 ip 的 2055 端口上

(4) 配置 public zone 的 icmp

1
2
3
4
5
firewall-cmd --get-icmptypes # 查看所有支持的 icmp 类型
# > 输出 < destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded
firewall-cmd --zone=public --list-icmp-blocks 列出
firewall-cmd --zone=public --add-icmp-block=echo-request [--timeout=seconds] # 添加 echo-request 屏蔽
firewall-cmd --zone=public --remove-icmp-block=echo-reply # 移除 echo-reply 屏蔽

2.4 防火墙永久设置

注意,firewalld的设置默认是临时的,如果要永久生效,需加参数 --permanent

1
2
3
4
5
6
7
8
9
# 查看永久的設定
firewall-cmd --zone=public --list-all --permanent
# 查看runtime的設定(少了--permanent)
firewall-cmd --zone=public --list-all
# 新增在public zone上53埠的udp服務 53/udp
firewall-cmd --zone=public --add-port=53/udp --permanent

2.5 IP 封禁

我最常用的语句:
firewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=119.39.248.76

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='222.222.222.222' reject" 单个IP
# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='222.222.222.0/24' reject" IP段
# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=192.168.1.2 port port=80 protocol=tcp accept" 单个IP的某个端口
这个是我们用得最多的。封一个IP,和一个端口 reject 拒绝 accept 允许
当然,我们仍然可以通过 ipset 来封禁 ip
封禁 ip
# firewall-cmd --permanent --zone=public --new-ipset=blacklist --type=hash:ip
# firewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=222.222.222.222
封禁网段
# firewall-cmd --permanent --zone=public --new-ipset=blacklist --type=hash:net
# firewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=222.222.222.0/24
倒入 ipset 规则
# firewall-cmd --permanent --zone=public --new-ipset-from-file=/path/blacklist.xml
然后封禁 blacklist
# firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist drop'
七、IP封禁和端口
# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=192.168.1.2 port port=80 protocol=tcp accept"
只对192.168.1.2这个IP只能允许80端口访问 (拒绝访问只需把 accept 换成 reject、删除该规则把 –add-rich-rule 改成 –remove-rich-rule即可)
# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=192.168.1.2/24 port port=80 protocol=tcp accept"
只对192.168.1.2这个IP段只能允许80端口访问(拒绝访问只需把 accept 换成 reject、删除该规则把 –add-rich-rule 改成 –remove-rich-rule即可)
八、双网卡内网网卡不受防火墙限制
# firewall-cmd --permanent --zone=public --add-interface=eth1
公网网卡–zone=public默认区域
# firewall-cmd --permanent --zone=trusted --add-interface=eth2
内网网卡–zone=trusted是受信任区域 可接受所有的网络连接
九、重新载入以生效
# firewall-cmd --reload

三、常见错误处理

3.1 Failed to start firewalld.service: Unit firewalld.service is masked.

问题现象: Failed to start firewalld.service: Unit firewalld.service is masked.错误,切firewall无法重启。

解决方法:

1
2
3
4
5
systemctl unmask firewalld.service
systemctl start firewalld.service
{设置端口} # eg: firewall-cmd --permanent --zone=public --add-port=80/tcp
systemctl restart firewalld.service
firewall-cmd --zone=public --query-port=80/tcp # 检查是否生效

四·常用配置

初始防火墙配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
yum install firewalld # 如果你是debian/ubuntu请使用命令:apt-get install firewalld
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --list-all
firewall-cmd --zone=public --add-port=20/tcp --permanent
firewall-cmd --zone=public --add-port=21/tcp --permanent
firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --zone=public --add-port=8888/tcp --permanent
firewall-cmd --zone=public --add-port=888/tcp --permanent
firewall-cmd --zone=public --add-port=10000-50000/tcp --permanent
firewall-cmd --zone=public --add-port=10086/tcp --permanent
firewall-cmd --reload

制定IP服务授权:


参考