预警:所有永久策略更改后,请执行重载命令使其生效,如下:
firewall-cmd --reload
设置public的策略后,配置文件路径:/etc/firewalld/zones/public.xml 注意做好备份
1、查询端口放开策略
1.查询指定端口是否放开
[root@localhost /home]# firewall-cmd --query-port=9191/tcp
2.列出所有放开的端口
[root@localhost /home]# firewall-cmd --list-port
3.列出所有放开的服务
[root@localhost /home]# firewall-cmd --list-service
4.查看所有策略
#列出所有策略
[root@localhost /home]# firewall-cmd --list-all
#列出区域是公共的所有策略
[root@localhost /home]# firewall-cmd --list-all --zone public
2、添加端口放开策略
2.1、所有来源均可访问
1.开放指定端口
例:所有来源均可访问9191端口的tcp包
[root@localhost /home]# firewall-cmd --zone=public --add-port=9191/tcp --permanent
[root@localhost /home]# firewall-cmd --reload
2.删除开放的端口
[root@localhost /home]# firewall-cmd --zone=public --remove-port=9191/tcp --permanent
[root@localhost /home]# firewall-cmd --reload
3.开放指定服务
例:所有来源均可访问sshd服务的tcp包
[root@localhost /home]# firewall-cmd --zone=public --add-service=ssh/tcp --permanent
[root@localhost /home]# firewall-cmd --reload
3.删除开放的服务
[root@localhost /home]# firewall-cmd --zone=public --remove-service=ssh --permanent
[root@localhost /home]# firewall-cmd --reload
2.2、指定来源可访问
1.指定来源ip放开端口
例:允许110.23.123.12来源访问9191端口的tcp包
[root@localhost /home]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="110.23.123.12" port protocol="tcp" port="9191" accept"
2.指定来源ip段,放开端口
例:允许172.16.1.0/24 子网主机访问9191端口的tcp包
[root@localhost /home]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port protocol=tcp port=9191 accept'
3.指定来源ip段,放开端口范围
例:允许172.16.1.0/24 子网主机访问30001到30030之间的端口上的所有tcp包
[root@localhost /home]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port protocol=tcp port=30001-30030 accept'
4.指定来源ip,放开所有端口
例:允许172.16.4.124访问所有端口
[root@localhost /home]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.4.124" accept"
5.指定来源ip段,放开所有端口
例:允许172.16.1.0/24 子网主机访问所有端口
[root@localhost /home]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 accept'
3、添加服务放开策略
1.允许指定ip访问指定服务
例:允许192.166.1.33来源ip访问ssh服务
[root@localhost /home]# firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.1.33" service name="ssh" accept"
2.允许指定ip段访问指定服务
例:允许192.166.2.0/24 ip段来源访问ssh服务
[root@localhost /home]# firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.166.2.0/24" service name="ssh" accept"
4、添加端口禁止策略
1.指定来源ip禁止访问端口
例:禁止192.168.3.12访问9191端口的tcp包
[root@localhost /home]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.3.12" port protocol="tcp" port="9191" reject"
2.指定来源ip段,禁止访问端口
例:禁止172.16.1.0/24 子网主机访问9191的端口的tcp包
[root@localhost /home]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port protocol=tcp port=9191 reject'
3.指定来源ip段,禁止访问端口范围
例:禁止172.16.1.0/24 子网主机访问30001到30030之间的端口上的所有tcp包
[root@localhost /home]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port protocol=tcp port=30001-30030 reject'
5、删除端口策略
5.1、关闭已开放的端口
[root@localhost /home]# firewall-cmd --zone=public --remove-port=9191/tcp --permanent
5.2、删除指定来源ip放开的端口
例:删除“允许110.23.123.12来源访问9191端口”策略
[root@localhost /home]# firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="110.23.123.12" port protocol="tcp" port="9191" accept"
5.3、删除指定来源ip段,放开的端口范围
例:删除“允许172.16.1.0/24 子网主机访问30001到30030之间的端口上的所有tcp包“策略
[root@localhost /home]# firewall-cmd --permanent --removerich-rule='rule family=ipv4 source address=172.16.1.0/24 port protocol=tcp port=30001-30030 accept'
综上,删除规则就是在将添加的规则(--add-rich-rule的参数 xxxx),参数--removerich-rule的参数来执行:firewall-cmd --permanent --removerich-rule='xxxx'
6、关闭开启firewall服务
#查看状态
[root@localhost /home]# systemctl status firewalld
#停止firewall
[root@localhost /home]# systemctl stop firewalld.service
#启动firewall
[root@localhost /home]# systemctl start firewalld
#禁止firewall开机启动
[root@localhost /home]# systemctl disable firewalld.service
7、简要参数字段解释
字段名 | 解释 | 备注 |
--zone | 作用域 | 例:--zone=public |
--add-port | 添加端口,格式:端口号/协议 | 例:-–add-port=80/tcp |
--permanent | 永久生效,重启后也不失效 | |
--reload | 超载配置文件,永久生效 | |
--add-source | 添加访问来源ip地址、ip地址段,在当前zone内 | 例:--add-source=172.1.12.13 --add-source=172.1.12.13/24 |
--remove-source | 删除访问来源ip地址、地址段 ,在当前zone内 | |
--add-service | 添加服务 | 添加允许访问服务的策略 |
--remove-service | 删除服务, | 删除允许访问服务的策略 |
--list-services | 显示当前zone内允许访问的所有服务 | |
--add-protocol | 添加在当前zone内允许通过的协议 | |
--remove-protocol | 删除在当前zone内允许通过的协议 | |
--list-protocol | 列出当前zone内允许通过的协议 | |
--add-rich-rule | 添加富规则(使用富规则语言) | 例如:--add-rich-rule="rule family="ipv4" source address="110.23.123.12" port protocol="tcp" port="9191" accept" |
--remove-rich-rule | 删除富规则 | 例如:--remove-rich-rule="rule family="ipv4" source address="110.23.123.12" port protocol="tcp" port="9191" accept" |
--list-rich-rule | 列出所有富规则 | |
--timeout | 用于调试,设置在一定秒数后规则失效,防止错误规则导致网络断开而不能使用 | 例,5分钟后本条策略失效:--timeout=300 |
8、富规则语法
格式:
rule [source] [destination] [service|port|protocol|icmp-block|masquerade|forward-port] [log] [audit] [accept|rejec|drop]
字段值:
rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
destination address="address[/mask]" invert="True"
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol value"
forward-port port="port value" protocol="tcp|udp" to-port="port value
" to-addr="address"
log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"]
accept | reject [type="reject type"] | drop
9、端口转发
1.将访问到本机端口的链接转发的本机或其他机器指定端口
格式 :firewall-cmd --permanent --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
toport和toaddr至少选一个,可以两个都选
例:来自public的访问本机9090端口的连接会转发到192.168.2.15主机的9191端口
[root@localhost /home]# frewall-cmd --permanent --zone=public --add-forwardport=port=9090:proto=tcp:toport=9191:toaddr=192.168.2.15
2.结合富规则设置端口转发
格式:forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
例:来自public的l72.16.1.0/24端ip的来源连接访问本机9090端口,转发到本机9191端口
[root@localhost /home]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=l72.16.1.0/24 forward-port port=9090 protocol=tcp to-port=9191'
综上,上述转发实际上实现的是外网访问内网的映射:
firewall-cmd --zone=external --add-masquerade
frewall-cmd --permanent --zone=public --add-forwardport=port=9090:proto=tcp:toport=9191:toaddr=192.168.2.15
10、自定义区域和服务
10.1 自定义的区域
参照/lib/firewalld/zones/public.xml文件,在/lib/firewalld/zones/下面新建你需要的区域名以.xml结尾,内容格式参照public.xml,trusted.xml等文件即可。
Internal.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Internal</short>
<description>For use on internal networks. You mostly trust the other computers on the networks
to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="mdns"/>
<service name="samba-client"/>
<service name="dhcpv6-client"/>
</zone>
10.2 自定义服务
自定义服务可以让防火墙配置更为简便,能够直接使用服务名来进行策略配置
参照/usr/lib/firewalld/services/ssh.xml,在/usr/lib/firewalld/services/下面新建你需要的服务名以.xml结尾,内容格式参照ssh.xml,samba.xml文件中的内容即可。
samba.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Samba</short>
<description>This option allows you to access and participate in Windows file and printer sharin
g networks. You need the samba package installed for this option to be useful.</description>
<port protocol="udp" port="137"/>
<port protocol="udp" port="138"/>
<port protocol="tcp" port="139"/>
<port protocol="tcp" port="445"/>
<module name="nf_conntrack_netbios_ns"/>
</service>
补充说明:firewall的规则配置文件是 /usr/lib/firewalld/ 和 /etc/firewalld/ 路径中的各种xml文件中。
11、工具脚本
这里编写了一个简单的策略管理工具脚本,可实现简单的端口放开或禁止需求
generateFirewallRules_v1.2.sh-Linux文档类资源-优快云下载
11.1、对指定ip放开所有端口
./generateFirewallRules.sh openRemoveAllPortsByIps add 192.168.1.22
#删除上述规则
./generateFirewallRules.sh openRemoveAllPortsByIps remove 192.168.1.22
11.2、对指定ip段放开所有端口
./generateFirewallRules.sh openRemoveAllPortsByIps add 192.168.1.22/24
#删除上述规则
./generateFirewallRules.sh openRemoveAllPortsByIps remove 192.168.1.22/24
11.3、对指定ip放开指定端口
./generateFirewallRules.sh openRemovePortsByIps add 9191 192.168.55.33
#删除上述规则
./generateFirewallRules.sh openRemovePortsByIps remove 9191 192.168.55.33
11.4、对指定ip段放开指定端口范围
./generateFirewallRules.sh openRemovePortsByIps add 9191-9199 192.168.55.0/24
#删除上述规则
./generateFirewallRules.sh openRemovePortsByIps add 9191-9199 192.168.55.0/24
11.5、对指定ip段放开指定端口范围
./generateFirewallRules.sh openRemovePortsByIps add 9191-9199 192.168.55.0/24
#删除上述规则
./generateFirewallRules.sh openRemovePortsByIps add 9191-9199 192.168.55.0/24
脚本工具代码:./generateFirewallRules.sh
#!/bin/bash
#对特定ip或ip段来源进行放开或限制特定端口或端口范围
#opt: add(添加放开端口策略) remove(删除已添加的放开策略)
#ports: 格式:单个端口或端口范围,例如:9191、1000-1010
#ips: 格式:单个ip或ip加掩码的ip段,例如:10.0.0.0 、10.0.0.0/24
openRemovePortsByIps(){
opt=$1
ports=$2
ips=$3
cmd=""
if [[ $opt == 'add' ]]
then
cmd="firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=$ips port protocol=tcp port=$ports accept'"
echo "即将放开的端口:$ports 允许的来源ip:$ip"
echo "即将执行命令:$cmd"
elif [[ $opt == 'remove' ]]
then
cmd="firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=$ips port protocol=tcp port=$ports accept'"
echo "即将删除放开的端口策略:$ports 允许的来源ip:$ip"
echo "即将执行命令:$cmd"
else
echo "添加?删除?未指定!!"
fi
#二次确认是否执行
read -p "请确认是否执行,y/n:" res
if [ $res == 'y' ];then
echo "您选择继续执行该命令:"
#这里执行变量保存的命令
echo ${cmd} |awk '{run=$0;system(run)}'
elif [ $res == 'n' ];then
echo "您选择不执行:"
fi
firewall-cmd --reload
firewall-cmd --list-all
}
#对特定ip或ip段来源进行放开或限制所有端口
#opt: add(添加放开端口策略) remove(删除已添加的放开策略)
#ips: 格式:单个ip或ip加掩码的ip段,例如:10.0.0.0 、10.0.0.0/24
openRemoveAllPortsByIps(){
opt=$1
ips=$2
cmd=""
if [[ $opt == 'add' ]]
then
cmd="firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=$ips accept'"
echo "即将放开的端口:$ports 允许的来源ip:$ip"
echo "即将执行命令:$cmd"
elif [[ $opt == 'remove' ]]
then
cmd="firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=$ips accept'"
echo "即将删除放开所有端口的策略:允许的来源ip:$ip"
echo "即将执行命令:$cmd"
else
echo "添加?删除?未指定!!"
fi
#二次确认是否执行
read -p "请确认是否执行,y/n:" res
if [ $res == 'y' ];then
echo "您选择继续执行该命令:"
#这里执行变量保存的命令
echo ${cmd} |awk '{run=$0;system(run)}'
elif [ $res == 'n' ];then
echo "您选择不执行:"
fi
firewall-cmd --reload
firewall-cmd --list-all
}
#列出当前所有策略配置
list(){
firewall-cmd --list-all
}
case $1 in
openRemovePortsByIps)
openRemovePortsByIps $2 $3 $4
;;
openRemoveAllPortsByIps)
openRemoveAllPortsByIps $2 $3
;;
list)
list
;;
*)
echo "Usage:openRemoveAllPortsByIps opt(add|remove) ips(10.0.0.0|10.0.0.0/24)|openRemovePortsByIps opt(add|remove) ports(9191|1000-1010) ips(10.0.0.0|10.0.0.0/24)"
;;
esac