一、安装firewalld服务
[root@localhost ~]# apt-get install firewalld [root@localhost ~]# yum install firewalld
二、开启、关闭、重启firewalld服务
# 关闭firewalld服务 [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# service firewalld stop # 开启firewalld服务 [root@localhost ~]# systemctl start firewalld [root@localhost ~]# service firewalld start # 查看firewalld服务状态 [root@localhost ~]# systemctl status firewalld [root@localhost ~]# service firewalld status # 重启firewalld服务 [root@localhost ~]# systemctl restart firewalld [root@localhost ~]# service firewalld restart # 设置开机启用防火墙 [root@localhost ~]# systemctl enable firewalld # 设置开机不启动防火墙 [root@localhost ~]# systemctl disable firewalld # 查看开机是否启动防火墙 [root@localhost ~]# systemctl is-enabled firewalld
三、查看firewall规则与状态
# 查看防火墙状态 [root@localhost ~]# firewall-cmd --state # 查看防火墙版本 [root@localhost ~]# firewall-cmd --version # 查看防火墙规则(只显示/etc/firewalld/zones/public.xml中的防火墙策略) [root@localhost ~]# firewall-cmd --list-all # 查看所有的防火墙策略(即显示/etc/firewalld/zones/下的所有策略) [root@localhost ~]# firewall-cmd --list-all-zones # 重新加载配置文件(修改配置后要重新加载一下) [root@localhost ~]# firewall-cmd --reload # 拒绝所有包 [root@localhost ~]# firewall-cmd --panic-on # 取消拒绝状态 [root@localhost ~]# firewall-cmd --panic-off # 查看是否拒绝 [root@localhost ~]# firewall-cmd --query-panic
四、规则设定
1、开放端口(这种情况下所有ip均能访问80端口,即对外暴露80端口了)
# 开放80端口(增加80端口的权限),对外暴露80端口,即任意ip都能访问 [root@localhost ~]# firewall-cmd --permanent --add-port=80/tcp [root@localhost ~]# firewall-cmd --permanent --add-port=80/tcp --zone=public # 关闭80端口 [root@localhost ~]# firewall-cmd --permanent --remove-port=80/tcp [root@localhost ~]# firewall-cmd --permanent --remove-port=80/tcp --zone=public # 查询所有开放的端口 [root@localhost ~]# firewall-cmd --list-ports [root@localhost ~]# firewall-cmd --zone=public --list-ports [root@localhost ~]# firewall-cmd --zone=public --list-ports --permanent # 查询端口是否开放 [root@localhost ~]# firewall-cmd --query-port=80/tcp [root@localhost ~]# firewall-cmd --zone=public --query-port=80/tcp
2、管理服务
[root@localhost ~]# firewall-cmd --zone=public --add-service=smtp # 临时添加smtp服务 [root@localhost ~]# firewall-cmd --zone=public --add-service=smtp --permanent # 永久添加smtp服务,添加到public.xml文件中。 [root@localhost ~]# firewall-cmd --zone=public --remove-service=smtp # 临时删除smtp服务 [root@localhost ~]# firewall-cmd --zone=public --remove-service=smtp --permanent # 永久删除smtp服务 # 查看smtp服务 [root@localhost ~]# firewall-cmd --zone=public --query-service=smtp # 查询所有开启的服务 [root@localhost ~]# firewall-cmd --list-services [root@localhost ~]# firewall-cmd --zone=public --list-services [root@localhost ~]# firewall-cmd --zone=public --list-services --permanent [root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.3/24" service name="http" accept" [root@localhost ~]# firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.0.3/24" service name="http" accept"
3、允许指定ip访问指定端口
[root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="1.1.1.1" port protocol="tcp" port="3120" accept" [root@localhost ~]# firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="1.1.1.1" port protocol="tcp" port="3120" accept"
4、阻止指定ip访问指定端口
[root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='1.1.1.1' port protocol="tcp" port="3120" drop" # 方式一 [root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='1.1.1.1' port protocol="tcp" port="3120" reject" # 方式二 [root@localhost ~]# firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='1.1.1.1' port protocol="tcp" port="3120" drop" [root@localhost ~]# firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='1.1.1.1' port protocol="tcp" port="3120" reject"
5、屏蔽IP:拒绝指定IP,所有端口都不能访问
[root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address="1.1.1.1" drop" # 添加规则:禁止IP为1.1.1.1,访问本机(方式一) [root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address="1.1.1.1" reject" # 添加规则:禁止IP为1.1.1.1,访问本机(方式二) [root@localhost ~]# firewall-cmd --permanent --remove-rich-rule="rule family=ipv4 source address="1.1.1.1" drop" # 删除规则:删除上面定义的规则(方式一) [root@localhost ~]# firewall-cmd --permanent --remove-rich-rule="rule family=ipv4 source address="1.1.1.1" reject" # 删除规则:删除上面定义的规则(方式二)
6、放行IP:允许指定IP,所有端口都可以访问
[root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address="1.1.1.1" accept" [root@localhost ~]# firewall-cmd --permanent --remove-rich-rule="rule family=ipv4 source address="1.1.1.1" accept"
7、白名单管理
[root@localhost ~]# firewall-cmd --permanent --add-source=192.168.1.100 # 添加白名单地址 [root@localhost ~]# firewall-cmd --permanent --remove-source=192.168.1.100 # 删除白名单地址
8、示例:开放3306 端口
[root@localhost ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent 1、firwall-cmd:是Linux提供的操作firewall的一个工具。 2、--zone:作用域。 3、--permanent:表示设置为持久。永久生效。 4、--add-port=3306/tcp:标识添加的端口,格式为:端口/通讯协议。
五、伪装IP
防火墙可以实现伪装IP的功能,下面的端口转发就会用到这个功能。
[root@localhost ~]# firewall-cmd --query-masquerade # 检查是否允许伪装IP [root@localhost ~]# firewall-cmd --add-masquerade # 允许防火墙伪装IP,开启转发(很重要,否则配置的转发不生效) [root@localhost ~]# firewall-cmd --remove-masquerade # 禁止防火墙伪装IP [root@localhost ~]# firewall-cmd --add-masquerade --permanent # 永久生效,注意--permanent代表永久生效,会讲配置写入/etc/firewalld/zones下的xml配置。不加此参数则在重启设备之前生效。
六、端口转发
端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定ip的话就默认为本机,如果指定了ip却没指定端口,则默认使用来源端口。
如果配置好端口转发之后不能用,可以检查下面两个问题:
- 比如我将80端口转发至8080端口,首先检查本地的80端口和目标的8080端口是否开放监听了。
- 其次检查是否允许伪装IP,没允许的话要开启伪装IP。
# 转发到本机器其它端口,不要要开启IP伪装。转发到其他机器时需要先开启IP伪装。 [root@localhost ~]# firewall-cmd --add-forward-port=port={端口}:proto={协议}:toaddr={地址}:toport={端口} --permanent # 将到本机的3306端口的访问转发到本机服务器的13306端口(注意:转发到本机时不能写本机IP,否则就不会转发成功) [root@localhost ~]# firewall-cmd –-permanent –-zone=public --add-forward-port=port=3306:proto=tcp:toport=13306 # 将到本机的3306端口的访问转发到192.168.1.105服务器的3306端口 [root@localhost ~]# firewall-cmd –-permanent –-zone=public --add-forward-port=port=3306:porto=tcp:toaddr=192.168.1.105 # 将到本机的3306端口的访问转发到192.168.1.105服务器的13306端口 [root@localhost ~]# firewall-cmd --permanent –-zone=public --add-forward-port=port=3306:proto=tcp:toaddr=192.168.1.105:toport=13306
注意:如果不开启伪装IP,端口转发会失败;其次,要确保源服务器上的端口(3306)和目标服务器上的端口(13306)是开启的。端口转发不允许添加accept和reject。
# 将80端口请求转发至本机的3120端口,如果需要永久生效,加–-permanent选项。注意--permanent代表永久生效,会讲配置写入/etc/firewalld/zones下的xml配置。不加此参数则在重启设备之前生效。重载配置文件之后就会失效。 firewall-cmd --add-forward-port=port=80:proto=tcp:toport=3120 # 重载配置回失效 firewall-cmd --add-forward-port=port=80:proto=tcp:toport=3120 --permanent # 重载配置不会失效
七、通过 ipset 来封禁IP
1、增加 ipset
[root@localhost ~]# firewall-cmd --permanent --zone=public --new-ipset=test --type=hash:ip # 方法一:ipv4 [root@localhost ~]# firewall-cmd --permanent --zone=public --new-ipset=test --type=hash:ip --option=family=inet6 # 方法一:ipv6 [root@localhost ~]# firewall-cmd --permanent --zone=public --new-ipset-from-file=/path/test.xml # 方法二:导入 ipset 规则,相当于从配置文件中增加ipset
2、指定 ipset 中增加entry、删除entry
[root@localhost ~]# firewall-cmd --permanent --zone=public --ipset=test --add-entry=1.1.1.1 # 增加entry [root@localhost ~]# firewall-cmd --permanent --zone=public --ipset=test --remove-entry=1.1.1.1 # 删除entry
3、将 ipset 应用到策略中(即添加富规则)
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source ipset=test drop' # 封禁 test [root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source ipset=test accept' # 放行 test [root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source ipset=test port port=3120 protocol=tcp drop' [root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source ipset=test port port=3120 protocol=tcp accept' [root@localhost ~]# firewall-cmd --permanent --zone=public --remove-rich-rule='rule family=ipv4 source ipset=test drop' # 删除上面封禁的 test [root@localhost ~]# firewall-cmd --permanent --zone=public --remove-rich-rule='rule family=ipv4 source ipset=test accept' # 删除上面放行的 test [root@localhost ~]# firewall-cmd --permanent --zone=public --remove-rich-rule='rule family=ipv4 source ipset=test port port=3120 protocol=tcp drop' [root@localhost ~]# firewall-cmd --permanent --zone=public --remove-rich-rule='rule family=ipv4 source ipset=test port port=3120 protocol=tcp accept'
4、重载配置,使防火墙配置生效
[root@localhost ~]# firewall-cmd --reload
5、获取指定 ipset 信息
[root@localhost ~]# firewall-cmd --get-ipsets # 查看ipset名称 [root@localhost ~]# firewall-cmd --info-ipset=test # 查看ipset详细信息
6、删除指定 ipset 信息
[root@localhost ~]# firewall-cmd --permanent --zone=public --delete-ipset=test
7、ipset的存储路径:/etc/firewalld/ipsets
8、ipset类型的区别
# firewall-cmd --permanent --zone=public --new-ipset=blacklist --type=hash:ip # 封禁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 1、hash:ip 2、hash:ip,mark 3、hash:ip,port 4、hash:ip,port,ip 5、hash:ip,port,net 6、hash:mac 7、hash:net 8、hash:net,iface 9、hash:net,net 10、hash:net,port 11、hash:net,port,net
八、防火墙划分的网络区域
一、区域的分类
防火墙可用于根据用户决定放置在设备上的信任级别和该网络内的流量将网络分成不同的区域。NetworkManager通知firewalld接口所属的区域。可以通过NetworkManager或firewall-config工具更改接口的分配区域,该工具可以为您打开相关的NetworkManager窗口。
由firewalld 提供的区域按照从不信任到信任的顺序排序。
1、丢弃区域(Drop Zone):如果使用丢弃区域,任何进入的数据包将被丢弃。这个类似与我们之前使用iptables -j drop。使用丢弃规则意味着将不存在响应。
2、阻塞区域(Block Zone):阻塞区域会拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过即只允许由该系统初始化的网络连接。
3、公共区域(Public Zone):只接受那些被选中的连接,默认只允许 ssh 和 dhcpv6-client。这个 zone 是缺省 zone。
4、外部区域(External Zone):这个区域相当于路由器的启用伪装(masquerading)选项。只有指定的连接会被接受,即ssh,而其它的连接将被丢弃或者不被接受。
5、隔离区域(DMZ Zone):如果想要只允许给部分服务能被外部访问,可以在DMZ区域中定义。它也拥有只通过被选中连接的特性,即ssh。
6、工作区域(Work Zone):在这个区域,我们只能定义内部网络。比如私有网络通信才被允许,只允许ssh,ipp-client和 dhcpv6-client。
7、家庭区域(Home Zone):这个区域专门用于家庭环境。它同样只允许被选中的连接,即ssh,ipp-client,mdns,samba-client和 dhcpv6-client。
8、内部区域(Internal Zone):这个区域和工作区域(Work Zone)类似,只有通过被选中的连接,和home区域一样。
9、信任区域(Trusted Zone):信任区域允许所有网络通信通过。记住:因为trusted是最被信任的,即使没有设置任何的服务,那么也是被允许的,因为trusted是允许所有连接的。
以上是系统定义的所有的 zone,但是这些 zone 并不是都在使用。只有活跃的 zone 才有实际操作意义。安装时,firewalld中的默认区域将设置为公共区域。
注:FirewallD的默认区域是public。firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。
你可以使用任何一种 firewalld 配置工具来配置或者增加区域,以及修改配置。工具有例如firewall-config 这样的图形界面工具, firewall-cmd 这样的命令行工具,或者你也可以在配置文件目录中创建或者拷贝区域文件,/usr/lib/firewalld/zones 被用于默认和备用配置,/etc/firewalld/zones 被用于用户创建和自定义配置文件。
firewalld的配置文件一般有两个存储位置:/etc/firewalld/ 和 /usr/lib/firewalld/。
手动配置的规则会存放到/etc/firewalld/这个目录中,如果这个目录中没有找到对应的配置文件,就会去/usr/lib/firewalld/这个默认路径下查找。因此需要手动恢复默认规则就要删除/etc/firewalld/下面对应的文件即可。
二、常用命令
[root@localhost ~]# firewall-cmd --get-zones # 查看全部区域 [root@localhost ~]# firewall-cmd --get-active-zone # 查看当前活跃的区域 [root@localhost ~]# firewall-cmd --get-default-zone # 查看当前默认的区域 [root@localhost ~]# firewall-cmd --set-default-zone=drop # 修改当前默认的区域为drop [root@localhost ~]# firewall-cmd --get-zone-of-interface=eth0 # 查看某块网卡在firewalld服务中的区域 [root@localhost ~]# firewall-cmd --permanent --add-source=192.168.1.15 --zone=trusted # 将允许的IP或者IP段加入trusted白名单 [root@localhost ~]# firewall-cmd --permanent --remove-source=192.168.1.15 --zone=trusted # 删除上面得规则 [root@localhost ~]# firewall-cmd --permanent --add-interface=eth1 --zone=trusted # 在某域中添加接口 [root@localhost ~]# firewall-cmd --permanent --remove-interface=eth1 --zone=public [root@localhost ~]# firewall-cmd --permanent --change-interface=eth1 --zone=public # 改变接口,将网络接口关联至public区域
三、每个zone就是一套规则集,但是有那么多zone,对于一个具体的请求来说应该使用哪个zone(哪套规则)来处理呢?
对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:
- 1、source,也就是源地址 优先级最高
- 2、interface,接收请求的网卡 优先级第二
- 3、firewalld.conf中配置的默认zone 优先级最低
这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是在firewalld.conf中配置的默认zone。
九、CentOS 8的firewalld已经与iptables解绑
1、在CentOS8中,采用firewalld管理netfilter子系统,firewalld已经与iptables解绑,firewalld的后端程序改用nftables了。底层调用的是nft命令,而非iptables命令。
2、将firewalld的后端从nftables切换回iptables,操作方法:以root管理员权限修改/etc/firewalld/firewalld.conf配置文件,将FirewallBackend的值改为iptables。
https://www.cnblogs.com/metoy/p/4320813.html
https://blog.51cto.com/babyshen/2065749
https://wiki.archlinux.org/index.php/Nftables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://blog.csdn.net/aokedlpxv22775032/article/details/101451704
https://blog.csdn.net/u012385733/article/details/80881343
https://blog.starryvoid.com/archives/366.html
https://www.cnblogs.com/ilvutm/p/9301919.html
https://www.cnblogs.com/lemon-flm/p/7608029.html
https://www.cnblogs.com/cy-8593/p/9506758.html
https://www.jb51.net/article/156954.htm
https://www.cnblogs.com/zxg-blog/p/9835263.html
https://www.cnblogs.com/volcao/p/9521884.html
https://www.cnblogs.com/longhao/p/3993011.html