目錄
最近使用到了 IPtables 開放Linux 端口 ,但是遇到了坑,索性把Linux 防火牆基本知識進行一次學習
進行總結,看完這篇文章,你會用基礎的iptables 操作命令,屏蔽端口,開放端口,屏蔽ip、地址段
以及協議的屏蔽,還有可以幫你排除一些可能遇到的坑,掌握contos6 contos7 的 iptables 命令區別
Linux 防火牆的概述 IPtables概述
Linux防火牆
從邏輯上來講分爲
主機防火牆:針對於單個主機進行防護
網絡防火牆:往往處於網絡入口或邊緣,針對於網絡入口進行防護,服務於防火牆背後的本地局域網。
從物理結構上來講有
硬件防火牆:在硬件級別實現部分防火牆功能,另一部分功能基於軟件實現,性能高,成本高。
軟件防火牆:應用軟件處理邏輯運行於通用硬件平臺之上的防火牆,性能低,成本低。
IPtables
其實不是真正的防火牆,我們可以把它理解成一個客戶端代理,用戶通過iptables這個代理,將用戶的安全設定執行到對應的"安全框架"中,這個"安全框架"纔是真正的防火牆,這個框架的名字叫netfilter。
IPtables只是來操作這個框架的命令行工具我們知道iptables是按照規則來辦事的,我們就來說說規則(rules),規則其實就是網絡管理員預定義的條件,規則一般的定義爲"如果數據包頭符合這樣的條件,就這樣處理這個數據包"。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工作就是添加、修改和刪除這些規則。
IPtables 表的概念 與鏈的概念
我們先來說說 鏈的概念,當客戶端向服務端發送一個數據包,客戶端會向服務端網卡發送報文,而TCP/IP協議屬於內核的一部分,所以我們想讓防火牆達到防火和屏蔽的作用,需要在內核處設置關卡,將經過的報文進行檢查後在決定是否放行,這就出現了input 關卡 ,和 output 關卡 。這些關卡實際上就是“ 鏈 “ 。
在實際的使用過程中我們還需要了解幾個概念 prerouting (路由前),forward (轉發),postouting(路由後)。
報文的流向:
流向本機的報文 : prerouting -> input
由本機轉發的報文:prerouting -> forward -> postouting
有本機發出的報文:output -> postouting
再來說說表的概念,我們說的這些鏈上可能會有一些雷同的規則,我們就可以把這些規則總結到一起,,這就引出了表的概念,
表分爲4種filter 、nat 、mangle、raw他們分別存儲這不同的規則:
filter :負責過濾功能 ,防火牆進出的一些規則(我們使用iptables 最常指定的就是這個表,如果不指定,默認爲這個表)
nat :network address translation 服務網絡地址翻譯的規則
mangle :負責拆解報文,修改報文
raw:關閉nat表上啓用的連接追蹤機制。
IPtables 應用 操作方法
對匹配的值進行的處理動作表
ACCEPT | 允許數據包通過。 |
DROP | 直接丟棄數據包,不給任何迴應信息,這時候客戶端會感覺自己的請求泥牛入海了,過了超時時間纔會有反應。 |
REJECT | 拒絕數據包通過,必要時會給數據發送端一個響應的信息,客戶端剛請求就會收到拒絕的信息。 |
SNAT | 源地址轉換,解決內網用戶用同一個公網地址上網的問題。 |
MASQUERADE | 是SNAT的一種特殊形式,適用於動態的、臨時會變的ip上。 |
DNAT | 目標地址轉換。 |
REDIRECT | 在本機做端口映射。 |
LOG | 在/var/log/messages文件中記錄日誌信息,然後將數據包傳遞給下一條規則,也就是說除了記錄以外不對數據包做任何其他操作,仍然讓下一條規則去匹配。 |
限制端口
iptables -t filter -A INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,36,80 -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
示例表示,禁止來自146的主機上的tcp報文訪問本機的22號端口、36號端口以及80號端口。
"-m multiport --dports 22,36,80"表示使用了multiport擴展模塊的--dports擴展條件,以同時指定了多個離散的端口,每個端口之間用逗號隔開。
-- dports 就是表示 目標端口
-- sports 表示遠程訪問的 源端口
iptables -t filter -A INPUT -s 192.168.1.146 -p tcp -m multiport --sports 22,36,80 -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
示例表示,禁止來自146的主機上的tcp從22號端口、36號端口以及80號端口發出的報文
限制IP地址
例子 :
iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
使用-I選項,指明將"規則"插入至哪個鏈中,-I表示insert,即插入的意思,所以-I INPUT表示將規則插入於INPUT鏈中,即添加規則之意。這裏要注意的 是 -A -I 的區別 -A是家到規則表中的末尾,追加。而-I是追加到第一條。
這裏就有坑了 因爲它讀取配置表是從上而下的 所以你得保證前面的規則中沒有過濾掉這個IP 否者就不生效。
使用-s選項,指明"匹配條件"中的"源地址",即如果報文的源地址屬於-s對應的地址,那麼報文則滿足匹配條件,-s爲source之意,表示源地址。
使用-j選項,指明當"匹配條件"被滿足時,所對應的動作,上例中指定的動作爲DROP,在上例中,當報文的源地址爲192.168.1.146時,報文則被DROP(丟棄)
多個IP地址可以用 ,號隔開依次類推 例子:
iptables -t filter -A INPUT -s 192.168.1.146,192.168.145 -j DROP
限制IP地址段
iptables -t filter -A INPUT -s 10.0.0.0/16 -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
限制協議
iptables -t filter -A INPUT -s 192.168.1.146 -p tcp -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
此時我們用ping命令 由146 ping 本機發現可以ping 通 因爲我們ping 命令是基於icmp協議
我們把tcp換成icmp就不能了
centos6中,-p選項支持如下協議類型
tcp, udp, udplite, icmp, esp, ah, sctp
centos7中,-p選項支持如下協議類型
tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
根據報文內容的限制
/sbin/iptables -t filter -A INPUT -m string --alog bm --string "OOXX" -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
'-m string'表示使用string模塊,'--algo bm'表示使用bm算法去匹配指定的字符串,' --string "OOXX" '則表示我們想要匹配的字符串爲"OOXX" 設置完上圖中的規則後,由於index.html中包含"OOXX"字符串,所以,146的迴應報文無法通過126的INPUT鏈,所以無法獲取到頁面對應的內容。
--algo:用於指定匹配算法,可選的算法有bm與kmp,此選項爲必須選項,我們不用糾結於選擇哪個算法,但是我們必須指定一個。
--string:用於指定需要匹配的字符串。
centos7 的改動
centos7已經不再使用init風格的腳本啓動服務,而是使用unit文件,所以,在centos7中已經不能再使用類似service iptables start這樣的命令了,所以service iptables save也無法執行,同時,在centos7中,使用firewall替代了原來的iptables service,不過不用擔心,我們只要通過yum源安裝iptables與iptables-services即可(iptables一般會被默認安裝,但是iptables-services在centos7中一般不會被默認安裝),在centos7中安裝完iptables-services後,即可像centos6中一樣,通過service iptables save命令保存規則了,規則同樣保存在/etc/sysconfig/iptables文件中。
配置好yum源以後安裝iptables-service
yum install -y iptables-services
停止firewalld
systemctl stop firewalld
禁止firewalld自動啓動
systemctl disable firewalld
啓動iptables
systemctl start iptables
將iptables設置爲開機自動啓動,以後即可通過iptables-service控制iptables服務
systemctl enable iptables
詳細的內容學習移步 :http://www.zsythink.net/archives/1544
他寫的很全面。