在了解iptables的詳細原理之前,我們先來看下如何使用iptables,以終為始,有可能會讓你對iptables了解更深
所以接下來我們以配置一個生產環境下的iptables為例來講講它的常用命令
第一步:清空當前的所有規則和計數
iptables -F #清空所有的防火牆規則 iptables -X #刪除用戶自定義的空鏈 iptables -Z #清空計數
第二步:配置允許ssh端口連接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT #22為你的ssh端口, -s 192.168.1.0/24表示允許這個網段的機器來連接,其它網段的ip地址是登陸不了你的機器的。 -j ACCEPT表示接受這樣的請求
第三步:允許本地回環地址可以正常使用
iptables -A INPUT -i lo -j ACCEPT #本地圓環地址就是那個127.0.0.1,是本機上使用的,它進與出都設置為允許
iptables -A OUTPUT -o lo -j ACCEPT
第四步:設置默認的規則
(由於在生產上,我們設置默認的入與轉發都不允許,出的允許)
iptables -P INPUT DROP #配置默認的不讓進 iptables -P FORWARD DROP #默認的不允許轉發 iptables -P OUTPUT ACCEPT #默認的可以出去
第五步:配置白名單
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT #允許機房內網機器可以訪問 iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT #允許機房內網機器可以訪問 iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT #允許183.121.3.7訪問本機的3380端口
第六步:開啟相應的服務端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #開啟80端口,因為web對外都是這個端口 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT #允許被ping iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #已經建立的連接得讓它進來
第七步:保存規則到配置文件中
因為剛剛的所有的規則都還是在內存中的,如果重啟機器或者執行service iptables restart都會讓其它失效,所以我們要把它保存在文件中,讓它重啟的時候能夠被加載到。
[root@zejin238 ~]# cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak #任何改動之前先備份,請保持這一優秀的習慣 [root@zejin238 ~]# iptables-save > /etc/sysconfig/iptables [root@zejin238 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Wed Sep 28 18:06:07 2016
*filter
:INPUT DROP [8:632]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [4:416]
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.1.0/24 -j ACCEPT
-A INPUT -s 192.168.140.0/24 -j ACCEPT
-A INPUT -s 183.121.3.7/32 -p tcp -m tcp --dport 3380 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Wed Sep 28 18:06:07 2016
至次,我們完成了生產環境iptables的配置
iptables文件說明
前面四行
*filter #代表接下來的配置都是在filter表上的。我們默認的配置都在filter表上的,當然還有其它表,如raw,mangle,nat :INPUT DROP [8:632] #代表filter表上默認的input chain為drop ,對應上面的命令iptables -P INPUT DROP,中括號里面的兩個數字代表的是這條鏈上已經接受到的包的數量及字節數量[包的數量:包的總字節數] :FORWARD DROP [0:0] #代表filter表上默認的forward chain為drop ,對應上面的命令iptables -P FORWARD DROP,中括號里面的兩個數字代表的是這條鏈上已經接受到的包的數量及字節數量[包的數量:包的總字節數] :OUTPUT ACCEPT [4:416] #代表filter表上默認的forward chain為drop ,對應上面的命令iptables -P OUTPUT ACCEPT,中括號里面的兩個數字代表的是這條鏈上已經接受到的包的數量及字節數量[包的數量:包的總字節數]
接下來的部分到commit結束前,都是我們剛剛執行的配置命令
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -s 192.168.1.0/24 -j ACCEPT -A INPUT -s 192.168.140.0/24 -j ACCEPT -A INPUT -s 183.121.3.7/32 -p tcp -m tcp --dport 3380 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -o lo -j ACCEPT
input chain與output chain分開,其它的順序與我們配置時的順序一致。
iptables優化
當服務器收到一條請求時,它會把iptables從上往下,一條條匹配定制的規則,那么假如機器收到一個正常的web請求,要走80端口,它需要先去檢驗前面5條規則,發現都不符合,直到第六條滿足條件,那么這樣的話防火牆的工作效率就低了很多。
所以我們優化的思路是:請求最頻繁的放在最上面,請求頻率較小的放在最后面。
我們此時可以直接去修改文件:vi /etc/sysconfig/iptables
調整后順序大概為:
# Generated by iptables-save v1.4.7 on Wed Sep 28 18:06:07 2016 *filter :INPUT DROP [8:632] :FORWARD DROP [0:0] :OUTPUT ACCEPT [4:416] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -s 192.168.135.0/24 -j ACCEPT -A INPUT -s 192.168.140.0/24 -j ACCEPT -A INPUT -s 183.121.3.7/32 -p tcp -m tcp --dport 3380 -j ACCEPT -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT COMMIT # Completed on Wed Sep 28 18:06:07 2016
因為web服務器,肯定是80端口訪問最頻繁,那為什么不是放第一條呢?
在這里,我們把已經有狀態的聯接放在第一條是因為在請求連接中,有很多都是在建立在已經聯接的基礎上通信的,譬如有可能你第一次連接的3380端口,狀態是new,但在后續的聯接都為ESTABLISHED,第一條就可以匹配到了。
理解iptables格式
我們在上面的iptables文件中,最開始接觸會發現格式蠻奇怪的,不知道什么回事
其實iptables就是定義一些規則,滿足相應的規則則進行ACCEPT、DROP、REJECT、DNAT、SNAT......
那么怎么定義匹配規則:
通用匹配
-s 指定源地址
-d 指定目標地址
-p 指定協議
-i 指定數據報文流入接口
-o 指定數據報文流出接口
擴展匹配
指定-m選項,表示用什么模塊來匹配,如:
-m state --state
NEW,ESTABLISHED,RELATED 表示用state模塊來匹配當前連接狀態為這三種狀態的連接
-m iprange
--src-range 用iprange模塊匹配來源的ip地址范圍
--dst-range 用iprange模塊匹配目的的ip地址范圍
-m multiport
--source-ports 用multiport模塊來匹配來源的端口范圍
--destination-ports 用multiport模塊來匹配目的的端口范圍
我們看如下一條例子來解讀:
-A INPUT -p tcp -m iprange --src-range 121.21.30.36-121.21.30.100 -m multiport --destination-ports 3326,3327,3328 -m state --state NEW -j ACCEPT
這表示來自121.21.30.36-121.21.30.100這個地址范圍的,請求端口為3326,3327,3328並且是新建的連接,都給予放行。
模塊有很多,參數有很多,有些沒看過怎么辦?
man iptables
那iptables還有其它表,內部是怎么流轉的,請看 Linux iptables原理--數據包流向 。