目錄: 瀏覽器
1. 簡介
2. 首先,什麼是包過濾?
3. 快速入門指南
4. 數據包過濾流程
5. 具體如何使用Iptables命令實現過濾功能
6. 地址轉換(NAT)
7. 排除建議
1. 簡介
————————————————————————————————————————————————
讀者們,你們好:
在這裏咱們假設你已經有必定的IP地址、網絡地址、子網掩碼、路由、DNS基礎知識。若是沒有建議你先閱讀一下官網的networking-concepts-HOWTO文檔。官網地址爲:www.netfilter.org
當前咱們的網絡是不安全的。但問題是咱們作網絡限制,同時還須要提供快速、便利的網絡通信環境,而不是處於邪惡的目的。網絡限制是一把雙刃刀,但本文章並不是解決這個問題。
因此刀在手如何使用徹底取決於你。我相信你會把這些工具用到合理的地方,並能很好地使用這些工具。而不是用於其餘目的。
------------------------------------------------------------------------------------------------
2. 首先,什麼是包過濾?
包過濾是當一個數據包經過時,使用軟件去查看包頭信息並決定對該包的處理方式。你能夠丟棄該數據包、接受該數據包亦或是其餘更復雜的處理方式。
在Linux中包過濾已經集成到內核中了,甚至還能夠作一些數據包欺騙,但基本原則仍是查看數據包頭並決定處理方式。
------------------------------------------------------------------------------------------------
2.1 爲何咱們須要包過濾?
可控性、安全性、可監控性
可控性:當你在局域網中使用Linux鏈接另外一個網絡時(如:互聯網),你能夠容許或拒絕特定類型的數據。例如:數據包都會包含目標地址,這樣你就能夠防止數據包進入某個特定的網絡。再舉個例子,我使用瀏覽器訪問某個網站,在該網站上全是廣告,此時瀏覽器會浪費個人時間去下載這些廣告信息。這時我能夠告知包過濾工具不容許該網站的數據包經過以解決這個問題。
安全性:當你的Linux主機是複雜的互聯網與有序的局域網之間的惟一主機時,你能夠經過數據包限制讓該Linux主機成爲局域網與互聯網之間的安全大門!好比:你能夠會想容許全部的數據包進入互聯網,但你會對從外網進來的死亡之ping感到憂慮。再如,你可能不但願有人能夠telnet鏈接你的Linux主機,即便對方有密碼也不能夠。簡單而言就是經過包過濾工具拒絕外網部分數據包進入本地。
可監控性:當有些不正常的數據流量出現時,包過濾工具能夠及時通知你是很是不錯的注意!
------------------------------------------------------------------------------------------------
2.2 Linux系統如何過濾數據包
Linux內核從1.1開始就已經有包過濾功能。第一代產品是1994年誕生於BSD系統的ipfw。Linux2.0加強了該功能;用戶可使用ipfwadm控制內核過濾規則。Linux2.2是用戶工具變動爲ipchains。最後在Linux2.4中用戶工具被重寫,新的工具爲iptables。
你須要一個支持netfilter架構的Linux內核:netfilter是在內核中的過濾架構,並且該架構可使用插件動態加載。
Linux防火牆主要包括兩個部分:一部分爲netfilter是內核過濾的基礎架構,一部分爲iptables是用戶工具,用來編輯具體的過濾規則提供給內核netfilter。
IPTABLES:該工具能夠添加刪除具體的過濾規則至內核包過濾表。這也意味着不管你如何設置防火牆規則,一旦機器重啓全部的規則將丟失。
永久保存規則:你設置的防火牆規則被保存在內核中,但重啓會丟失。你可使用iptables-save和iptables-restore腳本實現永久保存與恢復。
備註:Linux防火牆全部的規則被保存在表中,默認Iptables防火牆有4個表:filter表(實現過濾功能),nat表(實現地址轉換功能), mangle表(修改數據包的TOS、TTL等信息),raw表(實現數據包跟蹤功能)
每一個表中有多個數據鏈,而咱們的具體規則被分門別類的鏈中。如下是每一個表中的默認鏈:
filter表:INPUT鏈(入站數據過濾),FORWARD鏈(轉發數據過濾),OUTPUT鏈(出站數據過濾)
nat表:PREROUTING鏈,POSTROUTING鏈,OUTPUT鏈
mangle表:PREROUTING鏈,POSTROUTING鏈,INPUT鏈,OUTPUT鏈,FORWARD鏈
raw表:OUTPUT鏈,PREROUTING鏈
------------------------------------------------------------------------------------------------
3. 快速入門指南
不少朋友使用單線PPP(撥號)鏈接互聯網,而且不但願任何人訪問你的網絡,防火牆能夠作以下設置。
首先加載過濾功能的模塊:
#insmod ip_conntrack
#insmod ip_conntrack_ftp
以上兩天命令也可使用下面兩天命令替換
#modprobe ip_conntrack
#modprobe ip_conntrack_ftp
其次添加具體規則:
# iptables -N block 新建規則鏈
# iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT 容許出站數據包的迴應信息
# iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT 容許出站數據(本身能夠訪問外網)
# iptables -A block -j DROP 其他數據包所有丟棄
# iptables -A INPUT -j block 入站數據時讀取block鏈中的過濾規則
# iptables -A FORWARD -j block 轉發數據時讀取block鏈中的過濾規則
------------------------------------------------------------------------------------------------
4. 數據包過濾流程
內核的過濾表默認有三個鏈(鏈中具體存放過濾規則):INPUT,OUTPUT,FORWARD。
_____
Incoming / \ Outgoing
-->[Routing ]--->|FORWARD|------->
[Decision] \_____/ ^
| |
v ____
___ / \
/ \ |OUTPUT|
|INPUT| \____/
\___/ ^
| |
----> Local Process ----
三個圈中表示上面的三個鏈,當數據包到達上圖中的某個圈中時,鏈即刻根據規則判斷數據包的處理方式,若是鏈中的某個規則說丟棄該包,該數據包將當即被丟棄;若是鏈中規則說接受,則數據包繼續向後傳輸。
每一個鏈中包含有具體的規則,每一個規則具體明確說明:什麼數據包頭信息作怎樣的處理,若是你的數據包沒有匹配第一個規則,則繼續對比下一條規則。最後若是沒有規則與你的數據包匹配,內核將讀取鏈的默認規則。出於安全的考慮,默認規則通常會被設置爲丟棄(DROP)。
1.數據包過來時內核先查看目標地址:這一步被稱爲路由。
2.若是該數據是發往本地的,則繼續向下傳遞至INPUT鏈,當INPUT鏈容許該數據包,數據包進入本機等待程序接受數據。
3.不然,若是內核未開啓數據轉發功能,被轉發的數據包將被直接丟棄,若是內核開啓了數據轉發功能,該數據包將傳遞給FORWARD鏈以轉發數據,數據進入目標網絡接口(網卡接口);此時若是 FORWARD鏈容許數據包經過,該數據包繼續向後傳遞。
4.最後在本機的一個程序發送網絡數據包時,數據包會馬上進入OUPUT鏈,根據具體規則決定容許或拒絕發送出去。
------------------------------------------------------------------------------------------------
5. 具體如何使用Iptables命令實現過濾功能
iptables有很是詳盡的手冊文檔(man iptalbes),如下是iptables能夠實現的幾種不一樣的操做,咱們從filter過濾表開始。
1. 建立新的自定義鏈 -N
2. 刪除自定義鏈 -X
3. 改變默認策略 -P
4. 顯示鏈規則 -L
5. 清空鏈中的規則 -F
6. 將包過濾統計信息清零 -Z
若是在鏈中維護具體規則:
1. 追加新的規則 -A
2. 插入新的規則 -I
3. 替換舊的規則 -R
4. 刪除舊的規則 -D
------------------------------------------------------------------------------------------------
5.1 操做單條規則
這是最基本的包過濾操做。一般你須要使用-A或-D命令選項,有時你還會使用到-I與-R命令選項。
每條規則須要指定匹配條件以及匹配後的處理方式(ACCEPT容許,DROP丟棄,REJECT拒絕,LOG日誌等),如:你可能但願丟棄素有本地迴環(127.0.0.1)的ICMP數據包,這樣咱們的匹配條件是:ICMP協議而且源地址是127.0.0.1 匹配後作DROP處理。
127.0.0.1是本地迴環接口,即便你沒有物理網卡,該接口同樣存在。你可使用ping命令產生這類數據包。
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=21.9 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 21.966/21.966/21.966/0.000 ms
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP 添加一條規則
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
你能夠看到第一次ping是成功的(-c 1 說明僅ping一次),而後咱們追加了一條規則到INPUT鏈,該規則指定從127.0.0.1發送的ICMP協議的數據包將被丟棄。第二次再執行ping命令全部的數據100%丟失。
咱們有兩種方式能夠刪除規則,首先咱們知道INPUT鏈中只有一條規則,咱們可使用編號刪除:
#iptables -D INPUT 1 刪除INPUT鏈中的第一條規則
第二種方法相似與-A選項,使用-D替換-A。當你的規則比較複雜並搞不清編號時可使用這種方式:
#iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
------------------------------------------------------------------------------------------------
5.2 特定過濾規則
上面咱們已經看到可使用-p指定協議,-s指定源地址,但還有不少能夠用來過濾的條件匹配符。下面咱們分別介紹:
源地址與目標地址
源地址(-s,--source或--src),目標地址(-d,--destination或--dst)有四種使用方式:最經常使用的是使用名稱,好比"localhost"或者"http://www.kernel.org"。第二種方法是使用IP地址如"127.0.0.1"。第三四種方法能夠匹配IP地址區域,如"199.95.207.0/24"或"199.95.207.0/255.255.255.0"。它們均可以匹配199.95.207.0到199.95.207地址可使用0/0匹配全部地址。
# iptables -A INPUT -s 0/0 -j DROP 拒絕全部源地址訪問本機
取反匹配
不少標籤"-s","-d"等均可以在後面添加"!"以表示否認匹配,如"-s ! localhost"將匹配全部非本地源地址。
協議匹配
匹配協議可使用-p標籤,協議的指定可使用數字編號(若是你知道協議的編號)或使用名稱(如"TCP","UDP","ICMP"等)。協議名稱前能夠添加"!"如"-p ! TCP"匹配全部非TCP協議數據包。
接口匹配
"-i(--in-interface)"和"-o(--out-interface)"匹配指定的接口。接口是真實的物理網卡接口,-i(數據包從哪一個網卡進來的),-o(數據從哪一個網卡出去的)。你可使用ifconfig命令查看哪些接口是開啓的。
注意:在INPUT鏈不可使用-o選項,由於入站的數據不走出站接口。因此在INPUT鏈中的-o規則將沒法匹配任何數據。
同理,在OUTPUT鏈中不可使用-i選項。
數據段匹配
不少數據包由於太大沒法一次完成數據的傳輸。此時數據包將被分割爲數據片斷再發送出去。接收端接受完數據後將把這些數據片斷從新組合成完整的數據包。
但問題在於當數據被分割後,只有前面的初始數據片斷包含所有的數據頭部信息(IP,TCP,UDP,ICMP等),後續的數據片斷僅包含數據包頭部信息的一部分信息。這時去再檢查後續數據片斷的頭部信息是不可能的。
固然,若是你想匹配第二個及後面被分片的數據,可使用"-f"選項。
# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP 丟棄發送至192.168.1.1的全部數據以及分片數據
擴展iptables規則
iptables有很好的可擴展性,也就是說內核架構與iptables工具均可以添加擴展功能。
內核功能擴展通常放在內核模塊子目錄中:/lib/modules/2.6.32-220.el6.i686/kernel/net/netfilter(這裏以CentOS6.2爲例)。這些模塊在你使用iptables時會自動加載。
mac
該模塊須要使用"-m mac"選項啓用,這對應過濾進站數據包的源MAC地址很用幫助。
#iptables -I INPUT -m mac --mac-source 00:60:08:91:CC:B7 -j REJECT 拒絕MAC地址爲00:60:08:91:CC:B7的數據包進入
limit
該模塊須要使用"-m limit"選項啓用,該功能對限制網速頗有效。
#iptables -A OUTPUT -p tcp -m limit --limit 100/s -j ACCEPT 每秒包個數100之內將容許發送
#iptables -P OUTPUT REJECT 默認拒絕全部
說明:以上兩天能夠實現,當每秒包個數大於100時,拒絕全部鏈接。
應用實例
Syn-flood protection:
# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
Furtive port scanner:
# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
Ping of death:
# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
狀態匹配
該模塊須要使用"-m state"選項啓用,數據包的狀態包括:NEW,ESTABLISHED,RELATED,INVALID
NEW:建立鏈接的數據包
ESTABLISHED:經過已經建立的鏈接通道傳輸的數據包
RELATED:與已經建立的鏈接相關的數據包,如ICMP錯誤數據包
INVALID:沒法識別的數據包
#iptables -A INPUT -m state --state NEW -j DROP 拒絕進站的鏈接請求(外網沒法訪問本機)
#iptables -A INPUT -m state --state RESTABLISHED,RELATED -j ACCEPT 容許外網數據對本機的迴應信息
#iptables -P OUTPUT ACCEPT 容許訪問外網
------------------------------------------------------------------------------------------------
6. 地址轉換(NAT)
[ ]
|>>> [Internet] >>>> (www.google.com)
| [ ]
v
v
_______________________
[ eth0:202.106.22.31 ]
[ 網關 ]
[____eth1:192.168.1.1___]
|
|
v
v
[ ] >>> (PC:192.168.1.200)
[ 交換機 ] >>> (PC:192.168.1.201)
[ ] >>> (PC:192.168.1.202)
上圖中局域網(192.168.1.0/24)經過交換機與公司網關連通在一塊兒,網關與互聯網能夠實現通信。如今咱們使用iptables的SNAT功能實現內網全部主機上網。
實現步驟:
1. 開啓網關路由功能(路由器就有該功能,若是是Linux軟路由可使用:#echo "1" > /proc/sys/net/ipv4/ip_forward命令開啓)
2. 設置iptables的SNAT功能:
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 202.106.22.31
上圖中若是須要實現經過在外網任意主機經過訪問公司網關IP地址:202.106.22.31,便可訪問位於公司內部192.168.1.200上的Web服務器,咱們可使用iptables的DNAT功能實現。
實現步驟:
1. 開啓網關路由功能
2. 設置iptables的DNAT功能:
#iptables -t nat -A PREROUTING -i eth0 -d 202.106.22.31 --dport 80 -j DNAT --to-destination 192.168.1.200
7. 排除建議
1.注意過濾規則的順序,若是規則的第一條拒絕全部tcp鏈接,第二條容許192.168.1.1訪問本機的tcp鏈接,則第二條將無效。
#iptables -A INPUT -p tcp -j DROP
#iptables -A INPUT -p tcp -s 192.168.1.1 -j ACCEPT
以上兩條規則因爲第一條規則已經丟棄全部的tcp數據包,因此不會再匹配第二條規則。
2.設置完規則後未保存,致使重啓後全部規則丟失。解決方法:可使用iptables-save,或service iptables save實現永久保存
#iptables-save > /etc/sysconfig/iptables
#service iptables save
以上以CentOS爲例,兩天命令任選其一便可永久保存。
3.無效的規則及時刪除,不然影響效率。
4.匹配端口號時必須指定協議,不然會報錯。
5.公司有FTP服務器時,提早加載ftp模塊:#modprobe ip_nat_ftp