如何使用Firewalld配置Linux主機?
介紹
在之前的文章中我介紹了Linux防火牆的基本配置,並在最後簡單提及了下firewalld。本文我將詳細為大家介紹如何使用firewalld配置Linux防火牆。Firewalld為使用者提供了一個GUI介面,在這上面使用者可以訪問到所有的功能。此外,它還為我們提供了一個工作列/面板小程式,可以讓你快速的訪問到最常用的功能,包括“阻止所有網路流量”選項。大多數配置都將在CLI(命令列介面)完成。本文我使用的是xfce終端,但只要是支援bash,ksh或其他Linux shell的任何終端你都可以用。
關於 firewalld
firewalld提供了支援網路/防火牆區域(zone)定義網路連結,以及介面安全等級的動態防火牆管理工具。它支援IPv4,IPv6,乙太網橋以及IPSet防火牆設定。擁有執行時配置和永久配置選項。它還為服務或應用程式提供了一個介面,可以直接新增iptables,ip6tables和ebtables規則。高階使用者也可以使用此介面。
參考來源: ofollow,noindex" target="_blank">https://firewalld.org/documentation/
這部分的內容可能需要更新,現在firewalld已經支援nftables。如果你安裝了iptables並且想要使用nftables,那麼你應該結束所有iptables程序(理想情況下,如果這是你首選的防火牆選項,那麼最好是安裝nftables之前解除安裝iptables)。
帶有防火牆配置的Firewalld,它的圖形配置工具和防火牆面板小程式你可以從Ubuntu的儲存庫中進行安裝(所有Ubuntu的衍生版都可以從這裡安裝 )。此外,它也是Centos中的預設防火牆選項,大多數主要Linux發行版都可以在 pkgs.org 中以下列格式獲取:
.rpm .deb .tar.xz
以及適用於以下發行版的firewalld linux軟體包:
ALT Linux Sisypus
Arch
Centos7
Mageia
Open Suse
Ubuntu
包括其它一些非發行版本的軟體包
安裝 firewalld
在大多數主要的Linux發行版中,你只需從包管理器(synaptic,pacman等)中選擇firewalld(以及GUI和麵板小程式,如果你需要的話),下載並讓包管理器安裝即可。
或者你也可以 編譯安裝firewalld 。
你可以在執行時環境中進行更改,不需要重新啟動服務或守護程式。
使用firewalld D-Bus介面,服務,應用程式和使用者都可以輕鬆調整防火牆設定。該介面被用於防火牆配置工具firewall-cmd,firewall-config和firewall-applet。
執行時和永久配置的分離使得在執行時進行評估和測試成為可能。執行時配置僅在下次服務重新載入和重新啟動或系統重新引導時有效,並將再次載入永久配置。 使用執行時環境,可以使用執行時的設定這些設定只在有限的時間內有效。如果執行時配置已用於評估,並已完成且正常工作,則可以將此配置儲存到永久環境中。
特性
完整的D-Bus API
支援IPv4,IPv6,網橋和ipset
支援IPv4和IPv6 NAT
防火牆區域(zones)
預定義的區域,服務和icmptypes列表
區域中的簡單服務,埠,協議,源埠,地址偽裝(masquerading),埠轉發,icmp過濾器,豐富規則,介面和源地址處理
簡單的服務定義,包括埠,協議,源埠,模組(netfilter helpers)和目標地址處理
豐富的語言,可在區域中實現更靈活,複雜的規則
區域中的定時防火牆規則
簡單記錄被拒絕的資料包
直接介面
鎖定:可能修改防火牆的應用程式的白名單
自動載入Linux核心模組
與Puppet整合
命令列clints用於聯機和離線配置
使用gtk3的圖形配置工具
參考來源: https://firewalld.org/
所有firewalld軟體和文件(包括網站)都包含在 https://unlicense.org/ 中。
安裝firewalld後,你可以啟用該服務並重啟伺服器。注意:啟用firewalld將導致服務在重啟時啟動。最佳做法是在配置此行為之前建立防火牆規則,並對其進行測試以避免潛在問題的發生。
sudo systemctl enable firewalld sudo reboot
當伺服器重啟時,防火牆會被啟動,你的網路介面將被放入你配置的區域(或回退到配置的預設區域),並且與區域關聯的任何規則都將應用於關聯的介面。
參考來源: 在centos7上使用firewalld
如果你安裝了firewall-config,它應該在你的選單中。在Mint中,它位於Menu→system下。你只需單擊“firewall”啟動firewall-config,並在出現提示時輸入密碼即可。
區域中public是預設值,預設情況下信任的服務為dhcpv6,mdns和ssh的最小集合。相同的基本可信服務集適用於內部區域。
工作區僅信任dhcpv6和ssh,外部區域僅信任ssh。
而在所有其他區域中,則沒有服務被信任:
dmz(非軍事區):僅接受ssh服務 block(限制):拒絕所有的網路服務 drop(丟棄):任何訪問的網路資料包都會被丟棄,沒有任何迴應 trust(信任):可接受所有的網路連線
檢視區域選項卡中的其他選項我們發現:
在埠中,沒有定義任何的內容
在協議中,也沒有定義任何內容
地址偽裝未開啟
埠轉發沒有任何內容
而且沒有定義ICMP過濾器
沒有“豐富的規則”,也沒有介面,來源。
因此,看起來firewalld做了一個合理的工作,即設定最小的預設值以允許基本的工作站操作。伺服器將需要根據其預期的功能進行不同的配置。
檢視服務選項卡,每個預定義服務都分配了其預設埠要求。
telnet在埠23 tcp,ntp在埠123 udp上,snmp在埠161上用於moth tcp和udp等等…
注意:firewalld對許可權的超時非常嚴格,可能你離開幾秒鐘,它就會要求你再次進行身份驗證。
如果面板小程式正在執行,預設情況下你將在panel0中看到:
帶有紅色圓圖示的那個就是。
點選它,將會出現一個下拉選單:
在對GUI做了基本的瞭解後,現在是時候回到命令行了!
命令列下 firewalld 配置
在開始配置防火牆之前,先讓我們看一下現有的預設配置。
使用以下命令,檢視firewalld當前配置狀態的一些基本資訊:
davdi@davdi-G1-SNIPER-B7 ~ $ sudo firewall-cmd --state [sudo] password for davdi: running davdi@davdi-G1-SNIPER-B7 ~ $ davdi@davdi-G1-SNIPER-B7 ~ $ sudo firewall-cmd --state running davdi@davdi-G1-SNIPER-B7 ~ $ firewall-cmd --get-default-zone public davdi@davdi-G1-SNIPER-B7 ~ $ firewall-cmd --get-active-zones public interfaces: enp0s31f6 davdi@davdi-G1-SNIPER-B7 ~ $ firewall-cmd --list-all public (default, active) interfaces: enp0s31f6 sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: icmp-blocks: rich rules:
davdi@davdi-G1-SNIPER-B7 ~ $ firewall-cmd --get-zones block dmz drop external home internal public trusted work davdi@davdi-G1-SNIPER-B7 ~ $ firewall-cmd --zone=home --list-all home interfaces: sources: services: dhcpv6-client mdns samba-client ssh ports: protocols: masquerade: no forward-ports: icmp-blocks: rich rules:
davdi@davdi-G1-SNIPER-B7 ~ $ firewall-cmd --get-services amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server davdi@davdi-G1-SNIPER-B7 ~ $
所有服務定義都以xml格式檔案被儲存在/usr/lib/firewalld/services中。
你可以在任何的文字編輯器,Web瀏覽器或xml檢視器中檢視這些內容。
獲取當前配置狀態後,接下來就是配置firewalld以符合我們的使用需求。
firewalld 配置
首先,我們將預設區域更改為home:
davdi@davdi-G1-SNIPER-B7 ~ $ sudo firewall-cmd --zone=home --change-interface=eth0 [sudo] password for davdi: success
davdi@davdi-G1-SNIPER-B7 ~ $ firewall-cmd --get-active-zones home interfaces: eth0 public interfaces: enp0s31f6 davdi@davdi-G1-SNIPER-B7 ~ $
現在,讓我們將home區域設為預設區域:
davdi@davdi-G1-SNIPER-B7 ~ $ firewall-cmd --set-default-zone=home success davdi@davdi-G1-SNIPER-B7 ~ $
注意:如果你忘記使用sudo,則可能會要求你輸入密碼(這取決於的Linux發行版本)。除非你想要關閉所有不必要的埠,停止響應ping請求等行為,以最小化你的攻擊面。
首先,建議你檢視下當前開放的埠有哪些:
你可以使用cat /etc/services命令,檢視服務及其對應的埠號。
但這很可能會向你展示一長串的埠列表,看起來會讓你覺得有點暈。
更好的辦法是使用nmap來檢視。如果你的系統上沒有nmap,只需簡單的安裝即可。
Nmap 127.0.0.1將為你顯示當前有哪些埠正在使用。
Firewall-cmd –list-ports也會為你顯示相同的結果。
如果要開啟特定埠,可以–add-port選項指定:
davdi@davdi-G1-SNIPER-B7 ~ $ sudo firewall-cmd --add-port=8080/tcp [sudo] password for davdi: success davdi@davdi-G1-SNIPER-B7 ~ $
不要忘記重新載入firewalld來啟用更改:firewall-command –reload
記住,更改將在重啟後失效,除非你設定了永久更改。
sudo firewall-cmd--permanent --add-port=8080/tcp
注意:這裡我沒有執行該命令,因為我不需要進行永久性的更改。
我省略了區域,因為之前我將預設區域設定為了“home”,省略區域後將對預設(home)區域進行更改。
你還可以新增一個範圍的埠,如下所示:
sudo firewall-cmd --zone=home --permanent --add-port=3500-3559/udp
以上埠範圍是我隨意選的,沒什麼特別的意義。
或者你也可以使用圖形介面:
從下拉選單中選擇相關協議。
定義服務
為你的區域開啟埠很容易,但管理起來就比較麻煩。如果你在伺服器上退役某項服務,那麼你可能很難記住仍然需要開啟哪些埠。為避免這種情況,你可以定義一個服務。
服務只是具有相關名稱和描述的埠集合。使用服務比埠更加容易管理,但需要做一些前期的工作。最簡單的方法是將現有指令碼(位於/usr/lib/firewalld/services)複製到防火牆查詢非標準定義的/etc/firewalld/services目錄中。
例如,我們可以複製SSH服務定義用於我們的“example”服務定義。
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
現在,你可以使用首選編輯器調整在複製的檔案中找到的定義。
該檔案將包含你複製的SSH定義:
/etc/firewalld/services/example.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful. <port protocol="tcp" port="22"/> </service>
參考來源: 在centos7上使用firewalld
大多數檔案都包含xml元資料,以下是我們重點需要關注的部分:
<port protocol="tcp" port="22"/>
這裡將會告訴我們,當前正在使用的埠和協議。
總結
相信通過本文的學習,你已基本掌握了firewalld防火牆的配置。在這裡也提醒大家,在未做好充分的準備和決定之前不要輕易的執行永久更改操作,並在更改的過程中提前做好重要資料內容的備份,以便在出現問題時進行回滾。
*參考來源: peerlyst ,FB小編secist編譯,轉載請註明來自FreeBuf.COM