防火墙--firewalld
一、firewalld基本概述
1)RHEL/CentOS 7
系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems
, Linux
系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。
2)相较于传统的Iptables
防火墙,firewalld
支持动态更新,并加入了区域zone
的概念。简单来说,区域就是firewalld
预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
3)Firewalld
规则配置,从外访问服务器内部如果没有添加规则默认是阻止,从服务器内部访问服务器外部默认是允许
4)firewalld跟iptables比起来至少有两大好处:
- firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
- firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
5)firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了。
二、防火墙区域管理策略
划分不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。
“区域”是针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。 首次启用 FirewallD 后,public 将是默认区域。
区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal 区域上允许 DHCP,但在 external区域仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认区域。
zone区域相关指令:
#显示总共可用的区域 [root@firewall ~]# firewall-cmd --get-zones block dmz drop external home internal public trusted work #显示默认的区域 [root@firewall ~]# firewall-cmd --get-default-zone public #显示获取的区域 [root@firewall ~]# firewall-cmd --get-active-zones #设置默认的区域 [root@firewall ~]# firewall-cmd --set-default-zone="dmz" success [root@firewall ~]# firewall-cmd --set-default-zone="public" success #得到特定区域的所有配置 [root@firewall ~]# firewall-cmd --zone=public --list-all public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: # 查看zone所有打开的端口: firewall-cmd --zone=dmz --list-ports # 加入一个端口到区域: firewall-cmd --zone=dmz --add-port=8080/tcp
三、防火墙端口访问策略
使用firewalld允许客户请求的服务器的80/tcp端口,仅临时生效,如添加--permanent重启后则永久生效
#临时添加允许放行单个端口 [root@firewall ~]# firewall-cmd --add-port=80/tcp success #临时添加放行多个端口 [root@firewall ~]# firewall-cmd --add-port={80/tcp,8080/tcp} success #永久添加多个端口,需要添加--permanent,并且需要重载firewalld [root@firewall ~]# firewall-cmd --add-port={80/tcp,8080/tcp} --permanent success [root@firewall ~]# firewall-cmd --list-ports [root@firewall ~]# firewall-cmd --reload success [root@firewall ~]# firewall-cmd --list-ports 80/tcp 8080/tcp #通过--list-ports检查端口放行情况 [root@firewall ~]# firewall-cmd --list-ports 80/tcp 8080/tcp #移除临时添加的端口规则 [root@firewall ~]# firewall-cmd --remove-port={80/tcp,8080/tcp} success
四、防火墙服务访问策略
使用firewalld允许客户请求服务器的http https协议,仅临时生效,如添加--permanent重启后则永久生效
#临时添加允许放行单个服务 [root@firewall ~]# firewall-cmd --add-service=http success [root@firewall ~]# firewall-cmd --list-services dhcpv6-client http ssh #临时添加放行多个服务 [root@firewall ~]# firewall-cmd --add-service={http,https} success #永久添加多个服务,需要添加--permanent,并且需要重载firewalld [root@firewall ~]# firewall-cmd --add-service={http,https} --permanent success [root@firewall ~]# firewall-cmd --list-services dhcpv6-client ssh [root@firewall ~]# firewall-cmd --reload success [root@firewall ~]# firewall-cmd --list-services dhcpv6-client http https ssh #通过--list-services检查服务放行情况 [root@firewall ~]# firewall-cmd --list-services dhcpv6-client http https ssh #移除临时添加的http https协议 [root@firewall ~]# firewall-cmd --remove-service={http,https} success [root@firewall ~]# firewall-cmd --list-services dhcpv6-client ssh
五、防火墙端口转发策略
端口转发是指传统的目标地址映射,实现外网访问内网资源,流量转发命令格式为:
firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
如果需要将本地的10.0.0.61:5555端口转发至后端172.16.1.9:22端口:
#1、开启masquerade,实现地址转换 [root@Firewalld ~]# firewall-cmd --add-masquerade --permanent #2、配置转发规则 [root@Firewalld ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=5555:proto=tcp:toport=22:toaddr=172.16.1.9 [root@Firewalld ~]# firewall-cmd –reload
六、防火墙富规则策略
firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置, 优先级在所有的防火墙策略中也是最高的,帮助信息如下:
[root@Firewalld ~]# man firewall-cmd # 帮助手册 [root@Firewalld ~]# man firewalld.richlanguage # 获取富规则手册 rule [source] [destination] service|port|protocol|icmp-block|masquerade|forward-port [log] [audit] [accept|reject|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 #富规则相关命令 --add-rich-rule='<RULE>' #在指定的区添加一条富规则 --remove-rich-rule='<RULE>' #在指定的区删除一条富规则 --query-rich-rule='<RULE>' #找到规则返回0 ,找不到返回1 --list-rich-rules #列出指定区里的所有富规则
1)允许10.0.0.1主机能够访问http服务,允许172.16.1.0/24能访问10050端口
[root@firewall ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 service name=http accept' success [root@firewall ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port port="10050" protocol="tcp" accept' success [root@firewall ~]# firewall-cmd --list-rich-rules rule family="ipv4" source address="10.0.0.1/32" service name="http" accept rule family="ipv4" source address="172.16.1.0/24" port port="10050" protocol="tcp" accept
2)默认public区域对外开放所有人能通过ssh服务连接,但拒绝172.16.1.0/24网段通过ssh连接服务器
[root@firewall ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name="ssh" drop' success
3)允许所有人能访问http,https服务,但只有10.0.0.1主机可以访问ssh服务
[root@firewall ~]# firewall-cmd --add-service={http,https} success [root@firewall ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 service name=ssh accept' success
4)当用户来源IP地址是10.0.0.1主机,则将用户请求的5555端口转发至后端172.16.1.9的22端口
[root@firewall ~]# firewall-cmd --add-masquerade success [root@firewall ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 forward-port port="5555" protocol="tcp" to-port="22" to-addr="172.16.1.6"' success
5)查看设定的规则,如果没有添加--permanent参数则重启firewalld会失效。富规则按先后顺序匹配,按先匹配到的规则生效
[root@firewall ~]# firewall-cmd --list-rich-rules rule family="ipv4" source address="10.0.0.1/32" service name="http" accept rule family="ipv4" source address="172.16.1.0/24" port port="10050" protocol="tcp" accept rule family="ipv4" source address="172.16.1.0/24" service name="ssh" drop rule family="ipv4" source address="10.0.0.1/32" service name="ssh" accept rule family="ipv4" source address="10.0.0.1/32" forward-port port="5555" protocol="tcp" to-port="22" to-addr="172.16.1.6"
七、防火墙开启内部上网
在指定的带有公网IP的实例上启动Firewalld防火墙的NAT地址转换,以此达到内部主机上网。
#1.firewalld防火墙开启masquerade, 实现地址转换 [root@Firewalld ~]# firewall-cmd --add-masquerade --permanent [root@Firewalld ~]# firewall-cmd --reload #2.客户端将网关指向firewalld服务器,将所有网络请求交给firewalld [root@web03 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 GATEWAY=172.16.1.61 #3.客户端还需配置dns服务器 [root@web03 ~]# cat /etc/resolv.conf nameserver 223.5.5.5 #4.重启网络,使其配置生效 [root@web03 ~]# nmcli connection reload [root@web03 ~]# nmcli connection down eth1 && nmcli connection up eth1 #5.测试后端web的网络是否正常 [root@web03 ~]# ping baidu.com PING baidu.com (123.125.115.110) 56(84) bytes of data. 64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=1 ttl=127 time=9.08 ms
八、常用命令汇总
#进程状态相关 systemctl start firewalld systemctl enable firewalld systemctl stop firewalld systemctl disable firewalld systemctl status firewalld firewall-cmd --state #检查防火墙状态,输出应该是 running或者 not running firewall-cmd --reload #重新加载 FirewallD 配置 #----------------------------------------------------------------------- #配置集相关 #1、 将规则同时添加到持久规则集和运行时规则集中 sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --add-service=http #2、 将规则添加到持久规则集中并重新加载 FirewallD。 sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --reload #------------------------------------------------------------------------- #zone区域相关 sudo firewall-cmd --get-default-zone #默认区域 sudo firewall-cmd --set-default-zone=internal #修改默认区域 sudo firewall-cmd --get-active-zones #网络接口使用的区域 sudo firewall-cmd --zone=public --list-all #特定区域的所有配置 sudo firewall-cmd --list-all-zones #所有区域的配置 #------------------------------------------------------------------------ #服务相关 sudo firewall-cmd --get-services #查看默认的可用服务 sudo firewall-cmd --zone=public --add-service=http --permanent #启用HTTP 服务 sudo firewall-cmd --zone=public --remove-service=http --permanent #禁用 HTTP 服务 #------------------------------------------------------------------------ #端口相关 sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent #端口转发 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端口 #------------------------------------------------------------------------ #伪装ip firewall-cmd --query-masquerade # 检查是否允许伪装IP firewall-cmd --add-masquerade # 允许防火墙伪装IP firewall-cmd --remove-masquerade# 禁止防火墙伪装IP #------------------------------------------------------------------------ #富规则 #允许来自主机 192.168.0.14 的所有 IPv4 流量。 sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept' #拒绝来自主机 192.168.1.10 到 22 端口的 IPv4 的 TCP 流量。 sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' #允许来自主机 10.1.0.3 到 80 端口的 IPv4 的 TCP 流量,并将流量转发到 6532 端口上。 sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532' #将主机 172.31.4.2 上 80 端口的 IPv4 流量转发到 8080 端口(需要在区域上激活 masquerade)。 sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2' #列出你目前的丰富规则: sudo firewall-cmd --list-rich-rules #允许192.168.2.208主机的所有流量 firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" accept" #允许192.168.2.208主机的icmp协议,即允许192.168.2.208主机ping firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol value="icmp" accept" #取消允许192.168.2.208主机的所有流量 firewall-cmd --zone=drop --remove-rich-rule="rule family="ipv4" source address="192.168.2.208" accept" #允许192.168.2.208主机访问ssh服务 firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="ssh" accept" #禁止192.168.2.208访问https服务,并返回错误信息 firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="https" reject" #注:如果是drop的话是直接丢弃,会返回timeout(连接超时) #允许192.168.2.0/24网段的主机访问22端口 firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" accept" #每分钟允许2个新连接访问ftp服务 firewall-cmd --add-rich-rule="rule service name=ftp limit value=2/m accept" #允许新的ipv4和ipv6连接ftp,并使用日志和审核,每分钟允许访问一次 firewall-cmd --add-rich-rule="rule service name=ftp log limit value="1/m" audit accept" #拒绝来自192.168.2.0/24网段的连接,10秒后自动取消 firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 reject" --timeout=10 #允许ipv6地址为2001:db8::/64子网的主机访问dns服务,并且每小时审核一次,300秒后自动取消 firewall-cmd --add-rich-rule="rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject" --timeout=300 #将来自192.168.2.0/24网段访问本机80端口的流量转发到本机的22端口 firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22" #将来自192.168.2.0/24网段访问本地80端口的流量转发到192.168.2.208主机的22端口 firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22 to-addr=192.168.2.208" #伪装,将来自局域网192.168.2.0/24网段访问外网的流量映射为网络出口公网IP,即修改源IP地址 firewall-cmd --zone=drop --add-masquerade firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 masquerade" #-------------------------------------------------------------------- #应急命令 firewall-cmd --panic-on # 拒绝所有流量,远程连接会立即断开,只有本地能登陆 firewall-cmd --panic-off # 取消应急模式,但需要重启firewalld后才可以远程ssh firewall-cmd --query-panic # 查看是否为应急模式
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!