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