预警:所有永久策略更改后,请执行重载命令使其生效,如下:

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-forward­port=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-forward­port=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文档类资源-CSDN下载

 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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐