Linux下的防火墻功能是非常豐富的,但阿銘在日常的運維工作中,使用它的情況并不多。所以阿銘打算把一些常用的知識點介紹給大家。
14.4.1 SELinux
SELinux是Linux系統特有的安全機制。因為這種機制的限制太多,配置也特別煩瑣,所以幾乎沒有人真正應用它。安裝完系統,我們一般都要把SELinux關閉,以免引起不必要的麻煩。臨時關閉SELinux的方法為:
?
# setenforce 0
?
但這僅僅是臨時的,要想永久關閉需要更改配置文件/etc/selinux/config,需要把SELINUX= enforcing改成SELINUX=disabled,更改后的內容如下所示:
?
#?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
?
更改完該配置文件后,重啟系統方可生效??梢允褂胓etenforce命令獲得當前SELinux的狀態,如下所示:
?
# getenforce Disabled
?
阿銘的SELinux早就關閉了,所以會顯示為Disabled,如果還沒有關閉默認會輸出enforcing。當使用setenforce0這個命令后,再執行getenforce命令會輸出permissive。
14.4.2 netfilter
在之前的CentOS版本(比如CentOS6)的防火墻為netfilter,從CentOS7開始,防火墻為firewalld。很多朋友把Linux的防火墻叫作iptables,其實這樣叫并不太恰當,iptables僅僅是一個工具。對于CentOS 7或者8上的firewalld,阿銘目前在工作中使用得并不多。當然,即使是firewalld,同樣也支持之前版本的命令用法,也就是說它是向下兼容的。
關于這一節的內容,阿銘是這樣安排的。首先要大概講一下之前版本iptables的常用用法,然后再介紹一下firewalld的一些用法。下面阿銘先教你如何把firewalld關閉,然后開啟之前版本的iptables。示例命令如下:
?
#?systemctl?stop?firewalld? #關閉firewalld服務 #?systemctl?disable?firewalld? #禁止firewalld服務開機啟動,后面將會詳細講解 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?#讓它開機啟動 Created?symlink?from?/etc/systemd/system/basic.target.wants/iptables.service?to /usr/lib/systemd/system/iptables.service. #?systemctl?start?iptables? #啟動iptables服務
?
到此,咱們就可以使用之前版本的iptables了。CentOS上默認設有iptables規則,這個規則雖然很安全,但對于我們來說沒有用,反而會造成某些影響,所以阿銘建議你先清除規則,然后把清除后的規則保存一下。示例命令如下:
?
# 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選項表示查看規則,-F選項表示清除當前規則,但清除只是臨時的,重啟系統或者重啟iptalbes服務后還會加載已經保存的規則,所以需要使用serviceiptables save保存一下規則。通過上面的命令輸出,我們也可以看到,防火墻規則保存在/etc/sysconfig/iptables中,你可以查看一下這個文件。
1. netfilter的5個表
filter表主要用于過濾包,是系統預設的表,這個表也是阿銘用得最多的表。該表內建3個鏈:INPUT、OUTPUT以及FORWARD。INPUT鏈作用于進入本機的包,OUTPUT鏈作用于本機送出的包,FORWARD鏈作用于那些跟本機無關的包。
nat表主要用于網絡地址轉換,它也有3個鏈。PREROUTING鏈的作用是在包剛剛到達防火墻時改變它的目的地址(如果需要的話),OUTPUT鏈的作用是改變本地產生的包的目的地址,POSTROUTING鏈的作用是在包即將離開防火墻時改變其源地址。該表阿銘僅偶爾會用到。
mangle表主要用于給數據包做標記,然后根據標記去操作相應的包。這個表幾乎不怎么用,除非你想成為一個高級網絡工程師,否則就不需要太關注。
raw表可以實現不追蹤某些數據包,默認系統的數據包都會被追蹤,但追蹤勢必消耗一定的資源,所以可以用raw表來指定某些端口的包不被追蹤。這個表,阿銘從來沒用過。
security表在CentOS 6中是沒有的,它用于強制訪問控制(MAC)的網絡規則??梢哉f這個表阿銘都沒有深入研究過,更別說使用了。所以,你暫時不用理會它。
2. netfilter的5個鏈
5個鏈分別為PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
PREROUTING:數據包進入路由表之前。
INPUT:通過路由表后目的地為本機。
FORWARDING:通過路由表后,目的地不為本機。
OUTPUT:由本機產生,向外轉發。
POSTROUTIONG:發送到網卡接口之前。
具體的數據包流向,可以參考下面圖:
表和鏈對應的關系圖如下:
3. iptables基本語法
iptables是一個非常復雜和功能豐富的工具,所以它的語法也是很有特點的。下面阿銘就給大家介紹幾種常用的語法。
(1) 查看規則以及清除規則,其用法如下:
# 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選項后面跟表名,-nvL表示查看該表的規則,其中-n表示不針對IP反解析主機名,-L表示列出,-v表示列出的信息更加詳細。如果不加-t選項,則打印filter表的相關信息,如下所示:
?
# 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打印的信息是一樣的。關于清除規則的命令中,阿銘用得最多就是下面兩個:
?
# iptables -F # iptables -Z
?
這里-F表示把所有規則全部刪除,如果不加-t指定表,默認只清除filter表的規則。-Z表示把包以及流量計數器置零(這個阿銘認為很有用)。
(2) 增加/刪除一條規則,其用法如下:
?
#?iptables?-A?INPUT?-s?192.168.72.1?-p?tcp?--sport?1234?-d?192.168.72.128?--dport?80?-j?DROP
?
這里沒有加-t選項,所以針對的是filter表。這條規則中各個選項的作用如下。
?-A/-D:表示增加/刪除一條規則。
-I:表示插入一條規則,其實效果跟-A一樣。
-p:表示指定協議,可以是tcp、udp或者icmp。
--dport:跟-p一起使用,表示指定目標端口。
--sport:跟-p一起使用,表示指定源端口。
-s:表示指定源IP(可以是一個IP段)。
-d:表示指定目的IP(可以是一個IP段)。
-j:后面跟動作,其中ACCEPT表示允許包,DROP表示丟掉包,REJECT表示拒絕包。
-i:表示指定網卡(不常用,但偶爾能用到)。
下面阿銘再多舉幾個例子來幫你理解這些概念:
?
#?iptables?-I?INPUT?-s1.1.1.1?-j?DROP
?
上例表示插入一條規則,把來自1.1.1.1的所有數據包丟掉。下例表示刪除剛剛插入的規則:
?
#?iptables?-D?INPUT?-s1.1.1.1?-j?DROP
?
注意刪除一條規則時,必須和插入的規則一致。也就是說,兩條iptables命令,除了-I和-D不一樣外,其他地方都一樣。
下例表示把來自2.2.2.2并且是TCP協議到本機80端口的數據包丟掉:
?
#?iptables?-I?INPUT?-s2.2.2.2?-p?tcp?--dport?80?-j?DROP
?
注意,--dport/--sport必須和-p選項一起使用,否則會出錯。
下例表示把發送到10.0.1.14的22端口的數據包丟掉:
?
#?iptables?-I?OUTPUT?-p?tcp?--dport?22?-d10.0.1.14?-j?DROP
?
下例表示把來自192.168.1.0/24這個網段且作用在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
?
有時候服務器上的iptables過多了,你想刪除某一條規則,但又不容易掌握創建時的規則。其實有一種比較簡單的方法,先查看iptables規則,示例命令如下:
?
#?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
?
然后刪除某一條規則,使用如下命令:
?
# iptables -D INPUT 1
?
這里-D后面依次跟鏈名、規則num。這個num就是查看iptables規則時第1列的值。隨后查看剛才的規則時已經沒有了,如下所示:
?
#?iptables?-nvL?--line-numbers
?
iptables還有一個選項經常用到,即-P(大寫)選項,它表示預設策略。其用法如下:
?
#?iptables?-P?INPUT?DROP
?
-P后面跟鏈名,策略內容或為DROP,或為ACCEPT,默認是ACCEPT。注意:如果你在連接遠程服務器,千萬不要隨便執行這個命令,因為一旦輸入命令并回車,遠程連接就會被斷開。
這個策略一旦設定后,只有使用命令iptables-P INPUT ACCEPT才能恢復成原始狀態。下面阿銘針對一個小需求介紹一下如何設定iptables規則。
需求:只針對filter表,預設策略INPUT鏈DROP,其他兩個鏈ACCEPT,然后針對192.168.72.0/24開通22端口,對所有網段開放80端口,對所有網段開放21端口。
這個需求不算復雜,但是因為有多條規則,所以最好寫成腳本的形式。腳本內容如下:
?
#?vi?/usr/local/sbin/iptables.sh? #寫入如下內容 #! /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
?
完成腳本的編寫后,直接運行/bin/bash /usr/local/sbin/iptables.sh即可。如果想開機啟動時初始化防火墻規則,則需要在/etc/rc.d/rc.local中添加一行/bin/bash/usr/local/sbin/iptables.sh。執行過程如下:
?
#?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
?
運行腳本后,查看規則就是這樣的,這里可以看到阿銘的第一條規則中已經有20個包(第一列)被放行過了。
關于icmp的包有一個比較常見的應用,如下所示:
?
#?iptables?-I?INPUT?-p?icmp?--icmp-type?8?-j?DROP
?
這里--icmp-type選項要跟-picmp一起使用,后面指定類型編號。這個8指的是能在本機ping通其他機器,而其他機器不能ping通本機,請牢記。
4. nat表的應用
其實,Linux的iptables功能是十分強大的。阿銘的一位老師曾經這樣形容Linux的網絡功能:只有想不到,沒有做不到!也就是說,只要你能夠想到的關于網絡的應用,Linux都能幫你實現。你在日常生活中應該接觸過路由器,它的功能就是分享上網。本來一根網線過來(其實只有一個公網IP),通過路由器后,路由器分配一個網段(私網IP),這樣連接路由器的多臺PC都能連接因特網,而遠端的設備認為你的IP就是那個連接路由器的公網IP。這個路由器的功能其實就是由Linux的iptables實現的,而iptables又是通過nat表作用而實現的。
在這里,阿銘舉一個例子來說明iptables是如何實現這個功能的。假設你的機器上有兩塊網卡eth0和eth1,其中eth0的IP為10.0.2.68,eth1的IP為192.168.1.1。eth0連接了因特網,但eth1沒有連接?,F在有另一臺機器(192.168.1.2)和eth1是互通的,那么如何設置才能讓連接eth1的這臺機器連接因特網,和10.0.2.68互通呢?方法很簡單,如下所示:
?
#?echo??"1"?>?/proc/sys/net/ipv4/ip_forward #?iptables?-t?nat?-A?POSTROUTING?-s?192.168.1.0/24?-o?eth0?-j?MASQUERADE
?
這里,第一個命令涉及內核參數相關的配置文件,它的目的是打開路由轉發功能,否則無法實現我們的應用。第二個命令則是iptables對nat表做了一個IP轉發的操作。-o選項后面跟設備名,表示出口的網卡;MASQUERADE表示偽裝。關于nat表,阿銘不想多講,你只要學會這個路由轉發功能即可,其他的東西交給網絡工程師去學習吧,畢竟你將來是要做Linux系統工程師的。
5. 保存和備份iptables規則
前面阿銘提到過,咱們設定的防火墻規則只保存在內存中,并沒有保存到某一個文件中。也就是說,當系統重啟后以前設定的規則就沒有了,所以設定好規則后要先保存一下。命令如下:
?
#?service?iptables?save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ ok ]
?
它會提示你防火墻規則保存在/etc/sysconfig/iptables文件內,這個文件就是iptables的配置文件。所以日后如果你遇到備份防火墻規則的任務,只要復制一份這個文件的副本即可。
有時我們需要清除防火墻的所有規則,使用命令iptables-F固然可以,但最好的辦法還是停止防火墻服務,如下所示:
?
#?service?iptables?stop Redirecting?to?/bin/systemctl?stop?iptables.service
?
這樣防火墻就失效了,但是一旦重新設定規則(哪怕只有一條),防火墻服務會自動開啟。下面阿銘介紹一個用來備份防火墻規則的命令,如下所示:
?
#?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
?
先執行一下剛才的iptables腳本,使用iptables-save命令重定向到一個文件里。若想要恢復這些規則,使用下面的命令即可:
?
#?iptables-restore??
審核編輯:湯梓紅
評論
查看更多