firewall-cmd命令详解
⼀、firewall-cmd简介
Linux上新⽤的防⽕墙软件,跟差不多的⼯具
irewall-cmd 是 firewalld的字符界⾯管理⼯具,firewalld是centos7的⼀⼤特性,最⼤的好处有两个:⽀持动态更新,不⽤重启服务;第⼆个就是加⼊了防⽕墙的“zone”概念。firewalld跟iptables⽐起来⾄少有两⼤好处:
1.firewalld可以动态修改单条规则,⽽不需要像iptables那样,在修改了规则后必须得全部刷新才可以⽣效。
2.firewalld在使⽤上要⽐iptables⼈性化很多,即使不明⽩“五张表五条链”⽽且对TCP/ip协议也不理解也可以实现⼤部分功能。
firewalld⾃⾝并不具备防⽕墙的功能,⽽是和iptables⼀样需要通过内核的netfilter来实现,也就是说firewalld和 iptables⼀样,他们的作⽤都是⽤于维护规则,⽽真正使⽤规则⼲活的是内核的netfilter,只不过firewalld和iptables的结构以及使⽤⽅法不⼀样罢了。
⼆、firewall-cmd命令详解
1.命令格式
firewall-cmd [选项 ... ]
2.选项
通⽤选项
-h, --help # 显⽰帮助信息;
-V, --version # 显⽰版本信息. (这个选项不能与其他选项组合);
-q, --quiet # 不打印状态消息;
状态选项
--state # 显⽰firewalld的状态;
--reload # 不中断服务的重新加载;
--complete-reload # 中断所有连接的重新加载;
-
-runtime-to-permanent # 将当前防⽕墙的规则永久保存;
--check-config # 检查配置正确性;
⽇志选项
--get-log-denied # 获取记录被拒绝的⽇志;
--set-log-denied=<value> # 设置记录被拒绝的⽇志,只能为 'all','unicast','broadcast','multicast','off' 其中的⼀个;
3.实例
安装/运⾏
# 安装firewalld
yum install firewalld firewall-config
systemctl start firewalld # 启动
systemctl status firewalld # 或者 firewall-cmd --state 查看状态
systemctl disable firewalld # 停⽌
systemctl stop firewalld # 禁⽤
# 关闭服务的⽅法
# 你也可以关闭⽬前还不熟悉的FirewallD防⽕墙,⽽使⽤iptables,命令如下:
systemctl stop firewalld
systemctl disable firewalld
yum install iptables-services
systemctl start iptables
systemctl enable iptables
配置firewalld
firewall-cmd --version # 查看版本
firewall-cmd --help # 查看帮助
# 查看设置:
firewall-cmd --state # 显⽰状态
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
# 两者的区别就是第⼀个⽆需断开连接,就是firewalld特性之⼀动态添加规则,第⼆个需要断开连接,类似重启服务
# 将接⼝添加到区域,默认接⼝都在public
firewall-cmd --zone=public --add-interface=eth0
# 永久⽣效再加上 --permanent 然后reload防⽕墙
# 设置默认接⼝区域,⽴即⽣效⽆需重启
firewall-cmd --set-default-zone=public
# 查看所有打开的端⼝:
firewall-cmd --zone=dmz --list-ports
# 加⼊⼀个端⼝到区域:
firewall-cmd --zone=dmz --add-port=8080/tcp
# 若要永久⽣效⽅法同上
# 打开⼀个服务,类似于将端⼝可视化,服务需要在配置⽂件中添加,/etc/firewalld ⽬录下有services⽂件夹,这个不详细说了,详情参考⽂档
firewall-cmd --zone=work --add-service=smtp
# 移除服务
firewall-cmd --zone=work --remove-service=smtp
# 显⽰⽀持的区域列表
firewall-cmd --get-zones
# 设置为家庭区域
firewall-cmd --set-default-zone=home
# 查看当前区域
firewall-cmd --get-active-zones
# 设置当前区域的接⼝
firewall-cmd --get-zone-of-interface=enp03s
# 显⽰所有公共区域(public)
firewall-cmd --zone=public --list-all
# 临时修改⽹络接⼝(enp0s3)为内部区域(internal)
firewall-cmd --zone=internal --change-interface=enp03s
# 永久修改⽹络接⼝enp03s为内部区域(internal)
firewall-cmd --permanent --zone=internal --change-interface=enp03s
服务管理
# 显⽰服务列表
Amanda, ftp, Samba和tftp等最重要的服务已经被FirewallD提供相应的服务,可以使⽤如下命令查看:firewall-cmd --get-services
# 允许ssh服务通过
firewall-cmd --enable service=ssh
# 禁⽌SSH服务通过
firewall-cmd --disable service=ssh
# 打开TCP的8080端⼝
firewall-cmd --enable ports=8080/tcp
# 临时允许Samba服务通过600秒
firewall-cmd --enable service=samba --timeout=600
# 显⽰当前服务
firewall-cmd --list-services
# 添加HTTP服务到内部区域(internal)
firewall-cmd --permanent --zone=internal --add-service=http
firewall-cmd --reload # 在不改变状态的条件下重新加载防⽕墙
端⼝管理
# 打开443/TCP端⼝
firewall-cmd --add-port=443/tcp
# 永久打开3690/TCP端⼝
firewall-cmd --permanent --add-port=3690/tcp
# 永久打开端⼝好像需要reload⼀下,临时打开好像不⽤,如果⽤了reload临时打开的端⼝就失效了
# 其它服务也可能是这样的,这个没有测试
firewall-cmd --reload
# 查看防⽕墙,添加的端⼝也可以看到
firewall-cmd --list-all
直接模式
# FirewallD包括⼀种直接模式,使⽤它可以完成⼀些⼯作,例如打开TCP协议的9999端⼝
firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j accept
firewall-cmd --reload
4.⾃定义服务管理
选项
(末尾带有 [P only] 的话表⽰该选项除了与(--permanent)之外,不能与其他选项⼀同使⽤!)
--new-service=<;服务名> 新建⼀个⾃定义服务 [P only]
--new-service-from-file=<⽂件名> [--name=<;服务名>]
从⽂件中读取配置⽤以新建⼀个⾃定义服务 [P only]
--delete-service=<;服务名>
删除⼀个已存在的服务 [P only]
-
-load-service-defaults=<;服务名>
Load icmptype default settings [P only]
--info-service=<;服务名>
显⽰该服务的相关信息
--path-service=<;服务名>
显⽰该服务的⽂件的相关路径 [P only]
--service=<;服务名> --set-description=<;描述>
给该服务设置描述信息 [P only]
--service=<;服务名> --get-description
显⽰该服务的描述信息 [P only]
--service=<;服务名> --set-short=<;描述>
给该服务设置⼀个简短的描述 [P only]
--service=<;服务名> --get-short
显⽰该服务的简短描述 [P only]如何打开端口
--service=<;服务名> --add-port=<;端⼝号>[-<;端⼝号>]/<protocol>
给该服务添加⼀个新的端⼝(端⼝段) [P only]
--service=<;服务名> --remove-port=<;端⼝号>[-<;端⼝号>]/<protocol>
从该服务上移除⼀个端⼝(端⼝段) [P only]
--service=<;服务名> --query-port=<;端⼝号>[-<;端⼝号>]/<protocol>
查询该服务是否添加了某个端⼝(端⼝段) [P only]
--service=<;服务名> --get-ports
显⽰该服务添加的所有端⼝ [P only]
-
-service=<;服务名> --add-protocol=<protocol>
为该服务添加⼀个协议 [P only]
--service=<;服务名> --remove-protocol=<protocol>
从该服务上移除⼀个协议 [P only]
--service=<;服务名> --query-protocol=<protocol>
查询该服务是否添加了某个协议 [P only]
--service=<;服务名> --get-protocols
显⽰该服务添加的所有协议 [P only]
--service=<;服务名> --add-source-port=<;端⼝号>[-<;端⼝号>]/<protocol>
添加新的源端⼝(端⼝段)到该服务 [P only]
--service=<;服务名> --remove-source-port=<;端⼝号>[-<;端⼝号>]/<protocol>
从该服务中删除源端⼝(端⼝段) [P only]
--service=<;服务名> --query-source-port=<;端⼝号>[-<;端⼝号>]/<protocol>
查询该服务是否添加了某个源端⼝(端⼝段) [P only]
--service=<;服务名> --get-source-ports
显⽰该服务所有源端⼝ [P only]
--service=<;服务名> --add-module=<module>
为该服务添加⼀个模块 [P only]
--service=<;服务名> --remove-module=<module>
为该服务移除⼀个模块 [P only]
--service=<;服务名> --query-module=<module>
查询该服务是否添加了某个模块 [P only]
-
-service=<;服务名> --get-modules
显⽰该服务添加的所有模块 [P only]
--service=<;服务名> --set-destination=<ipv>:<address>[/]
Set destination for ipv to address in service [P only]
--service=<;服务名> --remove-destination=<ipv>
Disable destination for ipv i service [P only]
--service=<;服务名> --query-destination=<ipv>:<address>[/]
Return whether destination ipv is set for service [P only]
--service=<;服务名> --get-destinations
List destinations in service [P only]
控制端⼝ / 服务
可以通过两种⽅式控制端⼝的开放,⼀种是指定端⼝号另⼀种是指定服务名。虽然开放 http 服务就是开放了 80 端⼝,
但是还是不能通过端⼝号来关闭,也就是说通过指定服务名开放的就要通过指定服务名关闭;通过指定端⼝号开放的就要通过指定端⼝号关闭。
还有⼀个要注意的就是指定端⼝的时候⼀定要指定是什么协议,tcp 还是 udp。知道这个之后以后就不⽤每次先关防⽕墙了,可以让防⽕墙真正的⽣效。
firewall-cmd --add-service=mysql # 开放mysql端⼝
firewall-cmd --remove-service=http # 阻⽌http端⼝
firewall-cmd --list-services # 查看开放的服务
firewall-cmd --add-port=3306/tcp # 开放通过tcp访问3306
firewall-cmd --remove-port=80tcp # 阻⽌通过tcp访问3306
firewall-cmd --add-port=233/udp # 开放通过udp访问233
firewall-cmd --list-ports # 查看开放的端⼝
伪装 IP
firewall-cmd --query-masquerade # 检查是否允许伪装IP
firewall-cmd --add-masquerade # 允许防⽕墙伪装IP
firewall-cmd --remove-masquerade# 禁⽌防⽕墙伪装IP
端⼝转发
端⼝转发可以将指定地址访问指定的端⼝时,将流量转发⾄指定地址的指定端⼝。转发的⽬的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端⼝,则默认使⽤来源端⼝。如果配置好端⼝转发之后不能⽤,可以检查下⾯两个问题:
1.⽐如我将 80 端⼝转发⾄ 8080 端⼝,⾸先检查本地的 80 端⼝和⽬标的 8080 端⼝是否开放监听了
2.其次检查是否允许伪装 IP,没允许的话要开启伪装 IP
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端⼝
1.当我们想把某个端⼝隐藏起来的时候,就可以在防⽕墙上阻⽌那个端⼝访问,然后再开⼀个不规则的端⼝,之后配置防⽕墙的端⼝转发,将流量转发过去。
2.端⼝转发还可以做流量分发,⼀个防⽕墙拖着好多台运⾏着不同服务的机器,然后⽤防⽕墙将不同端⼝的流量转发⾄不同机器。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论