Linux下的防火墻功能是非常豐富的,但阿銘在日常的運(yùn)維工作中,使用它的情況并不多。所以阿銘打算把一些常用的知識(shí)點(diǎn)介紹給大家。
14.4.1 SELinux
SELinux是Linux系統(tǒng)特有的安全機(jī)制。因?yàn)檫@種機(jī)制的限制太多,配置也特別煩瑣,所以幾乎沒有人真正應(yīng)用它。安裝完系統(tǒng),我們一般都要把SELinux關(guān)閉,以免引起不必要的麻煩。臨時(shí)關(guān)閉SELinux的方法為:
?
# setenforce 0
?
但這僅僅是臨時(shí)的,要想永久關(guān)閉需要更改配置文件/etc/selinux/config,需要把SELINUX= enforcing改成SELINUX=disabled,更改后的內(nèi)容如下所示:
?
#?cat?/etc/selinux/config #?This?file?controls?the?state?of?SELinux?on?the?system. #?SELINUX=?can?take?one?of?these?three?values: #?enforcing?-?SELinux?security?policy?is?enforced. #?permissive?-?SELinux?prints?warnings?instead?of?enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled #?SELINUXTYPE= can?take?one?of?three?two?values: #?targeted?-?Targeted?processes?are?protected, #?minimum?-?Modification?of?targeted?policy.?Only?selected?processes?are?protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
?
更改完該配置文件后,重啟系統(tǒng)方可生效。可以使用getenforce命令獲得當(dāng)前SELinux的狀態(tài),如下所示:
?
# getenforce Disabled
?
阿銘的SELinux早就關(guān)閉了,所以會(huì)顯示為Disabled,如果還沒有關(guān)閉默認(rèn)會(huì)輸出enforcing。當(dāng)使用setenforce0這個(gè)命令后,再執(zhí)行g(shù)etenforce命令會(huì)輸出permissive。
14.4.2 netfilter
在之前的CentOS版本(比如CentOS6)的防火墻為netfilter,從CentOS7開始,防火墻為firewalld。很多朋友把Linux的防火墻叫作iptables,其實(shí)這樣叫并不太恰當(dāng),iptables僅僅是一個(gè)工具。對(duì)于CentOS 7或者8上的firewalld,阿銘目前在工作中使用得并不多。當(dāng)然,即使是firewalld,同樣也支持之前版本的命令用法,也就是說它是向下兼容的。
關(guān)于這一節(jié)的內(nèi)容,阿銘是這樣安排的。首先要大概講一下之前版本iptables的常用用法,然后再介紹一下firewalld的一些用法。下面阿銘先教你如何把firewalld關(guān)閉,然后開啟之前版本的iptables。示例命令如下:
?
#?systemctl?stop?firewalld? #關(guān)閉firewalld服務(wù) #?systemctl?disable?firewalld? #禁止firewalld服務(wù)開機(jī)啟動(dòng),后面將會(huì)詳細(xì)講解 Removed?symlink?/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. Removed?symlink?/etc/systemd/system/basic.target.wants/firewalld.service.? #?yum?install?-y?iptables-services? #安裝iptables-services,這樣就可以使用之前版本的iptables了 #?systemctl?enable?iptables?#讓它開機(jī)啟動(dòng) Created?symlink?from?/etc/systemd/system/basic.target.wants/iptables.service?to /usr/lib/systemd/system/iptables.service. #?systemctl?start?iptables? #啟動(dòng)iptables服務(wù)
?
到此,咱們就可以使用之前版本的iptables了。CentOS上默認(rèn)設(shè)有iptables規(guī)則,這個(gè)規(guī)則雖然很安全,但對(duì)于我們來說沒有用,反而會(huì)造成某些影響,所以阿銘建議你先清除規(guī)則,然后把清除后的規(guī)則保存一下。示例命令如下:
?
# iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 21??1620?ACCEPT?????all?--??*??????*??????0.0.0.0/0???????????0.0.0.0/0????????????state?RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0?????0?ACCEPT?????tcp?--??*??????*??????0.0.0.0/0???????????0.0.0.0/0????????????state?NEW?tcp?dpt:22 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0?????0?REJECT?????all?--??*??????*??????0.0.0.0/0???????????0.0.0.0/0????????????reject-with?icmp-host-prohibited Chain OUTPUT (policy ACCEPT 16 packets, 1536 bytes) pkts bytes target prot opt in out source destination # iptables –F # service iptables save iptables:?Saving?firewall?rules?to?/etc/sysconfig/iptables:[?OK??]
?
上例中,-nvL選項(xiàng)表示查看規(guī)則,-F選項(xiàng)表示清除當(dāng)前規(guī)則,但清除只是臨時(shí)的,重啟系統(tǒng)或者重啟iptalbes服務(wù)后還會(huì)加載已經(jīng)保存的規(guī)則,所以需要使用serviceiptables save保存一下規(guī)則。通過上面的命令輸出,我們也可以看到,防火墻規(guī)則保存在/etc/sysconfig/iptables中,你可以查看一下這個(gè)文件。
1. netfilter的5個(gè)表
filter表主要用于過濾包,是系統(tǒng)預(yù)設(shè)的表,這個(gè)表也是阿銘用得最多的表。該表內(nèi)建3個(gè)鏈:INPUT、OUTPUT以及FORWARD。INPUT鏈作用于進(jìn)入本機(jī)的包,OUTPUT鏈作用于本機(jī)送出的包,F(xiàn)ORWARD鏈作用于那些跟本機(jī)無關(guān)的包。
nat表主要用于網(wǎng)絡(luò)地址轉(zhuǎn)換,它也有3個(gè)鏈。PREROUTING鏈的作用是在包剛剛到達(dá)防火墻時(shí)改變它的目的地址(如果需要的話),OUTPUT鏈的作用是改變本地產(chǎn)生的包的目的地址,POSTROUTING鏈的作用是在包即將離開防火墻時(shí)改變其源地址。該表阿銘僅偶爾會(huì)用到。
mangle表主要用于給數(shù)據(jù)包做標(biāo)記,然后根據(jù)標(biāo)記去操作相應(yīng)的包。這個(gè)表幾乎不怎么用,除非你想成為一個(gè)高級(jí)網(wǎng)絡(luò)工程師,否則就不需要太關(guān)注。
raw表可以實(shí)現(xiàn)不追蹤某些數(shù)據(jù)包,默認(rèn)系統(tǒng)的數(shù)據(jù)包都會(huì)被追蹤,但追蹤勢(shì)必消耗一定的資源,所以可以用raw表來指定某些端口的包不被追蹤。這個(gè)表,阿銘從來沒用過。
security表在CentOS 6中是沒有的,它用于強(qiáng)制訪問控制(MAC)的網(wǎng)絡(luò)規(guī)則??梢哉f這個(gè)表阿銘都沒有深入研究過,更別說使用了。所以,你暫時(shí)不用理會(huì)它。
2. netfilter的5個(gè)鏈
5個(gè)鏈分別為PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
PREROUTING:數(shù)據(jù)包進(jìn)入路由表之前。
INPUT:通過路由表后目的地為本機(jī)。
FORWARDING:通過路由表后,目的地不為本機(jī)。
OUTPUT:由本機(jī)產(chǎn)生,向外轉(zhuǎn)發(fā)。
POSTROUTIONG:發(fā)送到網(wǎng)卡接口之前。
具體的數(shù)據(jù)包流向,可以參考下面圖:
表和鏈對(duì)應(yīng)的關(guān)系圖如下:
3. iptables基本語法
iptables是一個(gè)非常復(fù)雜和功能豐富的工具,所以它的語法也是很有特點(diǎn)的。下面阿銘就給大家介紹幾種常用的語法。
(1) 查看規(guī)則以及清除規(guī)則,其用法如下:
# iptables -t nat -nvL
?
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 4 packets, 384 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 384 bytes) pkts bytes target prot opt in out source destination
?
-t選項(xiàng)后面跟表名,-nvL表示查看該表的規(guī)則,其中-n表示不針對(duì)IP反解析主機(jī)名,-L表示列出,-v表示列出的信息更加詳細(xì)。如果不加-t選項(xiàng),則打印filter表的相關(guān)信息,如下所示:
?
# iptables -nvL Chain INPUT (policy ACCEPT 252 packets, 19329 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 222 packets, 24340 bytes) pkts bytes target prot opt in out source destination
?
上例和-tfilter打印的信息是一樣的。關(guān)于清除規(guī)則的命令中,阿銘用得最多就是下面兩個(gè):
?
# iptables -F # iptables -Z
?
這里-F表示把所有規(guī)則全部刪除,如果不加-t指定表,默認(rèn)只清除filter表的規(guī)則。-Z表示把包以及流量計(jì)數(shù)器置零(這個(gè)阿銘認(rèn)為很有用)。
(2) 增加/刪除一條規(guī)則,其用法如下:
?
#?iptables?-A?INPUT?-s?192.168.72.1?-p?tcp?--sport?1234?-d?192.168.72.128?--dport?80?-j?DROP
?
這里沒有加-t選項(xiàng),所以針對(duì)的是filter表。這條規(guī)則中各個(gè)選項(xiàng)的作用如下。
?-A/-D:表示增加/刪除一條規(guī)則。
-I:表示插入一條規(guī)則,其實(shí)效果跟-A一樣。
-p:表示指定協(xié)議,可以是tcp、udp或者icmp。
--dport:跟-p一起使用,表示指定目標(biāo)端口。
--sport:跟-p一起使用,表示指定源端口。
-s:表示指定源IP(可以是一個(gè)IP段)。
-d:表示指定目的IP(可以是一個(gè)IP段)。
-j:后面跟動(dòng)作,其中ACCEPT表示允許包,DROP表示丟掉包,REJECT表示拒絕包。
-i:表示指定網(wǎng)卡(不常用,但偶爾能用到)。
下面阿銘再多舉幾個(gè)例子來幫你理解這些概念:
?
#?iptables?-I?INPUT?-s1.1.1.1?-j?DROP
?
上例表示插入一條規(guī)則,把來自1.1.1.1的所有數(shù)據(jù)包丟掉。下例表示刪除剛剛插入的規(guī)則:
?
#?iptables?-D?INPUT?-s1.1.1.1?-j?DROP
?
注意刪除一條規(guī)則時(shí),必須和插入的規(guī)則一致。也就是說,兩條iptables命令,除了-I和-D不一樣外,其他地方都一樣。
下例表示把來自2.2.2.2并且是TCP協(xié)議到本機(jī)80端口的數(shù)據(jù)包丟掉:
?
#?iptables?-I?INPUT?-s2.2.2.2?-p?tcp?--dport?80?-j?DROP
?
注意,--dport/--sport必須和-p選項(xiàng)一起使用,否則會(huì)出錯(cuò)。
下例表示把發(fā)送到10.0.1.14的22端口的數(shù)據(jù)包丟掉:
?
#?iptables?-I?OUTPUT?-p?tcp?--dport?22?-d10.0.1.14?-j?DROP
?
下例表示把來自192.168.1.0/24這個(gè)網(wǎng)段且作用在ens33上的包放行:
?
#?iptables?-A?INPUT?-s?192.168.1.0/24?-i?ens33?-j?ACCEPT #?iptables?-nvL?|grep?'192.168.1.0/24' 0 0 ACCEPT all -- ens33 * 192.168.1.0/24 0.0.0.0/0
?
有時(shí)候服務(wù)器上的iptables過多了,你想刪除某一條規(guī)則,但又不容易掌握創(chuàng)建時(shí)的規(guī)則。其實(shí)有一種比較簡(jiǎn)單的方法,先查看iptables規(guī)則,示例命令如下:
?
#?iptables?-nvL?--line-numbers Chain INPUT (policy ACCEPT 309 packets, 23689 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- ens33 * 192.168.1.0/24 0.0.0.0/0
?
然后刪除某一條規(guī)則,使用如下命令:
?
# iptables -D INPUT 1
?
這里-D后面依次跟鏈名、規(guī)則num。這個(gè)num就是查看iptables規(guī)則時(shí)第1列的值。隨后查看剛才的規(guī)則時(shí)已經(jīng)沒有了,如下所示:
?
#?iptables?-nvL?--line-numbers
?
iptables還有一個(gè)選項(xiàng)經(jīng)常用到,即-P(大寫)選項(xiàng),它表示預(yù)設(shè)策略。其用法如下:
?
#?iptables?-P?INPUT?DROP
?
-P后面跟鏈名,策略內(nèi)容或?yàn)镈ROP,或?yàn)锳CCEPT,默認(rèn)是ACCEPT。注意:如果你在連接遠(yuǎn)程服務(wù)器,千萬不要隨便執(zhí)行這個(gè)命令,因?yàn)橐坏┹斎朊畈⒒剀?,遠(yuǎn)程連接就會(huì)被斷開。
這個(gè)策略一旦設(shè)定后,只有使用命令iptables-P INPUT ACCEPT才能恢復(fù)成原始狀態(tài)。下面阿銘針對(duì)一個(gè)小需求介紹一下如何設(shè)定iptables規(guī)則。
需求:只針對(duì)filter表,預(yù)設(shè)策略INPUT鏈DROP,其他兩個(gè)鏈ACCEPT,然后針對(duì)192.168.72.0/24開通22端口,對(duì)所有網(wǎng)段開放80端口,對(duì)所有網(wǎng)段開放21端口。
這個(gè)需求不算復(fù)雜,但是因?yàn)橛卸鄺l規(guī)則,所以最好寫成腳本的形式。腳本內(nèi)容如下:
?
#?vi?/usr/local/sbin/iptables.sh? #寫入如下內(nèi)容 #! /bin/bash ipt="/usr/sbin/iptables" $ipt -F $ipt?-P?INPUT?DROP $ipt?-P?OUTPUT?ACCEPT $ipt?-P?FORWARD? ACCEPT $ipt?-A?INPUT?-s?192.168.72.0/24?-p?tcp?--dport?22?-j?ACCEPT $ipt?-A?INPUT?-p?tcp?--dport?80?-j?ACCEPT $ipt?-A?INPUT?-p?tcp?--dport?21?-j?ACCEPT
?
完成腳本的編寫后,直接運(yùn)行/bin/bash /usr/local/sbin/iptables.sh即可。如果想開機(jī)啟動(dòng)時(shí)初始化防火墻規(guī)則,則需要在/etc/rc.d/rc.local中添加一行/bin/bash/usr/local/sbin/iptables.sh。執(zhí)行過程如下:
?
#?sh?/usr/local/sbin/iptables.sh # iptables -nvL Chain?INPUT?(policy?DROP?0?packets,?0?bytes) pkts bytes target prot opt in out source destination 20 1580 ACCEPT tcp -- * * 192.168.72.0/24 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
?
運(yùn)行腳本后,查看規(guī)則就是這樣的,這里可以看到阿銘的第一條規(guī)則中已經(jīng)有20個(gè)包(第一列)被放行過了。
關(guān)于icmp的包有一個(gè)比較常見的應(yīng)用,如下所示:
?
#?iptables?-I?INPUT?-p?icmp?--icmp-type?8?-j?DROP
?
這里--icmp-type選項(xiàng)要跟-picmp一起使用,后面指定類型編號(hào)。這個(gè)8指的是能在本機(jī)ping通其他機(jī)器,而其他機(jī)器不能ping通本機(jī),請(qǐng)牢記。
4. nat表的應(yīng)用
其實(shí),Linux的iptables功能是十分強(qiáng)大的。阿銘的一位老師曾經(jīng)這樣形容Linux的網(wǎng)絡(luò)功能:只有想不到,沒有做不到!也就是說,只要你能夠想到的關(guān)于網(wǎng)絡(luò)的應(yīng)用,Linux都能幫你實(shí)現(xiàn)。你在日常生活中應(yīng)該接觸過路由器,它的功能就是分享上網(wǎng)。本來一根網(wǎng)線過來(其實(shí)只有一個(gè)公網(wǎng)IP),通過路由器后,路由器分配一個(gè)網(wǎng)段(私網(wǎng)IP),這樣連接路由器的多臺(tái)PC都能連接因特網(wǎng),而遠(yuǎn)端的設(shè)備認(rèn)為你的IP就是那個(gè)連接路由器的公網(wǎng)IP。這個(gè)路由器的功能其實(shí)就是由Linux的iptables實(shí)現(xiàn)的,而iptables又是通過nat表作用而實(shí)現(xiàn)的。
在這里,阿銘舉一個(gè)例子來說明iptables是如何實(shí)現(xiàn)這個(gè)功能的。假設(shè)你的機(jī)器上有兩塊網(wǎng)卡eth0和eth1,其中eth0的IP為10.0.2.68,eth1的IP為192.168.1.1。eth0連接了因特網(wǎng),但eth1沒有連接?,F(xiàn)在有另一臺(tái)機(jī)器(192.168.1.2)和eth1是互通的,那么如何設(shè)置才能讓連接eth1的這臺(tái)機(jī)器連接因特網(wǎng),和10.0.2.68互通呢?方法很簡(jiǎn)單,如下所示:
?
#?echo??"1"?>?/proc/sys/net/ipv4/ip_forward #?iptables?-t?nat?-A?POSTROUTING?-s?192.168.1.0/24?-o?eth0?-j?MASQUERADE
?
這里,第一個(gè)命令涉及內(nèi)核參數(shù)相關(guān)的配置文件,它的目的是打開路由轉(zhuǎn)發(fā)功能,否則無法實(shí)現(xiàn)我們的應(yīng)用。第二個(gè)命令則是iptables對(duì)nat表做了一個(gè)IP轉(zhuǎn)發(fā)的操作。-o選項(xiàng)后面跟設(shè)備名,表示出口的網(wǎng)卡;MASQUERADE表示偽裝。關(guān)于nat表,阿銘不想多講,你只要學(xué)會(huì)這個(gè)路由轉(zhuǎn)發(fā)功能即可,其他的東西交給網(wǎng)絡(luò)工程師去學(xué)習(xí)吧,畢竟你將來是要做Linux系統(tǒng)工程師的。
5. 保存和備份iptables規(guī)則
前面阿銘提到過,咱們?cè)O(shè)定的防火墻規(guī)則只保存在內(nèi)存中,并沒有保存到某一個(gè)文件中。也就是說,當(dāng)系統(tǒng)重啟后以前設(shè)定的規(guī)則就沒有了,所以設(shè)定好規(guī)則后要先保存一下。命令如下:
?
#?service?iptables?save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ ok ]
?
它會(huì)提示你防火墻規(guī)則保存在/etc/sysconfig/iptables文件內(nèi),這個(gè)文件就是iptables的配置文件。所以日后如果你遇到備份防火墻規(guī)則的任務(wù),只要復(fù)制一份這個(gè)文件的副本即可。
有時(shí)我們需要清除防火墻的所有規(guī)則,使用命令iptables-F固然可以,但最好的辦法還是停止防火墻服務(wù),如下所示:
?
#?service?iptables?stop Redirecting?to?/bin/systemctl?stop?iptables.service
?
這樣防火墻就失效了,但是一旦重新設(shè)定規(guī)則(哪怕只有一條),防火墻服務(wù)會(huì)自動(dòng)開啟。下面阿銘介紹一個(gè)用來備份防火墻規(guī)則的命令,如下所示:
?
#?sh?/usr/local/sbin/iptables.sh #?iptables-save?>?myipt.rule # cat myipt.rule # Generated by xtables-save v1.8.2 on Fri Jun 26 15:27:41 2020 *security :INPUT?ACCEPT?[809:137209] :FORWARD?ACCEPT?[0:0] :OUTPUT?ACCEPT?[682:88704] COMMIT #?Completed?on?Fri?Jun?26?1541?2020 #?Generated?by?xtables-save?v1.8.2?on?Fri?Jun?26?1541?2020 *raw :PREROUTING?ACCEPT?[133:10536] :OUTPUT?ACCEPT?[111:20700] COMMIT #?Completed?on?Fri?Jun?26?1541?2020 #?Generated?by?xtables-save?v1.8.2?on?Fri?Jun?26?1541?2020 *mangle :PREROUTING?ACCEPT?[133:10536] :INPUT?ACCEPT?[133:10536] :FORWARD?ACCEPT?[0:0] :OUTPUT?ACCEPT?[111:20700] :POSTROUTING?ACCEPT?[111:20700] COMMIT #?Completed?on?Fri?Jun?26?1541?2020 #?Generated?by?xtables-save?v1.8.2?on?Fri?Jun?26?1541?2020 *nat :PREROUTING?ACCEPT?[0:0] :INPUT?ACCEPT?[0:0] :POSTROUTING?ACCEPT?[0:0] :OUTPUT?ACCEPT?[0:0] COMMIT #?Completed?on?Fri?Jun?26?1541?2020 #?Generated?by?xtables-save?v1.8.2?on?Fri?Jun?26?1541?2020 *filter :INPUT?DROP?[108:8568] :FORWARD?ACCEPT?[0:0] :OUTPUT?ACCEPT?[111:20700] -A?INPUT?-s?192.168.72.0/24?-p?tcp?-m?tcp?--dport?22?-j?ACCEPT -A?INPUT?-p?tcp?-m?tcp?--dport?80?-j?ACCEPT -A?INPUT?-p?tcp?-m?tcp?--dport?21?-j?ACCEPT COMMIT #?Completed?on?Fri?Jun?26?1541?2020
?
先執(zhí)行一下剛才的iptables腳本,使用iptables-save命令重定向到一個(gè)文件里。若想要恢復(fù)這些規(guī)則,使用下面的命令即可:
?
#?iptables-restore??
審核編輯:湯梓紅
評(píng)論
查看更多