DAY20 linux netfilter - daniel-qa/Network GitHub Wiki

DAY20

今天要來介紹 linux 系統當中的 netfilter, 它在CentOS 7 之前都是預設的防火牆套件,在CentOS7之後就改由Firewalld 進行防護。 當然CentoS7 當中仍可將iptables裝回來,我們先不談及Firewalld的部分, 因為 netfilter的功能非常多,功用不僅限於防火牆而已它甚至可以做NAT功能,甚至更多許多網路的服務(例如設備上接雙WAN的設定它都可以做到), 在CentOS6上除了netfilter之外,還有一個防禦機制,它叫做 SElinux (安全強化的linux)

它是由美國國安局開放出來放置於其中,它專門針對程序、權限設定做限制, 所以我們在系統上運作的服務,大多要取用系統資源時都得通過這一個關卡, 它的設定方式是透過布林去進行的。 平常在測試機上面運作服務時,我捫會將SElinux關閉在進行, 因為很多時候會因為SElinux的運作造成我捫操作上的不便, 當然到了正式環境時會建議將其打開, 設定的地方在

#vim /etc/sysconfig/selinux //將其中enable 修改成disabled 後再重新開機就不會在啟用了。

若是希望現在就關閉它,可以使用指令

#setenforce 0

要啟用則是將0改成 1 然後再透過指令去確認它現在的運作狀況

#getenforce

關於SElinux操作大概先論述到這裡, 來進入今天的主題netfilter

有在運用 linux 系統的人對它一定不陌生,我捫許多的存取限制,NAT功能大多都是由它達成的。

在CentoOS6 當中要啟用netfilter很簡單,可以將其當作一個服務來操作就好

#service iptables start
#chkconfig iptables on

在CentOS7版,因為服務都被包進systemctl當中,所以都是透過它進行調整。

#systemctl start iptables
#systemctl enable iptables

netfilter 的操作指令是 iptables,它可以在我捫的CLI介面直接直行,程序會馬上被套用。 但我捫大多時候是使用shellscript的方式去進行它, 看你是要寫在iptables的設定當中,或者另外寫一個shell出來讓它開機時載入都可以。 我們這邊拿個簡單的範例來說明iptables的防火牆功能。 第一件事要要記住,防火牆規則這種東西,是 first match, 也就是說當它比對到相對應的規則後就會直接使用這個規則,不會在管後面到底有沒有甚麼限制。

不管裡面有沒有東西,都先把這邊清空掉。 (關於三個表內容可以詳見鳥哥的操作)

#iptables -F -t filter
#iptables -t filter -X
#iptables -F -t mangle
#iptables -t mangle -X
#iptables -F -t nat
#iptables -t nat -X

lo 通常視本機localhost,所以就直接開放,如此在進行自我的時候比較不會有問題

#iptables -t filter -A INPUT -i lo -j ACCEPT
#iptables -t filter -A OUTPUT -o lo -j ACCEPT

在來這邊就可以稍微解說一下,

-i eth0 表示指定對eth0這張網卡進行篩選,也可以不指定範指全部介面。
-s 表示限制來源端,只限制172.16.100.143
-d 就表示目的地,若netfilter運作在一台伺服器身上,通常指的是自己伺服器本機。
但有時候netfilter會被當成中介的存在,這時候-d是誰就要看怎麼運用了。
-p 表示的是協定,有TCP、UDP、ICMP可以使用,若運用在DNS上就會使用udp
-dport 這邊的dport表示是目標端的port,我們可以將它當成要連接到本機端的port號
-j 是說對於以上限制要做甚麼樣的事情,到底是ACCEPT(允許)或者DROP(拋棄)

這邊也有第三個選項REJECT(它也是拋棄的一種,但會跟你說你被我拋棄囉) 這個通常只有在認證考試時用到,沒有人阻擋了別人還跟他說你被我阻擋了吧。 所以下面這個範例就很明白了TCP -22表示的是SSH服務, 只允許192.168.100.250這個IP可以透過SSH服務連結到192.168.100.1的設備。

#iptables -t filter -A INPUT -i eth0 -s 172.16.100.143 -d 172.16.100.144 -p tcp --dport 22 -j ACCEPT

#已連線的封包可以連入

iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#新連線禁止連入

iptables -t filter -A INPUT -m state --state NEW,INVALID -j DROP

這邊就要另外介紹一下 (比較詳細的內容也可以參考鳥哥) 前面這兩個我們會放行的原因,表示說前面我們有放行的的協定,這些是可信任的。 ESTABLISHED:已經連線成功的連線狀態,例如TCP三項交握完成,要開始進行相互資料傳送的封包的階段

RELATED :這個表示連現已經建立,可以開始進行資料的正在進行,但又要創立新的連線資訊。 (這個拿FTP作為例子比較恰當,像是我捫一開始進行FTP連線的時候是用TCP-21,這邊經過連線驗證通過後,可以開始進行指令的傳送,剛好我們要下載資料了,透過TCP-21下達下載的指令,這時候就會開啟新的連線資訊的創建,因為FTP的資料傳送是走TCP-20)

這兩者我們會阻擋的原因是擔心有人惡意進行攻擊,送大量破損的封包來阻礙,或者其他的情形。

INVALID :破損的封包,也就是可能為惡意封包的類型

NEW :初次要建立連線的封包,例如:TCP三項交握,剛開始SYN的封包類型 (也可能是TIMEOUT要重新連線)

然後最後我們要記得做一件事情,就是如果沒有符合上面規則的,我們通常都是直接DROP掉。 這樣才比較安全。

#iptables -t filter -A INPUT -j DROP

這樣就完成了一個簡單的連線限制了,但是這樣是非常陽春的,它還有很多功能可以去用。 例如限制封包進出量,以其他限制等等。

要查看netfilter目前的運作狀況可以下指令

#service iptables status
#iptables -L

當然這些設定檔執行的狀況都都可以存log下來。

netfilter的功能真的很多,光這個套件的運用就可以獨立寫成一本書籍了,

有興趣的人可以深入去看看它的操作。