以往CentOS6以前,防火牆使用iptables來運作,但是每次重設規則後,
必須清除原有規則,會影響到原有的連線狀態,CentOS 7 Firewalld
最大的好處有兩個:
1、支援動態更新,不用重啟服務;
2、加入了防火牆的“zone”概念
因此在使用上靈活度比iptables更高,運用firewall-cmd 指令來操作
須注意的是兩者會衝突不能共用,接來來介紹如何安裝及使用 CentOS 7 防火牆
安裝firewalld
yum install firewalld
檢查 firewalld 服務是否有啟動,如顯示active表示已啟動
systemctl status firewalld
● firewalld.service – firewalld – dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor prese t: enabled)
Active: active (running) since Mon 2020-11-02 15:14:16 CST; 4h 36min ago
Docs: man:firewalld(1)
Main PID: 2995 (firewalld)
CGroup: /system.slice/firewalld.service
└─2995 /usr/bin/python -Es /usr/sbin/firewalld –nofork –nopid
或是是輸入,顯示為running(表示啟動)
firewall-cmd --state
firewalld 啟動與關閉
啟動 firewalld 服務
systemctl start firewalld
停止 firewalld 服務
systemctl stop firewalld
重新啟動 firewalld 服務
service firewalld restart
firewalld 在開機時自動啟動
systemctl enable firewalld
firewalld的使用是由firewall-cmd 命令作為開頭再加上區域(zone)或是指令動作
先決定要設定的zone,再輸入規則,
如果需要永久啟動此規則最後加入–permanent,
最後sudo firewall-cmd –reload
Zone 區域
區域 描述
drop 任何往內的封包都會被丟棄,只允許往外傳送的封包。
block 任何來自於外部的連線都會被阻擋,只允許自己系統主動建立的連線。
public 公開區域,預設不信任其他電腦與網路,只有被允許的連線才能進入。通常大部分的連線設定都會放在這裡。
external 公開區域,適用於 NAT 網路環境。
dmz 非軍事區域(demilitarized zone,有點像是放在外頭的危險區域),允許外部的連線進入,但其對內的連線則有限制,只有被允許的連線才能連進內部網路。
work 公司內部等工作區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。
home 家裡頭的網路區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。
internal 內部網路區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。
trusted 完全信任的區域,接受所有連線。
了解區域的描述之後,接著區域設定
列出所有的區域
firewall-cmd --get-zones
block dmz drop external home internal public trusted work 詳細區域內容
firewall-cmd --list-all-zones
….略
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
上述為預設 public zone 區域,開啟兩個服務 dhcpv6-client ssh,
其他服務關閉,
查詢永久設定值
firewall-cmd --zone=public --list-all --permanent
區域的服務
若要在防火牆上開啟一些連接埠,讓對外的服務使用,可以再區域設定中新增一些服務設定。firewalld 中有預先定義一些常用的服務名稱
列出預先定義的服務名稱
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-t estnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm d ropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia -master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target jenkins kadmin ke rberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls managesieve mdns minidlna mongodb mosh moun td ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansyn c squid ssh syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-cl ient upnp-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
大部分常見的網路服務都有在這個列表中,
若要將指定的服務新增至指定的區域中,例如:
將 http 服務新增至 public 區域中
firewall-cmd --zone=public --add-service=http
永久http 服務新增至 public 區域中
firewall-cmd --zone=public --add-service=http --permanent
列出 public 區域永久的服務設定
firewall-cmd --zone=public --list-services --permanent
將 https 服務新增至 public 區域中
firewall-cmd --zone=public --add-service=https
永久將 https 服務新增至 public 區域中
firewall-cmd --zone=public --add-service=https --permanent
設定預設區域
當網路介面或是連線沒有指定區域時,就會直接納入預設區域中。
查詢目前預設的區域:
firewall-cmd --get-default-zone
public
若要更改 firewalld 預設的區域,例如將public改為home
firewall-cmd --set-default-zone=home
再次確認預設區域
firewall-cmd --get-default-zone
home
新增一個zone
firewall-cmd --new-zone=zone-name
永久新增一個zone
firewall-cmd --new-zone=zone-name --permanent
介面所屬區域
列出目前所有運作中的區域,以及各個網路介面所屬的區域
firewall-cmd --get-active-zones
public
interfaces: eth0
暫時將 eth0 網路介面設定至 home 區域
sudo firewall-cmd –zone=home –change-interface=eth0
永久將eth0 網路介面設定至 home 區域,則需要到/etc/sysconfig/network-scripts/修改
vi /etc/sysconfig/network-scripts/ifcfg-eth0
ZONE=home
自訂開啟連接埠
基本上 firewalld 有內定的服務都可以使用上面這種方式開啟,如果我們想要開啟的連接埠不在 firewalld 內建的服務名單中,也可以直接指定通訊協定(tcp 或 udp)與埠號:
–zone:指定區域
–add-port:加入欲開啟的連接埠,並指定通訊協定
–remove-port:移除開啟的連接埠,並指定通訊協定
查看已開啟連接埠
firewall-cmd --list-ports
開啟 tcp 的 8080 連接埠
firewall-cmd --zone=public --add-port=8080/tcp
永久開啟 tcp 的 8080 連接埠
firewall-cmd --zone=public --add-port=8080/tcp --permanent
埠號的部分也可以用範圍的方式指定,一次開通多個連接埠
開啟 udp 的 4990 至 4999 連接埠
firewall-cmd --zone=public --add-port=4990-4999/udp
永久開啟 udp 的 4990 至 4999 連接埠
firewall-cmd --zone=public --add-port=4990-4999/udp --permanent
重新載入設定後生效
firewall-cmd --reload
移除服務與埠號
將指定的服務從某個區域中移除
將 http 服務從 public 區域中移除
firewall-cmd --zone=public --remove-service=http
永久將 http 服務從 public 區域中移除
firewall-cmd --zone=public --remove-service=http --permanent
移除自訂的通訊協定與埠號
關閉 tcp 的 8080 連接埠
firewall-cmd --zone=public --remove-port=8080/tcp
永久關閉 tcp 的 8080 連接埠
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
重新載入設定後生效
firewall-cmd --reload
新增服務名稱
建立一個新的服務,有利於整個防火牆的規劃,管理開啟的埠號會更直覺化
新增一個名為test服務
firewall-cmd --new-service=test --permanent
新增描述
firewall-cmd --service=test --set-description="Test Service" --permanent
新增short描述
firewall-cmd --service=test --set-short=test --permanent
新增服務所使用的連接埠
firewall-cmd --service=test --add-port=10030/tcp --permanent
重新載入
firewall-cmd --reload
Port Forwarding 連接埠轉發
利用–add-forward-port參數,將來自連接埠A的資料轉發至連接埠B
將Port=22的資料轉發至Port=2288
firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2288
將port22的資料轉發到192.168.8.100
firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toaddr=192.168.8.100
將port22的資料轉發到192.168.8.100的port2288
firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2288:toaddr=192.168.8.100
偽裝IP
如果是不同主機之間需要轉發,則需啟動masquerade來偽裝
檢查是否允許偽裝IP
firewall-cmd --query-masquerade
允許防火牆偽裝IP
firewall-cmd --add-masquerade
禁止防火牆偽裝IP
firewall-cmd --remove-masquerade
永久啟用public區域中的偽裝
firewall-cmd --zone=public --add-masquerade --permanent
臨時禁用public區域中的 IP 偽裝
firewall-cmd --zone=public --remove-masquerade
永久禁用public區域中的偽裝
firewall-cmd --zone=public --remove-masquerade --permanent
查詢public區域的偽裝狀態
firewall-cmd --zone=public --query-masquerade
查詢public區域中的偽裝的永久狀態
firewall-cmd --zone=public --query-masquerade --permanent
Rich rules 的使用
查詢已加入的rich rules
firewall-cmd --list-rich-rules
IP白名單
允許來自192.168.8.100的連線
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.8.100 accept'
永久允許來自192.168.8.100的連線
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.8.100 accept' --permanent
允許來自 192.168.8.1 ~ 192.168.8.254 的所有 ssh 連線
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.8.0/24" service name="ssh" accept' --permanent
IP黑名單
拒絕來自192.168.8.100的連線
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.8.100" reject' --permanent
拒絕來自192.168.8.100的22埠號連
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="92.168.8.100" port port="22" drop' --permanent