1. 程式人生 > >Linux中iptables設定詳細

Linux中iptables設定詳細

無論如何,iptables是一個需要特別謹慎設定的東西,萬一伺服器不在你身邊,而你貿然設定導致無法SSH,那就等著被老闆罵吧,呵呵。。。

以下內容是為了防止這種情況發生而寫的,當然很初級,不過一般伺服器也夠用了:

1.首先介紹一下指令和相關配置檔案
啟動指令:service iptables start   
重啟指令:service iptables restart   
關閉指令:service iptables stop   
  
然後是相關配置:/etc/sysconfig/iptables   
如何操作該配置呢?   
vim /etc/sysconfig/iptables   
然後進去修改即可,修改完了怎麼辦?這裡很多人會想到/etc/rc.d/init.d/iptables save指令,但是一旦你這麼幹了你剛才的修改內容就白做了。。。   
具體方法是:   
只修改/etc/sysconfig/iptables 使其生效的辦法是修改好後先service iptables restart,然後才呼叫/etc/rc.d/init.d/iptables save,   
因為/etc/rc.d/init.d/iptables save會在iptables服務啟動時重新載入,要是在重啟之前直接先呼叫了/etc/rc.d/init.d/iptables save那麼你   

的/etc/sysconfig/iptables 配置就回滾到上次啟動服務的配置了,這點必須注意!!!  

2.下面介紹一些指令用法(主要還是man iptables看下相關資料才行)
-A:指定鏈名   
-p:指定協議型別   
-d:指定目標地址   
--dport:指定目標埠(destination port 目的埠)   
--sport:指定源埠(source port 源埠)   

-j:指定動作型別  

3.如果我不像修改檔案直接打命令可以嗎,當然沒問題,步驟如下:
例如我給SSH加放行的語句:   
新增input記錄: iptables -A INPUT -p tcp --dport 22 -j ACCEPT   
新增output記錄: iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT   

最後注意需要再執行一下 /etc/init.d/iptables save,這樣這兩條語句就儲存到剛才那個/etc/sysconfig/iptables 檔案中了。  

4.接下來說明一下步驟,如果機器不在我身邊,我只能SSH進去做iptables規則,那麼我必須注意每一步,千萬別搞錯了,否則就SSH連結不上都有可能!

首先要做的是給咱的SSH進行ACCEPT配置,以免直接無法連線的情況發生:   

1.如果SSH埠是22(這裡不建議用預設埠最好改掉SSH埠)   
iptables -A INPUT -p tcp --dport 22 -j ACCEPT   
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT   
注意要/etc/rc.d/init.d/iptables save,以下每一步都最好執行一遍此語句,以下不再累述。   
  
2.vim /etc/sysconfig/iptables確定是否已經加入配置,可以的話執行service iptables restart重啟後生效   
  
3.下面是很危險的操作,如果你第一步沒做就會直接可能導致你連不上SSH,此步驟前切記執行第一步!!!   
iptables -P INPUT DROP    
iptables -P OUTPUT DROP    
iptables -P FORWARD DROP   
這個步驟是把所有不符合自己配置的規則ACCEPT的連線全部DROP掉,執行完以後如果咱SSH還沒掉,那麼謝天謝地,安全了,重啟下iptables後繼續下面的配置!   
  
4.下面咱就不細說了,具體就是看自己伺服器要開放哪些埠或者是要訪問哪些埠來做具體的配置,下面是我自己的機器的配置:   
  
/etc/sysconfig/iptables檔案配置如下:   
# Generated by iptables-save v1.4.7 on Fri Mar  2 19:59:43 2012   
*filter   
:INPUT DROP [0:0]   
:FORWARD DROP [0:0]   
:OUTPUT DROP [8:496]   
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT   
#ping使用的埠   
-A INPUT -p icmp -j ACCEPT   
-A INPUT -i lo -j ACCEPT   
-A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT   
-A INPUT -s 192.168.2.200/32 -d 192.168.2.200/32 -j ACCEPT   
#允許伺服器自己的SSH(對外部請求來說伺服器是目標所以使用--dport)   
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT   
#80埠不用說了吧,伺服器網站訪問埠   
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT   
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT   
-A INPUT -p tcp -m tcp --dport 11211 -j ACCEPT   
-A INPUT -p tcp -m tcp --dport 11212 -j ACCEPT   
-A FORWARD -j REJECT --reject-with icmp-host-prohibited   
#53埠是DNS相關,TCP和UDP都要配置   
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT   
-A INPUT -p udp -m udp --dport 53 -j ACCEPT   
#ping使用的埠   
-A OUTPUT -p icmp -j ACCEPT   
-A OUTPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT   
-A OUTPUT -s 192.168.2.200/32 -d 192.168.2.200/32 -j ACCEPT   
#允許伺服器SSH到其他機器(使用外部埠就使用--dport)   
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT   
#允許伺服器自己的SSH(自已為源輸出就使用--sport)   
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT   
#訪問外部網站80埠(使用外部埠就使用--dport)   
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT   
#如果伺服器需要訪問外部網站,那麼OUTPUT也需要配置53埠(使用外部埠就使用--dport)   
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT   
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT   
#如果有訪問外部郵箱,那麼開啟郵箱相關埠(使用外部埠就使用--dport)   
-A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT   
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT   
-A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT   
#伺服器網站訪問埠(自已為源輸出就使用--sport)   
-A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT   
-A OUTPUT -p tcp -m tcp --sport 3306 -j ACCEPT   
-A OUTPUT -p tcp -m tcp --sport 11211 -j ACCEPT   
-A OUTPUT -p tcp -m tcp --sport 11212 -j ACCEPT   
COMMIT   

# Completed on Fri Mar  2 19:59:43 2012  

5.可能有時候需要刪除規則,最簡單就是修改一下/etc/sysconfig/iptables然後service iptables restart,最後/etc/rc.d/init.d/iptables save即可。

當然也可以使用指令完成:

在網上找了一下,刪除規則的方法:   
語法是: iptables -D chain rulenum [options]   
其中: chain 是鏈的意思,就是INPUT FORWARD 之類的   
             rulenum 是規則的編號。從1 開始。可以使用  --line-numbers 列出規則的編號   
    
所以,例如上面要刪除一個INPUT鏈的規則的話可以這樣:iptables -D INPUT 3   
意思是刪除第3條規則。   
還有第二種方法。第二種辦法是 -A 命令的對映,不過用-D替換-A。當你的鏈中規則很複雜,而你不想計算它們的編號的時候這就十分有用了。也就是說,你如何用iptables -A.... 語句定義了一個規則,則刪除此規則時就用 -D 來代替- A  其餘的都不變即可。   
======================   
說一下上面的 --line-numbers 選項,如下面的命令:   
iptables -L INPUT --line-numbers   列出INPUT 鏈所有的規則   
num  target     prot opt source               destination            
1    REJECT     tcp  --  anywhere             anywhere            tcp dpt:microsoft-ds reject-with icmp-port-unreachable   
2    REJECT     tcp  --  anywhere             anywhere            tcp dpt:135 reject-with icmp-port-unreachable   
3    REJECT     tcp  --  anywhere             anywhere            tcp dpt:netbios-ssn reject-with icmp-port-unreachable   
  
...   
...   
刪除指定行規則:   

[[email protected] rc.d]# iptables -D INPUT 4  

  6.最後補充一下,如果想針對某IP進行單獨開放埠可以如下配置:
如果我需要對內網某機器單獨開放mysql埠,應該如下配置:   
iptables -A INPUT -s 192.168.2.6 -p tcp -m tcp --dport 3306 -j ACCEPT   

iptables -A OUTPUT -s 192.168.2.6 -p tcp -m tcp --sport 3306 -j ACCEPT  

7.徹底禁止某IP訪問:
#遮蔽單個IP的命令是   
iptables -I INPUT -s 123.45.6.7 -j DROP   
#封整個段即從123.0.0.1到123.255.255.254的命令   
iptables -I INPUT -s 123.0.0.0/8 -j DROP   
#封IP段即從123.45.0.1到123.45.255.254的命令   
iptables -I INPUT -s 124.45.0.0/16 -j DROP   
#封IP段即從123.45.6.1到123.45.6.254的命令是   
iptables -I INPUT -s 123.45.6.0/24 -j DROP   
指令I是insert指令 但是該指令會insert在正確位置並不像A指令看你自己的排序位置,因此用遮蔽因為必須在一開始就要載入遮蔽IP,所以必須使用I命令載入,然後注意執行/etc/rc.d/init.d/iptables save進行儲存後重啟服務即可