Linux中iptables設置詳細

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

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

1.首先介紹一下指令和相關配置文件

 

Xml代碼 複製代碼 收藏代碼spinner.gif

  1. 啓動指令:service iptables start  

  2. 重啓指令:service iptables restart  

  3. 關閉指令:service iptables stop  

  4.   

  5. 然後是相關配置:/etc/sysconfig/iptables  

  6. 如何操作該配置呢?  

  7. vim /etc/sysconfig/iptables  

  8. 然後進去修改即可,修改完了怎麼辦?這裏很多人會想到/etc/rc.d/init.d/iptables save指令,但是一旦你這麼幹了你剛纔的修改內容就白做了。。。  

  9. 具體方法是:  

  10. 只修改/etc/sysconfig/iptables 使其生效的辦法是修改好後先service iptables restart,然後才調用/etc/rc.d/init.d/iptables save,  

  11. 因爲/etc/rc.d/init.d/iptables save會在iptables服務啓動時重新加載,要是在重啓之前直接先調用了/etc/rc.d/init.d/iptables save那麼你  

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

啓動指令: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看下相關資料才行)

 

Xml代碼 複製代碼 收藏代碼spinner.gif

  1. -A:指定鏈名  

  2. -p:指定協議類型  

  3. -d:指定目標地址  

  4. --dport:指定目標端口(destination port 目的端口)  

  5. --sport:指定源端口(source port 源端口)  

  6. -j:指定動作類型  

-A:指定鏈名
-p:指定協議類型
-d:指定目標地址
--dport:指定目標端口(destination port 目的端口)
--sport:指定源端口(source port 源端口)
-j:指定動作類型

 

 3.如果我不像修改文件直接打命令可以嗎,當然沒問題,步驟如下:

 

Java代碼 複製代碼 收藏代碼spinner.gif

  1. 例如我給SSH加放行的語句:  

  2. 添加input記錄: iptables -A INPUT -p tcp --dport 22 -j ACCEPT  

  3. 添加output記錄: iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT  

  4. 最後注意需要再執行一下 /etc/init.d/iptables save,這樣這兩條語句就保存到剛纔那個/etc/sysconfig/iptables 文件中了。  

例如我給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鏈接不上都有可能!

 

Xml代碼 複製代碼 收藏代碼spinner.gif

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

  2. 1.如果SSH端口是22(這裏不建議用默認端口最好改掉SSH端口)  

  3. iptables -A INPUT -p tcp --dport 22 -j ACCEPT  

  4. iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT  

  5. 注意要/etc/rc.d/init.d/iptables save,以下每一步都最好執行一遍此語句,以下不再累述。  

  6.   

  7. 2.vim /etc/sysconfig/iptables確定是否已經加入配置,可以的話執行service iptables restart重啓後生效  

  8.   

  9. 3.下面是很危險的操作,如果你第一步沒做就會直接可能導致你連不上SSH,此步驟前切記執行第一步!!!  

  10. iptables -P INPUT DROP   

  11. iptables -P OUTPUT DROP   

  12. iptables -P FORWARD DROP  

  13. 這個步驟是把所有不符合自己配置的規則ACCEPT的連接全部DROP掉,執行完以後如果咱SSH還沒掉,那麼謝天謝地,安全了,重啓下iptables後繼續下面的配置!  

  14.   

  15. 4.下面咱就不細說了,具體就是看自己服務器要開放哪些端口或者是要訪問哪些端口來做具體的配置,下面是我自己的機器的配置:  

  16.   

  17. /etc/sysconfig/iptables文件配置如下:  

  18. # Generated by iptables-save v1.4.7 on Fri Mar  2 19:59:43 2012  

  19. *filter  

  20. :INPUT DROP [0:0]  

  21. :FORWARD DROP [0:0]  

  22. :OUTPUT DROP [8:496]  

  23. -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  

  24. #ping使用的端口  

  25. -A INPUT -p icmp -j ACCEPT  

  26. -A INPUT -i lo -j ACCEPT  

  27. -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT  

  28. -A INPUT -s 192.168.2.200/32 -d 192.168.2.200/32 -j ACCEPT  

  29. #允許服務器自己的SSH(對外部請求來說服務器是目標所以使用--dport)  

  30. -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT  

  31. #80端口不用說了吧,服務器網站訪問端口  

  32. -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT  

  33. -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT  

  34. -A INPUT -p tcp -m tcp --dport 11211 -j ACCEPT  

  35. -A INPUT -p tcp -m tcp --dport 11212 -j ACCEPT  

  36. -A FORWARD -j REJECT --reject-with icmp-host-prohibited  

  37. #53端口是DNS相關,TCP和UDP都要配置  

  38. -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT  

  39. -A INPUT -p udp -m udp --dport 53 -j ACCEPT  

  40. #ping使用的端口  

  41. -A OUTPUT -p icmp -j ACCEPT  

  42. -A OUTPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT  

  43. -A OUTPUT -s 192.168.2.200/32 -d 192.168.2.200/32 -j ACCEPT  

  44. #允許服務器SSH到其他機器(使用外部端口就使用--dport)  

  45. -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT  

  46. #允許服務器自己的SSH(自已爲源輸出就使用--sport)  

  47. -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT  

  48. #訪問外部網站80端口(使用外部端口就使用--dport)  

  49. -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT  

  50. #如果服務器需要訪問外部網站,那麼OUTPUT也需要配置53端口(使用外部端口就使用--dport)  

  51. -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT  

  52. -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT  

  53. #如果有訪問外部郵箱,那麼打開郵箱相關端口(使用外部端口就使用--dport)  

  54. -A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT  

  55. -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT  

  56. -A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT  

  57. #服務器網站訪問端口(自已爲源輸出就使用--sport)  

  58. -A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT  

  59. -A OUTPUT -p tcp -m tcp --sport 3306 -j ACCEPT  

  60. -A OUTPUT -p tcp -m tcp --sport 11211 -j ACCEPT  

  61. -A OUTPUT -p tcp -m tcp --sport 11212 -j ACCEPT  

  62. COMMIT  

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

首先要做的是給咱的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即可。

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

 

Xml代碼 複製代碼 收藏代碼spinner.gif

  1. 在網上找了一下,刪除規則的方法:  

  2. 語法是: iptables -D chain rulenum [options]  

  3. 其中: chain 是鏈的意思,就是INPUT FORWARD 之類的  

  4.              rulenum 是規則的編號。從1 開始。可以使用  --line-numbers 列出規則的編號  

  5.    

  6. 所以,例如上面要刪除一個INPUT鏈的規則的話可以這樣:iptables -D INPUT 3  

  7. 意思是刪除第3條規則。  

  8. 還有第二種方法。第二種辦法是 -A 命令的映射,不過用-D替換-A。當你的鏈中規則很複雜,而你不想計算它們的編號的時候這就十分有用了。也就是說,你如何用iptables -A.... 語句定義了一個規則,則刪除此規則時就用 -D 來代替- A  其餘的都不變即可。  

  9. ======================  

  10. 說一下上面的 --line-numbers 選項,如下面的命令:  

  11. iptables -L INPUT --line-numbers   列出INPUT 鏈所有的規則  

  12. num  target     prot opt source               destination           

  13. 1    REJECT     tcp  --  anywhere             anywhere            tcp dpt:microsoft-ds reject-with icmp-port-unreachable  

  14. 2    REJECT     tcp  --  anywhere             anywhere            tcp dpt:135 reject-with icmp-port-unreachable  

  15. 3    REJECT     tcp  --  anywhere             anywhere            tcp dpt:netbios-ssn reject-with icmp-port-unreachable  

  16.   

  17. ...  

  18. ...  

  19. 刪除指定行規則:  

  20. [root@localhost rc.d]# iptables -D INPUT 4  

在網上找了一下,刪除規則的方法:
語法是: 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

...
...
刪除指定行規則:
[root@localhost rc.d]# iptables -D INPUT 4

  6.最後補充一下,如果想針對某IP進行單獨開放端口可以如下配置:

 

Xml代碼 複製代碼 收藏代碼spinner.gif

  1. 如果我需要對內網某機器單獨開放mysql端口,應該如下配置:  

  2. iptables -A INPUT -s 192.168.2.6 -p tcp -m tcp --dport 3306 -j ACCEPT  

  3. iptables -A OUTPUT -d 192.168.2.6 -p tcp -m tcp --sport 3306 -j ACCEPT  

如果我需要對內網某機器單獨開放mysql端口,應該如下配置:
iptables -A INPUT -s 192.168.2.6 -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -A OUTPUT -d 192.168.2.6 -p tcp -m tcp --sport 3306 -j ACCEPT

 

如果針對某IP進行全端口開放無限制:

 

Shell代碼 複製代碼 收藏代碼spinner.gif

  1. -A INPUT -s 192.168.2.6/32 -j ACCEPT  

  2. -A OUTPUT -d 192.168.2.6/32 -j ACCEPT  

-A INPUT -s 192.168.2.6/32 -j ACCEPT
-A OUTPUT -d 192.168.2.6/32 -j ACCEPT

 

 

7.徹底禁止某IP訪問:

 

Xml代碼 複製代碼 收藏代碼spinner.gif

  1. #屏蔽單個IP的命令是  

  2. iptables -I INPUT -s 123.45.6.7 -j DROP  

  3. #封整個段即從123.0.0.1到123.255.255.254的命令  

  4. iptables -I INPUT -s 123.0.0.0/8 -j DROP  

  5. #封IP段即從123.45.0.1到123.45.255.254的命令  

  6. iptables -I INPUT -s 124.45.0.0/16 -j DROP  

  7. #封IP段即從123.45.6.1到123.45.6.254的命令是  

  8. iptables -I INPUT -s 123.45.6.0/24 -j DROP  

  9. 指令I是insert指令 但是該指令會insert在正確位置並不像A指令看你自己的排序位置,因此用屏蔽因爲必須在一開始就要加載屏蔽IP,所以必須使用I命令加載,然後注意執行/etc/rc.d/init.d/iptables save進行保存後重啓服務即可  

轉載自:http://jsczxy2.iteye.com/blog/1436713

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