Linux系統中,防火牆(Firewall),網址轉換(NAT),數據包(package)記錄,流量統計,這些功能是由Netfilter子系統所提供的,而iptables是控制Netfilter的工具。iptables將許多複雜的規則組織成成容易控制的方式,以便管理員可以進行分組測試,或關閉、啓動某組規則。
iptable能夠爲Unix、Linux和BSD個人工作站創建一個防火牆,也可以爲一個子網創建防火牆以保護其它的系統平臺。iptable只讀取數據包頭,不會給信息流增加負擔,也無需進行驗證。
1. 術語解釋
DNATDestination Network Address Translation 目標網絡地址轉換。 DNAT是一種改變數據包目的ip地址的技術,經常和SNAT聯用,以使多臺服務器能共享一個ip地址連入Internet,並且繼續服務。通過對同一個 ip地址分配不同的端口,來決定數據的流向。SNATSource Network Address Translation源網絡地址轉換。這是一種改變數據包源ip地址的技術, 經常用來使多臺計算機分享一個Internet地址。這隻在IPv4中使用,因爲IPv4的地址已快用完了,IPv6將解 決這個問題。
2. iptable 概述
2.1. iptable的鏈和表結構
如上圖可以看出,iptable總體結構.
2.2. 5個鏈(chain)
PREROUTING在數據包進入防火牆之後、路由判斷之前對數據包進行修改INPUT在數據包被路由到本地之後,但在用戶空間程序看到它之前對數據包進行修改OUTPUT用戶空間程序處理數據包後,由本地發出,再次被路由之前更改數據包FORWARD在最初的路由判斷之後、最後一次更改包的源地址之前對數據包進行修改POSTROUTING在所有路由判斷之後,對數據包進行修改
注意: 鏈 是每個數據包流需要經過的不同環節,你可以在不同的環節根據需要設置不同的過濾策略,每個鏈的默認策略都是Accept
2.3. 4個表(table)
Mangle表這個表主要用來mangle包,你可以使用mangle匹配來改變包的一些屬性,比如 TOS(TYPE OF SERVICE),TTL (TIME TO LIVE),MARK(後續流量控制TC等)Nat表此表僅用於NAT,也就是轉換包的源或目標地址。注意,就象我們前面說過的,只有流的第一個 包會被這個鏈匹配,其後的包會自動被做相同的處理(DNAT,SNAT,MASQUERADE)Filter表此表用來過濾數據包,我們可以在任何時候匹配包並過濾它們。 我們就是在這裏根據包的內容對包做DROP或ACCEPT的.
iptalbe中,要用 -t 參數指定要操作哪個表,如果沒有 -t 參數,就默認對filter表操作.Raw表優先級最高,設置raw時一般是爲了不再讓iptables做數據包的鏈接跟蹤處理,提高性能
注意: 表 是規則的集合組,每個表中的規則條目是按順序匹配的,你可以在數據包經過的不同環節設置規則,表的處理優先級:raw > mangle > nat > filter
2.4. 詳細的數據包流程
從上圖可以看出,數據包流環節和表的配合使用方法
3. iptable應用場景
上圖是應用場景的簡單拓撲描述,下面的應用場景舉例,都以上圖爲參考.
系統啓動的時候所有的默認策略都是ACCEPT,在下面的場景舉例中,我們都是在這種前提下設定iptable的。下面每個場景舉例都是獨立的,沒有相關聯性的。
3.1. 網關服務器安全策略
目標 : 網關服務器系統自生安全策略,只對內網用戶開放22端口(sshd服務)
01.
#清空 filter table
02.
[root@localhost]
#
iptables -F -t filter
03.
[root@localhost]
#
iptables -X -t filter
04.
[root@localhost]
#
iptables -Z -t filter
05.
06.
#清空 nat table
07.
[root@localhost]
#
iptables -F -t nat
08.
[root@localhost]
#
iptables -X -t nat
09.
[root@localhost]
#
iptables -Z -t nat
10.
11.
#設置默認策略(INPUT鏈默認爲DROP)
12.
[root@localhost]
#
iptables -t filter -P INPUT DROP
13.
[root@localhost]
#
iptables -t filter -P OUTPUT ACCEPT
14.
[root@localhost]
#
iptables -t filter -P FORWARD ACCEPT
15.
16.
#迴環接口(lo),默認accept
17.
[root@localhost]
#
iptables -A INPUT -p ALL -i lo -j ACCEPT
18.
19.
#只對內網用戶開放sshd服務
20.
[root@localhost]
#
iptables -A INPUT -p tcp -s 192.168.138.0/24 --dport 22 -j ACCEPT
說明: 防火牆的策略順序一般都是 從 非信任 ==> 信任,默認關閉所有訪問權限,然後按照需要逐條開放訪問權限.
3.2. 共享上網(nat)
目標:使局域網的用戶都可以訪問外網的服務器
1.
[root@localhost]
#
echo 1 > /proc/sys/net/ipv4/ip_forward
2.
[root@localhost]
#
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
說明: SNAT 和 MASQUERADE 區別
SNAT : 不管是幾個地址,必須明確的指定要SNAT的ip,適合網關服務器有固定地址或者是固定地址範圍. MASQUERADE : 是針對ADSL動態撥號這種場景而設計,從服務器的網絡接口上,自動獲取當前ip地址來做NAT,這樣就實現了動態SNAT地址轉換
3.3. 內網的服務器對外服務(端口映射)
目標:使外網用戶可以訪問到局域網192.168.138.21這臺HTTP服務
1.
[root@localhost]
#
echo 1 > /proc/sys/net/ipv4/ip_forward
2.
[root@localhost]
#
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.138.21
3.
[root@localhost]
#
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
3.4. 在網關服務器進行透明代理
目標: 使局域網用戶,訪問外網web服務時,自動使用squid作web透明代理服務器。
1.
[root@localhost]
#
echo 1 > /proc/sys/net/ipv4/ip_forward
2.
[root@localhost]
#
iptables -t nat -A PREROUTING -s 192.168.138.0/24 -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.138.1
3.
[root@localhost]
#
iptables -t nat -A PREROUTING -s 192.168.138.0/24 -p tcp --dport 80 -i eth0 -j REDIRECT --to 3128
4.
[root@localhost]
#
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
via http://www.linuxde.net/2013/06/14620.html