對于之前的Linux發行版來說,其防火墻管理工具包 括 Iptables、IP6tables以 及ebtables等。 在Linux7中則提供了名為Firewalld的管理工具,其包含在Firewalld軟件包中。因為普通用戶無法直接操作內核空間的Netfilter組件,所以需要使用以上工具對其進行管理。
因 為Firewalld是Linux7默認的管理工具,為了防止和Iptables產生沖突,可以編寫一個簡單的腳本,包含“#!/bin/bash”、“for SERVICE in iptables ip6tables ebtables”、“systemctl mask ${SERVICE}.service”、“done”等行,執行“chmod 755 xxx.sh”、“./xxx.sh”命令,執行該腳本,其名稱假設為“xxx.sh”,就可以禁用之前的管理工具。
Linux7支 持Trusted、Home、Internal、Work、Public、External、DMZ、Block、Drop等區域。區域定義了綁定的網絡連接,接口以及源地址的可信程度。區域是服務、端口、協議、IP偽裝、端口/報文轉發、ICMP過濾以及富規則的組合,區域可以綁定到接口以及源地址,區域其實就是一組規則的集合。其配置方法有三種,一是直接編輯配置文件,配置文件保存在“etc/firewalld”目錄,其中包含“firewalld.conf”主配置文件,名為“services”的服務目錄,名為“zones”的區域目錄等。二是使用圖形界面工具firewall-config,當運行該命令后,在區域列表中顯示所有的區域名稱,Public是默認區域。三是使用命令行工具firewall-cmd,例如執行“firewall-cmd --getzones”命令,顯示所有的區域。 執 行“firewall-cmd--get-default-zones” 命令,查看默認的區域。
對于trusted區域來說,允許所有進來的流量。例如,在本機上安裝了HTTPD服務,可以提供Web訪問服務。
但是在防火墻保護下,默認狀態外界是無法訪問的。執行“firewall-cmd --getactive-zones”命令,顯示當前的活動區域為Public。Public區域會拒絕進入的流量,除非和出去的流量相關聯。
當然,對于SSH、dhcpv6-client等預先定義的服務來說,是允許連接的。執行“firewall-cmd --setdefault-zones=trusted”命令,將默認區域設置為trusted。這樣,外界就可以訪問本機的Web服務了。
對應的,執行“firewallcmd --set-defaultzones=block”命令,將當前區域設置為Block,那么將攔截所有進入的流量,除非和出去的流量相關聯。這比Public區域要嚴格。
注意,這種拒絕依然會返回錯誤信息。例如對于ping探測來說,會被Block區域攔截,但是會給探測者返回“無法訪問目標主機”的錯誤信息。對于Drop區域來說,會丟棄所有進入的流量。除非和出去的流量相關聯。但是這種拒絕不會返回任何錯誤信息。當設置為Drop后,如果希望其允許SSH連接進入的話,可以執行“firewall-cmd --addservice=ssh”命令,將SSH服務添加到當前區域。
執 行“firewal-cmd--list-all”命令,顯示當前區域的所有規則。當然,執行“firewal-cmd --listall-zone=public”命令,可以查看指定區域(這里為Public)的所有規則。執行“firewall-cmd --list-allzone”命令,可以查看所有區域的規則。除了按需開放服務外,也可以靈活的開啟端口。
例如對于FTP服務來說,既可以執行“firewall-cmd--add-service=ftp”命令,也可以執行“firewall-cmd--add-port=21/tcp”命令,來開放FTP服務。當然,這些服務必須預先設置好。執行“firewall-cmd --getservices”命令,可以顯示一些預先的好的服務。進入“/usr/lib/firewalld/services”目錄,在其中顯示所有預先定義的服務的配置文件(后綴為“.xml”)。
例如執行“vim samba.xml”命令,可以查看與Samba服務相關的定義信息,在其中顯示與其關聯的需要開放的端口信息(例如UDP 137/138/138,TCP 445 等)。對 應 的,執 行“firewallcmd --remove-service=ftp”或 者“firewall-cmd--remove-port=21/tcp”命令,可以禁止FTP服務通過防火墻。
注 意,對 于“Drop”區域來說,其規則中添加的“Source”地址是被拒絕的,但是添加的“service”服務以及“Port”端口是允許開放的。在當前區域為“Drop”的情況下,執行“firewall-cmd --addsource=172.16.1.0/24”命令,則拒絕指定IP范圍內的網絡連接通過防火墻。執行“firewall-cmd --addsource=172.16.1.100/32”命令,對于地址為“172.16.10100”的主機來說,是無法通過防火墻進行連接的。
如果想禁止多個地址,連續執行上述命令即可,例如繼續執行“firewallcmd --add-source=172.16.1.109/32”命 令,可 以 將IP為“172.16.10.100” 和“172.16.1.109”的主機拒之門外。執行“firewallcmd --set-defaultzones=public”命令,將當前區域設置為“Public”。執行“firewal-cmd --listall”命令,顯示該區域的所有規則。執行“firewalcmd --addl-service=http”命令,允許外界訪問本機的Web服務。執行“firewalcmd --permanent-addservice=ftp”和“firewallcmd --reload”命令,可以添加永久性的規則,允許外界訪問本機的FTP服務。
這和之前的規則不同,之前的規則在系統重啟后會消失,而本規則不會出現這種情況。
執 行“f i r e w a lc m d --c h a n g einterface=enoxxxxxxxx -zone=trusted”命令,可以將指定的網絡接口(該接口當前屬于“Public”區域)添加到“trusted”區域。之后執行“firewall-cmd --getactive-zones”命令,可以看到當前活動區域由“Public”變成了“trusted”。這就說明,活動區域必須和特定網絡接口相關聯。
例如對于某防火墻主機來說,配置了三塊網卡,分別連接內網、外網和DMZ區域,對于內網來說,一般設置為Trusted區域,這樣該區域就必須和特定的網卡關聯方可。在同一時刻可以存在多個活動區域。
對于防火墻來說,規則的制定是極為重要的。防火墻會首先檢測數據包的源地址,如果其匹配區域中的源規則,就會被該區域路由。之后防火墻會根據數據包中的進入接口檢查匹配的區域,并由匹配的區域進行處理。最后才根據默認區域的規則,對數據包進行檢測。
除了區域和服務之外,FireWalld同時也提供了“Direct rules”(直接規則)和“Rich Rules”(富規則)這兩個選項。
前者主要用于使服務和應用程序能夠增加規則,可以對服務和應用程序進行有效控制。相對于富規則來說,其靈活性較差難以管理,一般很少使用其對防火墻進行管理和控制。富規則提供了更為復雜和精細的配置,其語法相對來說比較復雜。能夠對數據包的源地址,目標地址進行過濾,針對服務、端口、協議、ICMP 攔截、偽裝、端口轉發等動作進行控制,對于流量可以進行更加精細的管控,并且可以將流量信息記錄到日志和審計中,根據具體情況可以執行接受,拒絕和丟棄等操作。
例如執行“firewallc m d --p e r m a n e n t--zone=classroom -add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'”命令,對于自定義 區 域“classroom” 增加一條富規則,作用是針對IPv4流量進行控制,拒絕源地址為192.168.0.11的連接。執行“firewallcmd --reload”,“firewallcmd --list-rich-rules-zone=xxx”命 令,列 出“xxx”區域中的所有的富規則。執行firewall-cmd--remove-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'”命令,可以移除指定的富規則。
對應的,執行執行firewall-cmd --permanent--remove-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'”命令,可以永久的移除指定的富規則。
執 行“firewall-cmd--add-rich-rule='rule service name=ftp limit value=2/m accept'”命令,對于當前區域增加一條富規則,作用是針對FTP連接進行控制,只允許在每分鐘內接受兩個新連接。執行“firewall-cmd --permanent--add-rich-rule='rule protocol name=esp drop'”命令,對于當前區域增加一條富規則,作用是禁止IPSec中的ESP協議進行連接。
執 行“firewall-cmd--permanent --zone=xxx-add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port=7900-8000 protocol=tcp accept'”命令,對于區域“xxx”增加一條富規則,作用是針對IPv4流量進行控制,允許源地址為192.168.1.0/24,端口來自7900到8000的TCP連接通過防火墻。
為了便于監控流量信息,還可以將其記錄到日志中。例如執行“firewall-cmd--permanent --zone=xxx-add-rich-rule='rule service name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept'”命令,表示針對區域“xxx”添加一條富規則,將服務名為“ssh”的流量放行,并將其記錄到日志中,其自定義前綴為“ssh”,等級為“notice”,記錄的速率為每分鐘三條。日志的級別包括emerg(恐慌)/alert(報警)/crit(緊急)/error(錯誤)/warning(警 告)/notice(提醒)/info(正常信息)/debug(調試)等。執行“grep ssh /var/log/message”命令,就可以檢索到這些日志信息。
執 行“firewall-cmd--add-rich-rule='rule family=ipv6 source address="2001:db8::/64"service name="dns" audit limt value="1/h" reject'-timeout=300”命 令,可以為當前區域添加一條富規則,作用是針對IPv6流量進行控制,拒絕源地址為“2001:db8::/64”,服務名為“dns”的流量,并對其進行審計,速率為每小時處理一條消息,該規則超時時間為300毫秒。
當安裝了HTTPD之后,執 行“systemctl start https” 命 令,啟 動Web服 務。 執 行“firewallc m d --p e r m a n e n t--zone=public --addr i c h-r u l e='r u l e family=ipv4 source address=172.16.1.0/24 service name=http log p r e f i x="N E W H T T P"level="notice" limit value="3/s" accept'”命令,添加一條富規則,對源地址為172.16.1.0/24,服務名為“http”的連接進行記錄,前日志前綴為“NEW HTTP”,速率為每秒3條,對這樣的連接放行。
執 行“firewall-cmd--reload”命令進行加載,執行“tail -f /var/log/messages”命令,監視日志的變化情況。
在Linux 7的防火墻機制中,提供了地址偽裝和端口轉發功能。對于端口轉發,實際分為SNAT和DNAT兩部分。
對于前者來說,可以實現源地址轉換,常用于內網用戶共享上網。對于后者來說,可以實現目標地址轉換,常用來實現端口的映射發布內網服務器,允許外界用戶進行訪問。
例如,當內網中的主機需要訪問外網中的某臺Web主機的話,就需要在防火墻上對內網地址進行偽裝,將其偽裝成外網地址,然后才可以實現上述訪問要求。
在防火墻主機上至少需要安裝兩塊網卡,分別連接內網和外網。執行“firewall-cmd -listall”命令,在默認情況下當前區域的規則列表中的“masquerade:”欄 中 顯示“no”,說明偽裝并沒有打開。執行“firewall-cmd--permanent --zone=public-add-masquerade”命令,為Public區域添加偽裝。
執 行“firewall-cmd--reload”和“firewall-cmd-list-all”命令,顯示偽裝功能已經打開。是因為在上面的例子中,已經為Public區域設置了相應的富規則,允許172.16.1.0/24網段的主機通過防火墻來訪問外網,而且將連接內外網的接口添加到了Public區域的“interrface”接口列表中了。
這樣偽裝效果就發揮了出來,內網中該網段內的主機就可以通過防火墻訪問外網Web主機了。
對于端口轉發來說,即可以從本機的一個端口轉發到另一個端口,也可以從本機的一個端口轉發到另一個系統,這只是在偽裝接口的情況下有用,其前提是偽裝功能要打開。注意,端口轉發只是用于Ipv4。
例如,當外網主機想訪問某內網主機的Telnet服務,就可以通過端口轉發來實現,即將內網目標主機的TCP 23端口通過防火墻轉發出去。
執 行“firewall-cmd--permanent --zone=public--add-forward-port=por t=23:proto=tcp:toport=2 3:toaddr=172.16.1.100”,“firewall-cmd --reload”命令,就可以將IP為172.16.1.100內網主機的TCP 23端口通過防火墻轉發出去。外網主機通過訪問防火墻主機的TCP 23端口,就可以映射到特定的內網主機TCP 23端口上。 執 行“firewall-cmd--permanent --zone=work--add-rich-rule= 'rule family=ipv4 source address=192.168.0.0/26 forward-port port=80 p r o t o c o l=t c p t oport=8080'”、“firewall-cmd--reload”命令,使用富規則實現轉口轉發,可以將指定源地址TCP80端口訪問轉發到本系統的TCP 8080端口。這樣,就實現了針對本系統的端口轉發功能。
應該指出,在一個區域中(例如“Public”),規則的匹配順序是偽裝和轉口轉發優先級最高,之后是日志記錄功能,再次是允許規則,最后是拒絕規則。
處理使用系統自帶的區域和服務外,Linux 7的防火墻也允許用戶自定義所需的區域和服務。防火墻配置文件分別存儲在“/usr/lib/firewalld” 和“/etc/firewalld”目錄中。
對于前者來說是系統默認的,對于后者來說是當前使用的。如果要自定義區域和服務,就需要以前者為模版。
防火墻區域的定義信息存儲在“.xml”格式的文件中,進入“/etc/firewalld/zones”目錄中,執行“cat public.xml”命 令,顯 示Public區域的配置信息,在其中包含該區域的所有規則信息。可以在其中直接添加規則,實現靈活的規則編輯操作。
進 入“/u s r/l i b/firewalld/zones”目錄,在其中顯示各種默認的區域配置信息。執行“cat public.xml”命令,查看默認的區域配置信息,包括默認開放的服務。但是其中并沒有包含任何規則。
了解了這些內容,實現自定義區域操作就很簡單了。例如執行“firewall-cmd--new-zone --permanent--new-zone=workzone”,“firewall-cmd --reload”命令,可以自定義一個名為“workzone”的區域。進入“/etc/firewalld/zones”目錄中,可以看到該區域配置文件。當然,該文件默認中的配置信息為空。
執 行“f i r e w a l lc m d --l i s t-a l l--zone=workzone”命令,顯示其不包含任何規則信息。之后可以按照上面談到的方法,執行各種命令,為其添加所需的規則。
例如執行“firewallc m d --c h a n g einterface=enoxxxxxx -zone=workzone”命令,將指定的網絡接口添加到該自定義區域。執行“firewall-cmd-zone=workzone --addservice=ssh --permanent”,“firewall-cmd --reload”命令,為該區域添加SSH服務,即允許連接SSH服務。這樣,在客戶端連接與上述“enoxxxxxx”相關的IP時,就可以訪問該機的SSH服務了。
當然,也可以進入“/etc/firewalld/zones”目錄中,執行“vi workzone.xml”命令進行編輯,添加“