Linux命令詳解:iptables 命令



一、Linux防火牆 iptables 相關知識點

1、概要

        iptables 是組成 Linux 平臺下的包過濾防火牆,與大多數的 Linux 軟件一樣,這個包過濾防火牆是免費的,它可以替代昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網絡地址轉換(NAT)等功能。在日常 Linux 運維工作中,經常會設置 iptables 防火牆規則,用來加固服務安全。

1.1 防火牆分類

       ①  包過濾防火牆(pack filtering)在網絡層對數據包進行選擇過濾,採用訪問控制列表(Access control table-ACL)檢查數據流的源地址,目的地址,源和目的端口,IP等信息。
       ②  代理服務器型防火牆

1.2 iptables基礎

(1)規則(rules):網絡管理員預定義的條件
       規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義爲“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息 包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。
       當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工作是添加、修改和刪除等規則。

       其中:
       · 匹配(match):符合指定的條件,比如指定的 IP 地址和端口。
       · 丟棄(drop):當一個包到達時,簡單地丟棄,不做其它任何處理。
       · 接受(accept):和丟棄相反,接受這個包,讓這個包通過。
       · 拒絕(reject):和丟棄相似,但它還會向發送這個包的源主機發送錯誤消息。這個錯誤消息可以指定,也可以自動產生。
       · 目標(target):指定的動作,說明如何處理一個包,比如:丟棄,接受,或拒絕。
       · 跳轉(jump):和目標類似,不過它指定的不是一個具體的動作,而是另一個鏈,表示要跳轉到那個鏈上。
       · 規則(rule):一個或多個匹配及其對應的目標。

(2)鏈(chains)是數據包傳播的路徑,每一條鏈其實就是衆多規則中的一個檢查清單,每一條鏈中可以有一 條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的默認策略來處理數據包。

(3)表(tables):提供特定的功能,iptables 內置了 4 個表,即 filter 表、nat 表、mangle 表和 raw 表,分別用於實現包過濾、網絡地址轉換、包重構(修改)和數據跟蹤處理的功能
         - filter表 是系統默認的,INPUT表(進入的包),FORWORD(轉發的包),OUTPUT(處理本地生成的包),filter表只能對包進行授受和丟棄的操作。
         - nat表(網絡地址轉換),PREROUTING(修改即將到來的數據包),OUTPUT(修改在路由之前本地生成的數據包),POSTROUTING(修改即將出去的數據包)
         - mangle表,PREROUTING,OUTPUT,FORWORD,POSTROUTING,INPUT

          iptables 採用 “表” 和 “鏈” 的分層結構,在 Linux 中現在是 四張表 五個鏈。下面羅列一下這四張表和五個鏈(注意一定要明白這些表和鏈的關係及作用)
在這裏插入圖片描述
   1)filter表——三個鏈:INPUT、FORWARD、OUTPUT
         作用:過濾數據包 內核模塊:iptables_filter.
   2)Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
         作用:用於網絡地址轉換(IP、端口) 內核模塊:iptable_nat
   3)Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
         作用:修改數據包的服務類型、TTL、並且可以配置路由實現QOS內核模塊:iptable_mangle(別看這個表這麼麻煩,咱們設置策略時幾乎都不會用到它)
   4)Raw表——兩個鏈:OUTPUT、PREROUTING
         作用:決定數據包是否被狀態跟蹤機制處理 內核模塊:iptable_raw

規則鏈:
   1)INPUT——進來的數據包應用此規則鏈中的策略
   2)OUTPUT——外出的數據包應用此規則鏈中的策略
   3)FORWARD——轉發數據包時應用此規則鏈中的策略
   4)PREROUTING——對數據包作路由選擇前應用此鏈中的規則
      (記住!所有的數據包進來的時侯都先由這個鏈處理)
   5)POSTROUTING——對數據包作路由選擇後應用此鏈中的規則
      (所有的數據包出來的時侯都先由這個鏈處理)

1.3 管理和設置 iptables 規則

在這裏插入圖片描述
在這裏插入圖片描述

1.4 iptables 傳輸數據包的過程

在這裏插入圖片描述
   1)當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
   2)如果數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。
   3)如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。

如果還是不清楚數據包經過iptables的基本流程,再看下面更具體的流程圖:
在這裏插入圖片描述
從圖中可將iptables數據包報文的處理過程分爲三種類型:
1)目的爲本機的報文
   報文以本機爲目的地址時,其經過iptables的過程爲:
   1.數據包從network到網卡
   2.網卡接收到數據包後,進入raw表的PREROUTING鏈。這個鏈的作用是在連接跟蹤之前處理報文,能夠設置一條連接不被連接跟蹤處理。(注:不要在raw表上添加其他規則)
   3.如果設置了連接跟蹤,則在這條連接上處理。
   4.經過raw處理後,進入mangle表的PREROUTING鏈。這個鏈主要是用來修改報文的TOS、TTL以及給報文設置特殊的MARK。(注:通常mangle表以給報文設置MARK爲主,在這個表裏面,千萬不要做過濾/NAT/僞裝這類的事情)
   5.進入nat表的PREROUTING鏈。這個鏈主要用來處理 DNAT,應該避免在這條鏈裏面做過濾,否則可能造成有些報文會漏掉。(注:它只用來完成源/目的地址的轉換)
   6.進入路由決定數據包的處理。例如決定報文是上本機還是轉發或者其他地方。(注:此處假設報文交給本機處理)
   7.進入mangle表的 INPUT 鏈。在把報文實際送給本機前,路由之後,我們可以再次修改報文。
   8.進入filter表的 INPUT 鏈。在這兒我們對所有送往本機的報文進行過濾,要注意所有收到的並且目的地址爲本機的報文都會經過這個鏈,而不管哪個接口進來的或者它往哪兒去。
   9. 進過規則過濾,報文交由本地進程或者應用程序處理,例如服務器或者客戶端程序。

2)本地主機發出報文
數據包由本機發出時,其經過iptables的過程爲:
   1.本地進程或者應用程序(例如服務器或者客戶端程序)發出數據包。
   2.路由選擇,用哪個源地址以及從哪個接口上出去,當然還有其他一些必要的信息。
   3.進入raw表的OUTPUT鏈。這裏是能夠在連接跟蹤生效前處理報文的點,在這可以標記某個連接不被連接跟蹤處理。
   4.連接跟蹤對本地的數據包進行處理。
   5.進入 mangle 表的 OUTPUT 鏈,在這裏我們可以修改數據包,但不要做過濾(以避免副作用)。
   6.進入 nat 表的 OUTPUT 鏈,可以對防火牆自己發出的數據做目的NAT(DNAT) 。
   7.進入 filter 表的 OUTPUT 鏈,可以對本地出去的數據包進行過濾。
   8.再次進行路由決定,因爲前面的 mangle 和 nat 表可能修改了報文的路由信息。
   9.進入 mangle 表的 POSTROUTING 鏈。這條鏈可能被兩種報文遍歷,一種是轉發的報文,另外就是本機產生的報文。
   10.進入 nat 表的 POSTROUTING 鏈。在這我們做源 NAT(SNAT),建議你不要在這做報文過濾,因爲有副作用。即使你設置了默認策略,一些報文也有可能溜過去。
   11.進入出去的網絡接口。

3)轉發報文
報文經過iptables進入轉發的過程爲:
   1.數據包從network到網卡
   2.網卡接收到數據包後,進入raw表的PREROUTING鏈。這個鏈的作用是在連接跟蹤之前處理報文,能夠設置一條連接不被連接跟蹤處理。(注:不要在raw表上添加其他規則)
   3.如果設置了連接跟蹤,則在這條連接上處理。
   4.經過raw處理後,進入mangle表的PREROUTING鏈。這個鏈主要是用來修改報文的TOS、TTL以及給報文設置特殊的MARK。(注:通常mangle表以給報文設置MARK爲主,在這個表裏面,千萬不要做過濾/NAT/僞裝這類的事情)
   5.進入nat表的PREROUTING鏈。這個鏈主要用來處理 DNAT,應該避免在這條鏈裏面做過濾,否則可能造成有些報文會漏掉。(注:它只用來完成源/目的地址的轉換)
   6.進入路由決定數據包的處理。例如決定報文是上本機還是轉發或者其他地方。(注:此處假設報文進行轉發)
   7.進入 mangle 表的 FORWARD 鏈,這裏也比較特殊,這是在第一次路由決定之後,在進行最後的路由決定之前,我們仍然可以對數據包進行某些修改。
   8.進入 filter 表的 FORWARD 鏈,在這裏我們可以對所有轉發的數據包進行過濾。需要注意的是:經過這裏的數據包是轉發的,方向是雙向的。
   9.進入 mangle 表的 POSTROUTING 鏈,到這裏已經做完了所有的路由決定,但數據包仍然在本地主機,我們還可以進行某些修改。
   10.進入 nat 表的 POSTROUTING 鏈,在這裏一般都是用來做 SNAT ,不要在這裏進行過濾。
   11.進入出去的網絡接口。

1.5 其它

       iptables是按照順序讀取規則
       防火牆規則的配置建議
              Ⅰ 規則力求簡單
              Ⅱ 規則的順序很重要
              Ⅲ 儘量優化規則
              Ⅳ 做好筆記

二、iptables 規則設置用法

1、iptables 命令的基本語法格式

       iptables  [-t 表名]  命令選項  [鏈名]  [條件匹配]   [-j 目標動作或跳轉] (-j 後面的操作,對大小寫敏感)

      表名、鏈名:用於指定 iptables 命令所操作的表和鏈
      命令選項: 用於指定管理 iptables 規則的按時(比如:插入、增加、刪除、查看等)
      條件匹配:用於指定對符合什麼樣 條件的數據包進行處理
      目標動作或跳轉:用於指定數據包的處理方式(比如允許通過、拒絕、丟棄、跳轉(Jump)給其它鏈處理)

說明:
       動作               選項
       ACCEPT        接收數據包
       DROP            丟棄數據包
       REDIRECT    將數據包重新轉向到本機或另一臺主機的某一個端口,通常功能實現透明代理或對外開放內網的某些服務
       SNAT            源地址轉換
       DNAT            目的地址轉換
       MASQUERADE           IP僞裝
       LOG              日誌功能

2、 iptables 命令的管理控制選項

-A    在指定鏈的末尾添加(append)一條新的規則
-D    刪除(delete)指定鏈中的某一條規則,可以按規則序號和內容刪除
-I     在指定鏈中插入(insert)一條新的規則,默認在第一行添加
-R    修改、替換(replace)指定鏈中的某一條規則,可以按規則序號和內容替換
-L     列出(list)指定鏈中所有的規則進行查看(默認是filter表,如果列出nat表的規則需要添加-t,即iptables -t nat -L)
-E     重命名用戶定義的鏈,不改變鏈本身
-F     清空(flush)
-N     新建(new-chain)一條用戶自己定義的規則鏈
-X     刪除指定表中用戶自定義的規則鏈(delete-chain)
-P     設置指定鏈的默認策略(policy)
-Z     將所有表的所有鏈的字節和數據包計數器清零
-n     使用數字形式(numeric)顯示輸出結果
-v     查看規則表詳細信息(verbose)的信息
-V    查看版本(version)
-h     獲取幫助(help)


3、防火牆處理數據包的四種方式

ACCEPT     允許數據包通過
DROP         直接丟棄數據包,不給任何迴應信息
REJECT     拒絕數據包通過,必要時會給數據發送端一個響應的信息。
LOG           在/var/log/messages文件中記錄日誌信息,然後將數據包傳遞給下一條規則

4、iptables 防火牆規則的保存與恢復

iptables-save把規則保存到文件中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動裝載
使用命令iptables-save來保存規則。
一般用:
    iptables-save > /etc/sysconfig/iptables
生成保存規則的文件/etc/sysconfig/iptables

也可以用:
    service iptables save
它能把規則自動保存在/etc/sysconfig/iptables中。
當計算機啓動時,rc.d下的腳本將用命令iptables-restore調用這個文件,從而就自動恢復了規則。

4、iptables 防火牆常用的策略梳理

設置默認鏈策略
iptables 的 filter 表中有三種鏈:INPUT、FORWARD 和 OUTPUT。
默認的鏈策略是 ACCEPT,可以將它們設置成 DROP。

①  先拒絕所有的數據包,然後再允許需要的數據包
iptalbes -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

②  查看nat表所有鏈的規則列表
iptables -t nat -L

③  增加,插入,刪除和替換規則
iptables [-t 表名] <-A|I|D|R> 鏈名 [規則編號] [-i|o 網卡名稱] [-p 協議類型] [-s 源ip|源子網] [–sport 源端口號] [-d 目的IP|目標子網] [–dport 目標端口號] [-j 動作]

參數:-A 增加
     -I 插入
     -D 刪除
     -R 替換

3、例子
iptables -t filter -A INPUT -s 192.168.1.5 -i eth0 -j DROP
禁止IP爲192.168.1.5的主機從eth0訪問本機

iptables -t filter -I INPUT 2 -s 192.168.5.0/24 -p tcp --dport 80 -j DROP
禁止子網192.168.5.0訪問web服務

iptables -t filter -I INPUT 2 -s 192.168.7.9 -p tcp --dport ftp -j DROP
禁止IP爲192.168.7.9訪問FTP服務

iptables -t filter -L INPUT
查看filter表中INPUT鏈的規則

iptables -t nat -F
刪除nat表中的所有規則

iptables -I FORWARD -d www.niky.xin -j DROP
禁止訪問www.niky.xin網站

iptables -I FORWARD -s 192.168.5.23 -j DROP
禁止192.168.5.23上網


三、具體配置實戰 - filter表

我們來配置一個filter表的防火牆。

(1) 查看本機關於IPTABLES的設置情況

[root@test ~]# iptables -L -n

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
        
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
        
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
        
Chain RH-Firewall-1-INPUT (0 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255 
ACCEPT     esp  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     ah   --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     udp  --  0.0.0.0/0            224.0.0.251         udp dpt:5353 
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:631 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:25 
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

可以看出我在安裝 Linux 時,選擇了有防火牆,並且開放了22,80,25端口。

如果你在安裝 Linux 時沒有選擇啓動防火牆,是這樣的:
[root@test ~]# iptables -L -n

Chain INPUT (policy ACCEPT)
target     prot opt source               destination 
       
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination 
       
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

什麼規則都沒有。

(2) 清除原有規則

不管你在安裝 Linux 時是否啓動了防火牆,如果你想配置屬於自己的防火牆,那就清除現在 filter 的所有規則。
[root@test ~]# iptables -F      清除預設表filter中的所有規則鏈的規則
[root@test ~]# iptables -X      清除預設表filter中使用者自定鏈中的規則

[root@test ~]# iptables -L -n

Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

什麼都沒有了吧,和我們在安裝linux時沒有啓動防火牆是一樣的.(提前說一句,這些配置就像用命令配置IP一樣,重起就會失去作用),怎麼保存呢?
[root@test ~]# /etc/rc.d/init.d/iptables save

這樣就可以寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起作用.
[root@test ~]# service iptables restart

現在IPTABLES配置表裏什麼配置都沒有了,那我們開始我們的配置吧

(3) 添加 ssh 規則

爲了能採用遠程 SSH 登陸,我們要開啓 22 端口
[root@test ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@test ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:這個規則,如果你把OUTPUT 設置成 DROP 的就要寫上這一步,好多人都忘了寫這一步規則導致始終無法SSH。在遠程一下,是不是好了。)

(4) 設定預設規則

[root@test ~]# iptables -P INPUT DROP
[root@test ~]# iptables -P OUTPUT ACCEPT
[root@test ~]# iptables -P FORWARD DROP
      上面的意思是,當超出了 IPTABLES 裏 filter 表裏的兩個鏈規則(INPUT,FORWARD)時,不在這兩個規則裏的數據包怎麼處理呢,那就是 DROP (放棄)。應該說這樣配置是很安全的。我們要控制流入數據包
      而對於 OUTPUT 鏈,也就是流出的包我們不用做太多限制,而是採取ACCEPT,也就是說,不在着個規則裏的包怎麼辦呢,那就是通過。
      可以看出 INPUT、FORWARD 兩個鏈採用的是允許什麼包通過,而 OUTPUT 鏈採用的是不允許什麼包通過。
      這樣設置還是挺合理的,當然你也可以三個鏈都 DROP,但這樣做我認爲是沒有必要的,而且要寫的規則就會增加。但如果你只想要有限的幾個規則是,如只做 WEB 服務器.還是推薦三個鏈都是 DROP。

      注:如果你是遠程 SSH 登陸的話,當你輸入第一個命令回車的時候就應該掉了。因爲你沒有設置任何規則。
      怎麼辦,去本機操作唄!

(5) 添加其他規則

首先添加 INPUT 鏈,INPUT鏈的默認規則是 DROP,所以我們就寫需要 ACCETP (通過)的鏈
如果開啓了 web 服務器,OUTPUT 設置成 DROP 的話,同樣也要添加一條鏈:
[root@test ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT (其他同理)
如果做了WEB服務器,開啓80端口
[root@test ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

如果做了郵件服務器,開啓25,110端口
[root@test ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@test ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT

如果做了FTP服務器,開啓21端口
[root@test ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@test ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT

如果做了DNS服務器,開啓53端口
[root@test ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT

如果你還做了其他的服務器,需要開啓哪個端口,照寫就行了。
上面主要寫的都是INPUT鏈,凡是不在上面的規則裏的,都DROP

允許icmp包通過,也就是允許ping
[root@test ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT設置成 DROP 的話)
[root@test ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT設置成 DROP 的話)

允許loopback (不然會導致DNS無法正常關閉等問題)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)

下面寫 OUTPUT鏈、OUTPUT鏈默認規則是 ACCEPT,所以我們就寫需要DROP(放棄)的鏈.
減少不安全的端口連接
[root@test ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[root@test ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些些特洛伊木馬會掃描端口31337到31340(即黑客語言中的 elite 端口)上的服務。既然合法服務都不使用這些非標準端口來通信,阻塞這些端口能夠有效地減少你的網絡上可能被感染的機器和它們的遠程主服務器進行獨立通信的機會
還有其他端口也一樣,像:31335、27444、27665、20034 NetBus、9704、137-139(smb)、2049(NFS)端口也應被禁止,我在這寫的也不全,有興趣的朋友應該去查一下相關資料。

當然出入更安全的考慮,你也可以把 OUTPUT 鏈設置成 DROP,那你添加的規則就多一些,就像上邊添加
允許 SSH 登陸一樣,照着寫就行了。

下面寫一下更加細緻的規則,就是 限制到某臺機器
如:我們只允許192.168.0.3的機器進行SSH連接
[root@test ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
如果要允許或限制一段IP地址可用:192.168.0.0/24 表示 192.168.0.1-255端的所有IP ,24表示子網掩碼數。
但要記得把 /etc/sysconfig/iptables 裏的這一行刪了.
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因爲它表示所有地址都可以登陸.
或採用命令方式:
[root@test ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
然後保存。我再說一遍,凡是採用命令的方式,只在當時生效,如果想要重起後也起作用,那就要保存。即 寫入到 /etc/sysconfig/iptables 文件裏。
[root@test ~]# /etc/rc.d/init.d/iptables save
這樣寫 !192.168.0.3 表示除了192.168.0.3 的ip地址
其他的規則連接也一樣這麼設置.

在下面就是FORWARD鏈、FORWARD鏈的默認規則是 DROP,所以我們就寫需要ACCETP(通過)的鏈,對正在轉發鏈的監控。
開啓轉發功能,(在做NAT時,FORWARD默認規則是DROP時,必須做)
[root@test ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@test ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

丟棄壞的TCP包
[root@test ~]# iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

處理IP碎片數量,防止攻擊,允許每秒100個
[root@test ~]# iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

設置ICMP包過濾,允許每秒1個包,限制觸發條件是10個包。
[root@test ~]# iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只所以允許ICMP包通過,就是因爲我在這裏有限制。

四、配置一個NAT表放火牆

1.查看本機關於NAT的設置情況

[root@test rc.d]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all – 192.168.0.0/24 anywhere to:211.101.46.235
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我的NAT已經配置好了的(只是提供最簡單的代理上網功能,還沒有添加防火牆規則).關於怎麼配置NAT,參考我的另一篇文章
當然你如果還沒有配置NAT的話,你也不用清除規則,因爲NAT在默認情況下是什麼都沒有的
如果你想清除,命令是
[root@test ~]# iptables -F -t nat
[root@test ~]# iptables -X -t nat
[root@test ~]# iptables -Z -t nat

2.添加規則

添加基本的NAT地址轉換,(關於如何配置NAT可以看我的另一篇文章),
添加規則,我們只添加DROP鏈.因爲默認鏈全是ACCEPT。
防止外網用內網IP欺騙
[root@test sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
[root@test sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
[root@test sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
如果我們想,比如阻止MSN、QQ、BT等的話,需要找到它們所用的端口或者IP,(個人認爲沒有太大必要)
例:
禁止與211.101.46.253的所有連接
[root@test ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP
禁用FTP(21)端口
[root@test ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
這樣寫範圍太大了,我們可以更精確的定義.
[root@test ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP
這樣只禁用211.101.46.253地址的FTP連接,其他連接還可以。如web(80端口)連接
按照我寫的,你只要找到QQ、MSN等其他軟件的IP地址和端口,以及基於什麼協議,只要照着寫就行了。

最後:
drop非法連接
[root@test ~]# iptables -A INPUT -m state --state INVALID -j DROP
[root@test ~]# iptables -A OUTPUT -m state --state INVALID -j DROP
[root@test ~]# iptables-A FORWARD -m state --state INVALID -j DROP

允許所有已經建立的和相關的連接
[root@test ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@test ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@test ~]# /etc/rc.d/init.d/iptables save

這樣就可以寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起作用.

[root@test ~]# service iptables restart





-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 24000 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.100.160 -p tcp -m tcp --dport 18612 -j ACCEPT


五、運維工作中常用的兩個規則

其實,在運維工作中最常用的兩個規則就是白名單規則和NAT轉發規則:

1)白名單規則

       在linux終端命令行裏操作時,如果不是默認的filter表時,需要指定表;
       如果在/etc/sysconfig/iptables文件裏設置,就在對應表的配置區域內設置;
       上面兩種方式設置效果是一樣的!

比如開通本機的22端口,允許192.168.1.0網段的服務器訪問(-t filter表配置可以省略,默認就是這種表的配置)
[root@linux-node1 ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
或者
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

開通本機的80端口,只允許192.168.1.150機器訪問(32位掩碼錶示單機,單機指定時可以不加掩碼)
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

然後保存規則,重啓iptables
[root@linux-node1 ~]# service iptables save
[root@linux-node1 ~]# service iptables restart

或者在/etc/sysconfig/iptables文件裏設置如下(其實上面在終端命令行裏設置並save和restart防火牆後,就會自動保存規則到/etc/sysconfig/iptables這個文件中的):
[root@bastion-IDC ~]# cat /etc/sysconfig/iptables

*filter
:INPUT ACCEPT [442620:173026884]
:FORWARD ACCEPT [118911:23993940]
:OUTPUT ACCEPT [8215384:539509656]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

[root@bastion-IDC ~]# service iptables restart

2)NAT轉發設置

       比如訪問本機(192.168.1.7)的8088端口轉發到192.168.1.160的80端口;訪問本機的33066端口轉發到192.168.1.161的3306端口

準備工作:
       本機打開ip_forword路由轉發功能;192.168.1.160/161的內網網關要和本機網關一致!如果沒有內網網關,就將網關設置成本機內網ip,並且關閉防火牆(防火牆要是打開了,就設置對應端口允許本機訪問)

[root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80
[root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7
[root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT

[root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306
[root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7
[root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT

[root@kvm-server conf]# service iptables save
[root@kvm-server conf]# service iptables restart

或者在/etc/sysconfig/iptables文件裏設置如下
[root@bastion-IDC ~]# cat /etc/sysconfig/iptables

*nat
:PREROUTING ACCEPT [60:4250]
:INPUT ACCEPT [31:1973]
:OUTPUT ACCEPT [3:220]
:POSTROUTING ACCEPT [3:220]
-A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80 //PREROUTING規則都放在上面
-A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306
-A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7 //POSTROUTING規則都放在下面
-A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7

*filter
:INPUT ACCEPT [16:7159]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [715:147195加粗樣式]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT

[root@bastion-IDC ~]# service iptables restart

[root@bastion-IDC ~]# iptables -L //列出設置的規則,默認列出的是filter表下的規則
[root@bastion-IDC ~]# iptables -L -t nat //如果列出nat表下規則,就加-t參數



六、運維實例設置

實例1

需求1:

  • 限制本機的web服務器在週一不允許訪問

  • 新請求的速率不能超過 100個 每秒

  • web 服務器包含了 admin 字符串

  • 頁面不允許訪問; web 服務器僅允許響應報文離開本機
    設置如下:
    週一不允許訪問
    iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays Mon -j ACCEPT
    iptables -A OUTPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT

    新請求速率不能超過100個每秒
    iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/s -j ACCEPT

    web包含admin字符串的頁面不允許訪問,源端口:dport
    iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string ‘admin’ -j REJECT

    web服務器僅允許響應報文離開主機,放行端口(目標端口):sport
    iptables -A OUTPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT

需求2:

  • 在工作時間,即週一到週五的8:30-18:00,開放本機的ftp服務給 192.168.1.0網絡中的主機訪問
  • 數據下載請求的次數每分鐘不得超過 5 個
    設置如下:
    iptables -A INPUT -p tcp --dport 21 -s 192.168.1.0/24 -m time ! --weekdays 6,7 -m time --timestart 8:30 --timestop 18:00 -m connlimit --connlimit-above 5 -j ACCET

需求3:

  • 開放本機的ssh服務給192.168.1.1-192.168.1.100 中的主機
  • 新請求建立的速率一分鐘不得超過2個
  • 僅允許響應報文通過其服務端口離開本機
    設置如下:
    iptables -A INPUT -p tcp --dport 22 -m iprange --src-rang 192.168.1.1-192.168.1.100 -m limit --limit 2/m -j ACCEPT
    iptables -A OUTPUT -p tcp --sport 22 -m iprange --dst-rang 192.168.1.1-192.168.1.100 -m state --state ESTABLISHED -j ACCEPT

需求4:

  • 拒絕 TCP 標誌位全部爲 1 及全部爲 0 的報文訪問本機
    iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

需求5:

  • 允許本機 ping 別的主機;但不開放別的主機 ping 本機
    iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
    iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
    iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT

    或者下面禁ping操作:
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all



七、iptables 其他示例

刪除INPUT鏈的第一條規則
iptables -D INPUT 1

拒絕進入防火牆的所有ICMP協議數據包
iptables -I INPUT -p icmp -j REJECT

允許防火牆轉發除ICMP協議以外的所有數據包
iptables -A FORWARD -p ! icmp -j ACCEPT
說明:使用“!”可以將條件取反

拒絕轉發來自192.168.1.10主機的數據,允許轉發來自192.168.0.0/24網段的數據
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
說明:注意一定要把拒絕的放在前面不然就不起作用了!

丟棄從外網接口(eth1)進入防火牆本機的源地址爲私網地址的數據包
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

封堵網段(192.168.1.0/24),兩小時後解封
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I FORWARD -s 10.20.30.0/24 -j DROP
at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1
說明:這個策略可以藉助crond計劃任務來完成,就再好不過了

只允許管理員從202.13.0.0/16網段使用SSH遠程登錄防火牆主機
iptables -A INPUT -s 202.13.0.0/16 -p tcp -m tcp -m state --state NEW --dport 22 -j ACCEPT
說明:這個用法比較適合對設備進行遠程管理時使用,比如位於分公司中的SQL服務器需要被總公司的管理員管理時

通常在服務器上會對某一服務端口的訪問做白名單限制,比如(其他端口設置和下面一致):
運行本機的3306端口(mysql服務)被訪問
     iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT
或者只運行本機的3306端口被192.168.1.0/24網段機器訪問
     iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT

允許本機開放從TCP端口20-1024提供的應用服務
     iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 20:1024 -j ACCEPT

允許轉發來自192.168.0.0/24局域網段的DNS解析請求數據包
     iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
     iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT

屏蔽指定的IP地址
以下規則將屏蔽BLOCK_THIS_IP所指定的IP地址訪問本地主機:
     BLOCK_THIS_IP=“x.x.x.x”
     iptables -A INPUT -i eth0 -s “$BLOCK_THIS_IP” -j DROP
(或者僅屏蔽來自該IP的TCP數據包)
     iptables -A INPUT -i eth0 -p tcp -s “$BLOCK_THIS_IP” -j DROP

屏蔽環回(loopback)訪問
     iptables -A INPUT -i lo -j DROP
     iptables -A OUTPUT -o lo -j DROP

屏蔽來自外部的ping,即禁止外部機器ping本機
     iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
     iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP

屏蔽從本機ping外部主機,禁止本機ping外部機器
     iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
     iptables -A INPUT -p icmp --icmp-type echo-reply -j DROP

禁止其他主機ping本機,但是允許本機ping其他主機 (禁止別人ping本機,也可以使用echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all)
     iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
     iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
     iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT

禁止轉發來自MAC地址爲00:0C:29:27:55:3F的和主機的數據包
     iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP
說明:iptables中使用“-m 模塊關鍵字”的形式調用顯示匹配。咱們這裏用“-m mac –mac-source”來表示數據包的源MAC地址

允許防火牆本機對外開放TCP端口20、21、25、110以及被動模式FTP端口1250-1280
     iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
注意:這裏用“-m multiport --dport”來指定多個目的端口
     iptables -A INPUT -p tcp -m tcp -m multiport --dports 22,80,443,1250-1280 -m state --state NEW -j ACCEPT
也可以將這幾個端口分開設置多行:
     iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 22 -j ACCEPT
     iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 80 -j ACCEPT
     iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 443 -j ACCEPT
     iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 1250:1280 -j ACCEPT

禁止轉發源IP地址爲192.168.1.20-192.168.1.99的TCP數據包
     iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
說明:
此處用“-m iprange --src-range”指定IP範圍
1)過濾源地址範圍:
     iptables -A INPUT -m iprange --src-range 192.168.1.2-192.168.1.7 -j DROP
2)過濾目標地址範圍:
     iptables -A INPUT -m iprange --dst-range 192.168.1.2-192.168.1.7 -j DROP
3)針對端口訪問的過濾。下面表示除了192.168.1.5-192.168.1.10之間的ip能訪問192.168.1.67機器的80端口以外,其他ip都不可以訪問!
     iptables -A INPUT -d 192.168.1.67 -p tcp --dport 80 -m iprange --src-range 192.168.1.5-192.168.1.10 -j ACCEPT

禁止轉發與正常TCP連接無關的非–syn請求數據包
     iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
說明:“-m state”表示數據包的連接狀態,“NEW”表示與任何連接無關的

拒絕訪問防火牆的新數據包,但允許響應連接或與已有連接相關的數據包
     iptables -A INPUT -p tcp -m state --state NEW -j DROP
     iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
說明:“ESTABLISHED”表示已經響應請求或者已經建立連接的數據包,“RELATED”表示與已建立的連接有相關性的,比如FTP數據連接等

防止DoS攻擊
     iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
-m limit: 啓用limit擴展,限制速度。
–limit 25/minute: 允許最多每分鐘25個連接
–limit-burst 100: 當達到100個連接後,才啓用上述25/minute限制

–icmp-type 8 表示 Echo request——回顯請求(Ping請求)。下面表示本機ping主機192.168.1.109時候的限速設置:
     iptables -I INPUT -d 192.168.1.109 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT

允許路由
     如果本地主機有兩塊網卡,一塊連接內網(eth0),一塊連接外網(eth1),那麼可以使用下面的規則將eth0的數據路由到eht1:
     iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

IPtables中可以靈活的做各種網絡地址轉換(NAT)
網絡地址轉換主要有兩種:SNAT和DNAT
1)SNAT是source network address translation的縮寫,即源地址目標轉換。
     比如,多個PC機使用ADSL路由器共享上網,每個PC機都配置了內網IP。PC機訪問外部網絡的時候,路由器將數據包的報頭中的源地址替換成路由器的ip,當外部網絡的服務器比如網站web服務器接到訪問請求的時候,它的日誌記錄下來的是路由器的ip地址,而不是pc機的內網ip,這是因爲,這個服務器收到的數據包的報頭裏邊的“源地址”,已經被替換了。所以叫做SNAT,基於源地址的地址轉換

2)DNAT是destination network address translation的縮寫,即目標網絡地址轉換。
     典型的應用是,有個web服務器放在內網中,配置了內網ip,前端有個防火牆配置公網ip,互聯網上的訪問者使用公網ip來訪問這個網站。
     當訪問的時候,客戶端發出一個數據包,這個數據包的報頭裏邊,目標地址寫的是防火牆的公網ip,防火牆會把這個數據包的報頭改寫一次,將目標地址改寫成web服務器的內網ip,然後再把這個數據包發送到內網的web服務器上。這樣,數據包就穿透了防火牆,並從公網ip變成了一個對內網地址的訪問了。即DNAT,基於目標的網絡地址轉換

以下規則將會把本機192.168.1.17來自422端口的流量轉發到22端口,這意味着來自422端口的SSH連接請求與來自22端口的請求等效。
1)啓用DNAT轉發
     iptables -t nat -A PREROUTING -p tcp -d 192.168.1.17 --dport 422 -j DNAT --to-destination 192.168.1.17:22
2)允許連接到422端口的請求
     iptables -t filter -A INPUT -p tcp -m tcp -m state --state NEW --dport 422 -j ACCEPT
3)保存規則
     service iptables save
     service iptables restart

假設現在本機外網網關是58.68.250.1,那麼把HTTP請求轉發到內部的一臺服務器192.168.1.20的8888端口上,規則如下:
     iptables -t nat -A PREROUTING -p tcp -i eth0 -d 58.68.250.1 --dport 8888 -j DNAT --to 192.168.1.20:80
     iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT
     iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
     service iptables save
     service iptables restart

     或者或本機內網ip是192.168.1.10,那麼把HTTP請求轉發到內部的一臺服務器192.168.1.20的8888端口上,規則如下:
     準備工作:本機打開ip_forword路由轉發功能;192.168.1.20的內網網關要和本機網關保持一致!如果沒有內網網關,就將網關地址設置成本機內網ip,並且關閉防火牆(防火牆要是打開了,就設置對應端口允許本機訪問)
     iptables -t nat -A PREROUTING -p tcp -m tcp --dport 20022 -j DNAT --to-destination 192.168.1.150:22
     iptables -t nat -A POSTROUTING -d 192.168.1.150/32 -p tcp -m tcp --sport 22 -j SNAT --to-source 192.168.1.8
     iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 20022 -j ACCEPT
     service iptables save
     service iptables restart

MASQUERADE,地址僞裝,在iptables中有着和SNAT相近的效果,但也有一些區別:
1)使用SNAT的時候,出口ip的地址範圍可以是一個,也可以是多個,例如:
     1)如下命令表示把所有10.8.0.0網段的數據包SNAT成192.168.5.3的ip然後發出去
     iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
     2)如下命令表示把所有10.8.0.0網段的數據包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等幾個ip然後發出去
     iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
     這就是SNAT的使用方法,即可以NAT成一個地址,也可以NAT成多個地址。但是,對於SNAT,不管是幾個地址,必須明確的指定要SNAT的ip!
     假如當前系統用的是ADSL動態撥號方式,那麼每次撥號,出口ip192.168.5.3都會改變,而且改變的幅度很大,不一定是192.168.5.3到192.168.5.5範圍內的地址。這個時候如果按照現在的方式來配置iptables就會出現問題了,因爲每次撥號後,服務器地址都會變化,而iptables規則內的ip是不會隨着自動變化的,每次地址變化後都必須手工修改一次iptables,把規則裏邊的固定ip改成新的ip,這樣是非常不好用的!

2)MASQUERADE就是針對上述場景而設計的,它的作用是,從服務器的網卡上,自動獲取當前ip地址來做NAT。
比如下邊的命令:
     iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
     如此配置的話,不用指定SNAT的目標ip了。
     不管現在eth0的出口獲得了怎樣的動態ip,MASQUERADE會自動讀取eth0現在的ip地址然後做SNAT出去
     這樣就實現了很好的動態SNAT地址轉換




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章