網(wǎng)絡(luò)安全策略如何實現(xiàn)?
前言
上一篇記錄了內(nèi)容分發(fā)網(wǎng)絡(luò)CDN
今天來記錄一下日常能接觸到的iptables
在部署一臺服務(wù)器的時候,我們總是希望只是開放特定的端口,其它端口都不提供訪問
此時,只要通過安全措施守護好這個唯一的入口就可以了
采用的方式是ACL(Access Control List 訪問控制列表) 來控制IP和端口
設(shè)置好這些規(guī)則,只有指定的IP段能訪問指定的開放接口,這些規(guī)則的集合稱為安全組
iptables
當一個網(wǎng)絡(luò)包進入一臺機器的時候,會做什么事情?
首先取下MAC查看是否是本機的,如果是,則取下IP頭
得到目標IP后,就開始進行路由判斷,這個節(jié)點稱為PREROUTING
如果發(fā)現(xiàn)IP是本機的,就發(fā)給傳輸層,這個節(jié)點叫做INPUT
如果IP不是本機的,就需要轉(zhuǎn)發(fā)出去,稱為FORWARD
上層處理完后,會將處理結(jié)果發(fā)出去,稱為OUTPUT
無論是FORWARD還是OUTPUT,都是路由判斷之后發(fā)生的,最后一個節(jié)點是POSTROUTING

五個節(jié)點重點節(jié)點
在 Linux 內(nèi)核中,有一個框架叫 Netfilter。它可以在這些節(jié)點插入 hook 函數(shù)。
這些函數(shù)可以截獲數(shù)據(jù)包,對數(shù)據(jù)包進行干預(yù)。
例如做一定的修改,然后決策是否接著交給 TCP/IP 協(xié)議棧處理;或者可以交回給協(xié)議棧,那就是 ACCEPT;或者過濾掉,不再傳輸,就是 DROP;還有就是 QUEUE,發(fā)送給某個用戶態(tài)進程處理。
一個著名的實現(xiàn),就是內(nèi)核模塊 ip_tables。
它在這五個節(jié)點上埋下函數(shù),從而可以根據(jù)規(guī)則進行包的處理。
按功能可分為四大類:
連接跟蹤(conntrack) 數(shù)據(jù)包的過濾(filter) 網(wǎng)絡(luò)地址轉(zhuǎn)換(nat) 數(shù)據(jù)包的修改(mangle)
其中連接跟蹤是基礎(chǔ)功能,被其他功能所依賴。其他三個可以實現(xiàn)包的過濾、修改和網(wǎng)絡(luò)地址轉(zhuǎn)換。
在用戶態(tài),還有一個客戶端程序 iptables,用命令行來干預(yù)內(nèi)核的規(guī)則。內(nèi)核的功能對應(yīng) iptables 的命令行來講,就是表和鏈的概念。

iptables 的表分為四種:raw–>mangle–>nat–>filter。這四個優(yōu)先級依次降低,raw 不常用,所以主要功能都在其他三種表里實現(xiàn)。每個表可以設(shè)置多個鏈。
filter 表處理過濾功能,主要包含三個鏈:
INPUT 鏈:過濾所有目標地址是本機的數(shù)據(jù)包; FORWARD 鏈:過濾所有路過本機的數(shù)據(jù)包; OUTPUT 鏈:過濾所有由本機產(chǎn)生的數(shù)據(jù)包。
nat 表主要是處理網(wǎng)絡(luò)地址轉(zhuǎn)換,可以進行 Snat(改變數(shù)據(jù)包的源地址)、Dnat(改變數(shù)據(jù)包的目標地址),包含三個鏈:
PREROUTING 鏈:可以在數(shù)據(jù)包到達防火墻時改變目標地址; OUTPUT 鏈:可以改變本地產(chǎn)生的數(shù)據(jù)包的目標地址; POSTROUTING 鏈:在數(shù)據(jù)包離開防火墻時改變數(shù)據(jù)包的源地址。
mangle 表主要是修改數(shù)據(jù)包,包含:
PREROUTING 鏈; INPUT 鏈; FORWARD 鏈; OUTPUT 鏈; POSTROUTING 鏈。

數(shù)據(jù)包進入的時候,先進 mangle 表的 PREROUTING 鏈。在這里可以根據(jù)需要,改變數(shù)據(jù)包頭內(nèi)容之后,進入 nat 表的 PREROUTING 鏈,在這里可以根據(jù)需要做 Dnat,也就是目標地址轉(zhuǎn)換。 進入路由判斷,要判斷是進入本地的還是轉(zhuǎn)發(fā)的。 如果是進入本地的,就進入 INPUT 鏈,之后按條件過濾限制進入。 之后進入本機,再進入 OUTPUT 鏈,按條件過濾限制出去,離開本地。 如果是轉(zhuǎn)發(fā)就進入 FORWARD 鏈,根據(jù)條件過濾限制轉(zhuǎn)發(fā)。 之后進入 POSTROUTING 鏈,這里可以做 Snat,離開網(wǎng)絡(luò)接口。
有了 iptables 命令,我們就可以在云中實現(xiàn)一定的安全策略。例如可以處理前面的偷窺事件。首先我們將所有的門都關(guān)閉。
iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -j DROP
-s 表示源 IP 地址段,-d 表示目標地址段,DROP 表示丟棄,也即無論從哪里來的,要想訪問這臺機器,全部拒絕,誰也黑不進來。
但是會發(fā)現(xiàn)出問題,ssh 也進不來了,都不能遠程運維了,可以打開一下。
iptables -I INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -p tcp --dport 22 -j ACCEPT
在云平臺上,一般允許一個或者多個虛擬機屬于某個安全組,而屬于不同安全組的虛擬機之間的訪問以及外網(wǎng)訪問虛擬機,都需要通過安全組進行過濾

