Centos6.5 iptables配置詳解

1.什麼是iptables

iptable其實是Linux下的數據包過濾軟件,也是目前最新Linux發行版中默認的防火牆。要想深入瞭解iptables機制,瞭解防火牆的規則是必不可少的。由於iptables利用的數據包過濾的機制,所以它會分析數據包的報頭數據。根據報頭數據與定義的規則來決定該數據包是進入主機還是丟棄。 也就是說,根據數據包的分析資料”對比”預先定義的規則內容,若數據包數據與規則內容相同則進行動作,否則就繼續下一條規則的比對。重點在比對與分析順序。

2.iptables的簡單工作原理

舉個簡單的例子,當我們的iptables定義了十條防火牆規則,那麼當Internet來了一個數據包想要進入主機前,會先經過iptables的規則。檢查通過則接受(ACCEPT)進入本機取得資源,如果檢查不通過,則可能予以丟棄(DROP).一定要注意一點,iptables定義的規則是有順序,但某個數據包符合Rule1,則會執行Rule1對應的Action1而並不會理會後面所有的Rule。當所有Rule都不匹配,會執行默認操作。 
iptables的規則是非常重要的,比如當我們有一臺提供WWW的服務的主機,自然我們就要針對port 80端口來啓動通過的數據包規則,但我們發現IP爲192.169.155.155總是存在惡意操作,所以我們要禁止該IP來訪問該服務,最後所有非WWW的數據包全部丟棄,我們來看完成這三個功能的規則順序。

  • Rule1先阻擋192.168.155.155
  • Rule2再讓請求WWW服務的數據包通過
  • Rule3將所有的數據包丟棄

現在我們想一下,如果這三條規則的順序變了之後,我們還能完成剛剛的需求麼?

3.iptables的策略

防火牆策略一般分爲兩種,一種叫“通”策略,一種叫“堵”策略,通策略,默認門是關着的,必須要定義誰能進。堵策略則是,大門是洞開的,但是你必須有身份認證,否則不能進。所以我們要定義,讓進來的進來,讓出去的出去,所以通,是要全通,而堵,則是要選擇。當我們定義的策略的時候,要分別定義多條功能,其中:定義數據包中允許或者不允許的策略,filter過濾的功能,而定義地址轉換的功能的則是nat選項。爲了讓這些功能交替工作,我們制定出了“表”這個定義,來定義、區分各種不同的工作功能和處理方式。

剛剛我們所說的規則僅僅是iptables表格中的一個鏈而已。iptables裏面有多個表格(table),每個表格都定義出自己的默認策略與規則,且每個表格的用途都不相同。

我們現在用的比較多有如下3個:

  • 1.filter(過濾器,默認的table) 定義允許或者不允許的
  • 2.nat(地址轉換) 定義地址轉換的
  • 3.mangle(破壞者)功能:修改報文原數據,加特殊標記。

4.上述表中常見的鏈

與數據包是否進入Linux本機有關的表:Filter

  • INPUT:主要與想要進入Linux主機的數據包有關
  • OUTPUT : 主要與Linux本機所要送出的數據包有關
  • FORWARD : 與Linux本機沒有關係,它可以傳遞數據包到後端的計算機中,與表NAT有關

用來進行來源與目的地的IP或port的轉換(主要於Linux主機後的局域網內的主機有關):NAT

  • PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT) 。
  • POSTROUTING :在進行路由判斷之後所有進行的規則(SNAT/MASQUERADE)。
  • OUTPUT: 與發送出去的數據包有關

與特殊的數據包的路由標誌有關:Mangle 上述5個了鏈都可以做

由於Filter是默認的table,並且如果iptables只是用來保護Linux主機本身的話,只用關注Filter表格內的INPUT和OUTPUT這兩條鏈即可。其餘的兩個table也不常用,因此我們重點學習Filter。

5.iptables中規則的查看

如果在安裝Linux的時候沒有選擇防火牆,那麼iptables在一開始應該是沒有規則的。如果在安裝的時候選擇自動建立防火牆機制,那麼就有默認的防火牆規則。我們來看查看iptables規則的命令。

<code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables [-t table ] [-L] [-nv]
選項與參數:
-t:後面接table。例如 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">filter</span>或者nat。如果不寫默認是<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">filter</span>
-L:列出目前的table規則
-n:不進行IP與HOSTNAME的反查,使用此參數查詢結果會很快
-v:列出更多信息,包括通過該規則的數據包總位數,相關的網絡接口等。
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//我們執行上述命令</span>
hadoop wang # iptables -L -n 
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//針對INPUT鏈,且默認策略爲可接受</span>
Chain INPUT (policy ACCEPT)
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//說明欄</span>
target     prot opt <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">source</span>               destination         
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//針對FORWARD鏈,且默認策略爲可接受</span>
Chain FORWARD (policy ACCEPT)

target     prot opt <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">source</span>               destination         
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//針對OUTPUT鏈,且默認策略爲可接受</span>
Chain OUTPUT (policy ACCEPT)
target     prot opt <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">source</span>               destination    </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

上述每一個chain就是前面提到的每個鏈。Chain那一行括號裏面policy就是默認的策略。下面分析說明欄的五列分別代表的意思:

  • target:代表進行的操作,ACCEPT是放行,而REJECT則是拒絕,此外,尚有DROP(丟棄)的項目.
  • 代表使用的數據包協議,主要有TCP,UDP及ICMP數據包格式。
  • opt:額外的選項說明。
  • source :代表次規則是針對哪個來源IP進行限制
  • destination: 代表次規則是針對哪個目標IP進行限制

5.iptables中規則的清除

<code class="hljs haml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables [ -t tables  ] [ -FXZ ]
-<span class="ruby" style="box-sizing: border-box;"><span class="hljs-constant" style="box-sizing: border-box;">F</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span>清楚所有的已定製的規則
</span>-<span class="ruby" style="box-sizing: border-box;"><span class="hljs-constant" style="box-sizing: border-box;">X</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span>清楚所有用戶<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"自定義"</span>的chain或者tables
</span>-<span class="ruby" style="box-sizing: border-box;"><span class="hljs-constant" style="box-sizing: border-box;">Z</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span>將所有的chain的計數與流量統計都歸零
</span>
清楚防火牆的所有規則:
iptables -F
iptables -X
iptables -Z</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

上述三個命令會將防火牆的規則都清除,但不會改變默認策略(policy)。一般來說,我們重新定義防火牆的時候都會先把規則清除掉。

6.iptables中定義默認策略(policy)

前面提到,當數據包不在我們設置的規則之內時,則該數據包的通過與否,是以Policy的設置爲準。在安全性比較高的主機中,Filter內的INPUT鏈定義的比較嚴格,INPUT的Policy定義爲DROP

iptables定義規則:

格式:iptables [-t table] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP ]

-p : 定義策略(Policy)。注意:P爲大寫 
ACCEPT:數據包可接受 
DROP:數據包被丟棄,client不知道爲何被丟棄。

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables  -P INPUT <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DROP</span>  //<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">INPUT</span>默認設置爲<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DROP</span>
iptables  -P <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">OUTPUT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DROP</span>  //<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">OUTPUT</span>默認設置爲ACCEPT
iptables  -P FORWARD <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DROP</span> // FORWARD默認設置爲ACCEPT  
</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

此時我們執行 iptables-save(不同與iptables -L -n -v的是它會列出完整的防火牆規則)會看到如下信息:

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">*filter
:INPUT <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DROP</span> [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]
:FORWARD ACCEPT [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]
:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">OUTPUT</span> ACCEPT [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">COMMIT</span>
//由於<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">INPUT</span>設置爲<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DROP</span>而又尚未有任何規則,所有顯示如上結果。此時所有數據包均都無法進入</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

現在我們可以設置默認策略後,現在來看看關於各規則的數據包基礎比對設置。

7.數據包的基礎對比:IP,網絡及接口設備

現在我們來添加防火牆規則的數據包對比設置。從最基礎的IP,網絡及端口開始(即是OSI的第三層談起)再來談談設備(網絡卡)的限制等。

iptables定義規則的格式: 
iptables [-AI 鏈名] [-io 網絡接口 ] [ -p 協議 ] [ -s 來源IP/網絡 ] [ -d 目標IP/網絡 ] -j [ACCEPT | DROP|REJECT|LOG]

參數說明: 
-A:新增一條規則,該規則在原規則的最後面。 
-I:插入一條規則,默認該規則在原第一條規則的前面。即該新規則變爲第一條規則。

-io 網絡接口:設置數據包進出的接口規範。 
-i:表示輸入。即數據包進入的網絡接口。與INPUT鏈配合 
-o : 表示輸出。數據包傳出的網絡接口。與OUTPUT鏈配合

-p 協定: 此規則適應於哪種數據包。如tcp,udp,icmp及all.

-s 來源 IP/網絡:設置次規則之前數據包的來源地,可指定單純的IP或網絡,例如: 
IP : 192.168.0.100 
網絡 : 192.168.0.0/24或者192.168.0.0/255.255.255.0 
如果規則爲不允許,則在IP/網絡前加 “!” 即可。 
-s ! x.x.x.x

-d 目標 IP/網絡。與-s類似,只是是目標IP或者網絡而已。

-j:後面接操作。如ACCEPT,DROP ,REJECT或者LOG(記錄)

比如:開放lo這個本機的接口以及某個IP來源

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//設置io成爲受信任的設備,亦即進出lo的數據包都接受</span>
iptables <span class="hljs-attribute" style="box-sizing: border-box;">-t</span> filter <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> lo  <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> REJECT</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

我們可能會有疑惑,爲什麼沒有-s -d等規則,表示不論數據包來自何處或去到哪裏,只要是來自lo這個接口全部接受。

設置來自192.168.100.10的就接受,192.168.100.11的就丟棄。

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-s</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.100</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.10</span> <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> ACCEPT
iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-s</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.100</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.11</span> <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> DROP
iptables <span class="hljs-attribute" style="box-sizing: border-box;">-I</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-s</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.100</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">24</span> <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> ACCEPT</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

此時我們執行iptables-save

<code class="hljs haml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">*filter
:INPUT ACCEPT [12:976]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9:2186]
-<span class="ruby" style="box-sizing: border-box;"><span class="hljs-constant" style="box-sizing: border-box;">A</span> <span class="hljs-constant" style="box-sizing: border-box;">INPUT</span> -s <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100.0</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">24</span> -i eth<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> -j <span class="hljs-constant" style="box-sizing: border-box;">ACCEPT</span>
</span>-<span class="ruby" style="box-sizing: border-box;"><span class="hljs-constant" style="box-sizing: border-box;">A</span> <span class="hljs-constant" style="box-sizing: border-box;">INPUT</span> -s <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100.10</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span> -i eth<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> -j <span class="hljs-constant" style="box-sizing: border-box;">ACCEPT</span>
</span>-<span class="ruby" style="box-sizing: border-box;"><span class="hljs-constant" style="box-sizing: border-box;">A</span> <span class="hljs-constant" style="box-sizing: border-box;">INPUT</span> -s <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100.11</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span> -i eth<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> -j <span class="hljs-constant" style="box-sizing: border-box;">DROP</span>
</span>COMMIT</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

此時我們會有一個疑問,既然我們已經放行了192.168.100.0/24。所以丟棄192.168.100.11的規定根本不會被用到了。那麼我們應該怎麼辦在不改變順序的情況下讓這兩個規則都生效。指定-j 爲LOG。

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-s</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.200</span> <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">LOG</span>

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">LOG</span>        <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">all</span>  <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>    <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.200</span>   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">LOG</span> flags <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> level <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

輸出結果最左邊爲LOG,只要數據包來自192.168.2.200這個IP時,那麼該數據包的相關信息就會被寫入內核日誌文件,即/var/log/messages這個文件當中。然後於下一個規則相比較。

8.TCP,UDP協議的規則對比:針對端口設置

  • 在 -s 參數後面可以增加一個參數 -sport 端口範圍(限制來源端口),如:1024:65535
  • 在-d 參數後面可以增加一個參數 -dport 端口範圍(限制目標端口)

需要特別注意,這兩個參數重點在port上面,並且僅有TCP和UDP數據包具有端口,因此要想使用–dport,–sport時需要加上-p tcp或者 -p udp纔會成功。

下面做幾個小測試:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//丟棄所有想要鏈接本機21端口的數據包</span>
iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>dport <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">21</span> <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> DROP
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//想要鏈接到本機的網上鄰居(UDP port 137,138 tcp 139,445)就放行</span>
iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-p</span> udp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>dport <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">137</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">138</span> <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> ACCEPT
iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>dport <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">139</span> <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> ACCEPT
iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>dport <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">445</span> <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> ACCEPT
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//只要來自192.168.1.0/24的1024:65535端口的數據包,且想要連接的本機的ssh port就阻擋</span>
iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-p</span> tcp <span class="hljs-attribute" style="box-sizing: border-box;">-s</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.1</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">24</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>sport <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1024</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">65535</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>dport ssh <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> DROP

iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>dport <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">21</span> <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> DROP</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

除了制訂端口號之外,TCP數據包還有特殊的標識,比如主動鏈接的SYN標誌。iptables支持使用–syn來處理。

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables <span class="hljs-attribute" style="box-sizing: border-box;">-A</span> INPUT <span class="hljs-attribute" style="box-sizing: border-box;">-i</span> eth0 <span class="hljs-attribute" style="box-sizing: border-box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>sport <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1023</span> <span class="hljs-attribute" style="box-sizing: border-box;">-dport</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1023</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>syn <span class="hljs-attribute" style="box-sizing: border-box;">-j</span> DROP</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

9.iptables的開啓與關閉

查看運行狀態:

<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#/etc/init.d/iptables status</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

關閉防火牆服務:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">/etc/init.d/iptables stop
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//此方法在主機下次重新啓動還是會開啓</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

直接禁用防火牆:

<code class="hljs cmake has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">chkconfig --level <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">35</span> iptables <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>
 chkconfig --list iptables
iptables        <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>
//對應啓動的<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>種狀態 </code>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章