RHCE心得18——Iptables學習心得

Iptables是管理Netfilter的唯一工具,Netfilter直接嵌入在Linux內核。他可以爲個人工作站創建一個防火牆,也可以爲一個子網創建防火牆,以保護其他的系統平臺(市場上有很大一部分硬件防火牆也是使用iptables系統的)。
Netfilter在內核中過濾,沒有守護進程,在OSI模型的第2、3、4層插入策略。過濾的速度非常快,因爲他只讀取數據包頭,不會給信息流量增加負擔,也無需進行驗證。
Netfilter提供了一系列的表(tables),每個表由若干個鏈(chains)組成,而每條鏈可以由一條或若干條規則(rules)組成。實際上netfilter 是表的容器,表是鏈的容器,而鏈又是規則的容器。
Netfilter表和Netfilter鏈:
 
表說明:
Filter:這個表主要執行數據包過濾。
Nat:主要進行網絡地址轉換。
Managle:用於修改一些特殊的規則。
鏈說明:
PREROUTING:路由之前,剛到達的數據包。(nat)
INPUT:通過路由,目的爲地爲本機的數據包。(filter)
FORWARD:需要通過本地系統進行轉發的數據包。(filter)
OUTPUT:由本機產生,向外轉發,處於POSTROUTING之前的數據包。(nat和filter)
POSTROUTIONG:通過路由後,即將離開系統的數據包。(nat)
Netfilter的數據包流程:

Iptables 基本語法:
iptables 內置了filter、nat 和mangle 三張表,我們可以使用-t 參數來設置對哪張表生效,也可以省略-t 參數,則默認對filter 表進行操作。

圖中:這句的意思就是:來自(源地址)192.168.0.1的INPUT鏈的數據包直接丟棄。
Iptables進程服務命令:
service iptables save 保存iptables設置,對iptables規則編輯後一定要保存。
service iptables restart 保存設置以後不重啓則設置不生效,要設置生生效請重啓。
service iptables status 檢查iptables的設置。類似於iptable –L命令。
Iptables基本的鏈操作命令:
-L 列出某個鏈或者表中的規則: service iptables status 把這個命令和-L比較下
iptables –L:顯示filter表中的規則等同於iptables –t filter -L
iptables –t nat –L :顯示nat表的中的設置:
-F 刪除某個鏈或者表中的規則:
iptables –F (iptables –t filter –F) 刪除filter表中的所有規則;
iptables –t nat –F 刪除nat表中的所有規則;
iptables –t nat –F POSTROUTING 刪除nat表中POSTROUTING鏈的所有規則;
-A添加一條規則(在當前的規則後添加,也就是排在所有規則後):
iptables -A INPUT –s 192.168.0.1 –j DROP
和實例圖中的功能相同,丟棄來自192.168.0.1的數據包,這裏省略了-t filter。
添加該語句後,保存設置並重新啓動iptalbes 服務,並通過-L的命令查看,就會發現剛添加的這條規則排列在所有規則後。
-----------iptables的匹配規則是按順序排列的。
-I在制定位置插入一條規則:
(如果有迴環規則(iptables –A INPUT –I lo –j ACCEPT,則迴環永遠是第一條)
iptables –I <CHAIN> 作爲第一條規則插入。
iptables <CHAIN> X 作爲第X條規則插入,X這裏代表規則順序號。
iptables –A INPUT –p tcp –s 192.168.0.1 --dport 22 –j ACCEPT
允許192.168.0.1 通過22端口訪問該主機,把它作爲第一條規則插入iptables規則列表。
-----------iptables的匹配規則是按順序排列的。
-P <CHAIN TARGET> 分配連接策略。
iptables –P INPUT DROP 禁止任何輸入的數據包。這句慎用。
iptables –P OUTPUT ACCEPT 允許所有輸出的數據包。
-D刪除某一條規則:
Iptables –D <CHAIN> X 刪除某個鏈的第幾條規則
iptables –D INPUT 3 刪除INPUT鏈上的第3條規則。
iptables –P INPUT DROP 這個不能使用刪除語句刪除,只能到本機輸入iptables –P INPUT ACCEPT
Iptables中的匹配:
iptables –A INPUT –p tcp –s 192.168.0.1 --dport 22 –j ACCEPT
這個命令我們在上面已經看過了,我們來看下其他的一些匹配參數。
-p protocol 匹配網絡協議,例子中匹配tcp協議。
-s IP地址或者網段 匹配源IP地址或者網段
例子中師匹配一個IP的,如果要匹配一個網段則如下
-s 192.168.0.1/24
如果是除這個網段之外的所有則爲:! -s 192.168.0.1/24
如果是除這個IP之外的所有則爲! -s 192.168.0.1
-d IP地址或者網段 匹配目的IP地址或者網段
--dport X 匹配目的端口號,X代表具體端口號。
--sport X 匹配源端口號,X代表具體端口號。
Iptables中的目的:
我們已經在前面看到過-j 後面跟的就是目的。
ACCEPT:允許數據包通過。
DROP:直接丟棄數據包。
REJECT:丟棄數據包,同時發送響應報文通知發送方。
設置Iptables預設規則(本地機防火牆):
1、清除iptables設置:iptables –F
2、設置迴環規則,沒有這個規則好多服務不能啓動:
iptables –A INPUT –i lo –j ACCETP
3、連接跟蹤設置:作用允許連線出去後對方主機迴應進來的封包。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    NEW:想要新建連接的數據包
    INVALID:無效的數據包,例如損壞或者不完整的數據包
    ESTABLISHED:已經建立連接的數據包
    RELATED:與已經發送的數據包有關的數據包
4、iptables -p INPUT DROP 允許進入數據包----慎用該句。
5、iptables -p FORWARD DROP 禁止轉發數據包
6、iptables -P OUTPUT ACCEPT 允許外發數據包
7、設置好以後就可以根據情況開放相應的端口了
iptables –A INPUT –p tcp --dport 20:21 –j ACCEPT 開放FTP的20、21端口。
iptables –A INPUT –P tcp --dport 80 –j ACCEPT 開放http的80端口。
iptables –I INPUT –p tcp –dport 22 –j ACCEPT 開放SSH服務的22端口。
設置Iptables FORWORD規則:
一般情況FORWORD鏈式DROP的,但是當用來做NAT的時候我們就需要設置他了。
首先要開啓轉發功能:編輯/etc/sysctl.conf文件

Iptables轉發功能(在做NAT時,FORWARD默認規則是DROP時,必須做)
# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丟棄壞的TCP包。
#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
處理IP碎片數量,防止***,允許每秒100個。
#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
設置ICMP包過濾,允許每秒1個包,限制觸發條件是10個包。
#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只所以允許ICMP包通過,就是因爲我在這裏有限制。
連接跟蹤:提供對數據包“狀態”的檢查
可以識別的狀態:
NEW:想要新建連接的數據包
INVALID:無效的數據包,例如損壞或者不完整的數據包
ESTABLISHED:已經建立連接的數據包
RELATED:與已經發送的數據包有關的數據包
連接跟蹤的模塊
ip_conntrack_ftp:自動跟蹤FTP連接,並自動打開它需要通過防火牆的高端端口。
Ip_conntrack_tftp:和上面功能類似不過是TFTP服務。
Ip_nat_ftp:修改NAT保護的計算機的FTP數據包。
Ip_nat_tftp:和上面類似不是TFTP數據包。
可以通過修改/etc/sysconfig/iptables-config 文件
修改IPTABLES_MODULES="ip_conntrack_tftp ip_nat_ftp"

也可以通過modprobe ip_conntrack_tftp 不過重啓以後將失效。
連接跟蹤實例:
允許建立連接:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
跟蹤規則:
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
阻止所有其他進入的鏈接:
iptables -A INPUT -m state --state NEW -j DROP
NAT網絡地址轉換:將一個IP轉換成另一個 IP(輸入和輸出)
網絡地址轉換類型:
目的地 NAT(DNAT):DNAT修改包的目的地位址的時機,必須在包即將被送到本機行程之前,或是要被轉送其它電腦之前;所以,使用DNAT爲目標的規則,必須設置於nat表格的PREROUTING鏈結。
源 NAT(SNAT,MASQUERADE):SNAT必須在封包即將離開核心的前一刻,即時修改其來源位址(或通訊端口),所以SNAT規則的設置地點必須是在nat表格的POSTROUTING鏈結。
NAT實例:
iptables -t nat -A PREROUTING -i ethl -p tcp - -dport 80 -j DNAT - - to -destination 192.168.1.3:8080
把要進入eth1(eth1連接外網)80端口的數據包,重新定向到192.168.1.3的8080端口。
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT
--to-dest 192.168.1.3 --to-dest 192.168.1.4 --to-dest 192.168.1.5

上面這句第一個請求被髮到192.168.1.3,第二個發到192.168.1.4如此循環,實現載量平衡。
上面的語句可以使外網的訪問內網開通8080端口的WEB 服務器,那麼內網的WEB服務器如何將數據傳出去呢?這個時候要通過SNAT來實現了。
iptables -t nat -A POSTROUTING -j SNAT
iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.3-192.168.1.9
iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.3:123
iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.3:123-234
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
第一種方法是直接使用SNAT爲目標,這種方法適合用在具有固定IP地址的網關器,另一種方法是使用是使用MASQUERADE爲目標,適合用於只有動態IP地址的網關器(例如,使用PPPoE協定的ADSL連線)。由於由於MASQUERADE能夠應付網絡界面忽然離線,然後以另一個地址恢復上線的情況,所以它轉換邏輯比較複雜些,需要耗損比較多的CPU運算能力,因此,如果你有固定的IP地址,就應該儘量使用SNAT來代替MASQUERADE。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章