一、安裝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