ubuntu下子網組建實踐及NAT實現子網穿透
iptables是linux下功能強大的防火牆配置工具。利用它可以實現對IP包的過濾、重定向、修改等操作。本著學以致用的目的,以自己的筆記本為中心搭建了一個小的區域網來學習具體的操作,加深自己對iptables工具和linux路由系統的理解。
一、簡單介紹iptables
linux下通過 man iptables就可以看到iptalbes的使用手冊。簡單列一條以說明其命令結構。
iptables -[ACD] chain rule-specification [options]
-[ACD]指明的是要執行的操作的動作。A是新增,add;C是檢查,check,用來檢查規則是不是存在;D是刪除,delete。後面的chain就是規則。iptables在使用中還要指明要操作的規則表,iptables中支援5種表,分別是filter,nat,mangle,raw,security. 新增規則時,用-t nat來指明要操作的表,不指明時則預設是對filter表進行操作。本文就著重介紹nat表的使用。
各個表的作用如下:
filter:只對IP資料包進行過濾。過濾的意思就是,符合規則的通過,不符合的不通過,並不對包的內容做修改。filter有3條內建的規則鏈,分別是INPUT,FORWARD,OUTPUT。
nat:手冊中指明,這個表格只有在一個IP包要建立一個連線的時候才會生效。請注意這個條件,後面我會再次提到。它有3條內建的規則鏈,分別是PREROUTING,POSTROUTING,OUTPUT。既然是專門說NAT的,就要詳細說明下。
PREROUTING是一個包只要到達本機(設定NAT規則的主機,或者路由器),這個規則鏈就會被運用,以檢視來的包是否符合,也正是這個規則鏈使我們的區域網穿透成為了可能。
而POSTROUTING則是應用於將要轉發包的時候,至於這個時機到底是什麼時候,可以簡單地告訴你,也就是這個包已經匹配了本機上的路由表了,已經找到出路的時候。如果目的地是本機的包呢,這個規則不會被觸發。
OUTPUT是針對本身生成的已經被修改的資料包,將要發出去的時候而匹配的規則鏈,這個會有什麼用途呢,暫時還不知道。
mangle:只是用於特定包的修改的。不再詳細介紹。
raw:與NOTRACK一起配置免跟蹤連線。
security:用來實現網路許可權控制的規則鏈。
1、檢視NAT表中的內容
sudo iptables -t nat -vnL POSTROUTING --line-number
這條命令是用來檢視nat表中POSTROUTING的規則鏈的。引數v指明要詳細的輸出,n表明用全數字的形式顯示,L則是以列表形式列出規則鏈中的專有項。 --line-number則要輸出每個規則的序號,這個序號可以用來刪除對應規則,很實用。
注意,檢視規則鏈是需要root許可權的。我猜測之所以這樣,是因為nat表一定程度上代表了內網的結構,不應該讓所有使用者都看的到,資訊更安全。而且一般也只有管理員才需要檢視規則鏈,畢竟是防火牆是管理員的職責。
2、新增NAT
NAT有2種一種是源NAT,SNAT。一種是目的NAT,DNAT。具體可參考目的NAT和源NAT
具體的操作在後面使用時結合具體的例項進行說明。
二、區域網例項
利用一個小米路由器+一臺膝上型電腦(自帶無線網絡卡+USB無線網絡卡)+兩臺android手機。組成了一個小區域網。網路的架構如下 圖所示。
這個小區域網2層結構。最上層的小米路由實現與外網的連線。筆記本做為2級路由器,下面組建出一個子網。
這樣實現以後,兩臺手機都可以通過wifi來實現上網。通過在手機安裝模型擬終端,可以從android2 ping通android1,也可以通過android2來訪問android1上用QPython搭建的小型伺服器,qeditor4web.py指令碼執行後得到的。問題是不能通過android1訪問到android2,即同樣的服務執行在android2上時,android1上的瀏覽器訪問不到,也無法ping通android2。而這個問題正是通過NAT來解決的。
下圖是qeditor4web.py在android1上執行的效果
下圖是從android2訪問android1時效果
先說明下原因。當android1訪問android2的IP地址時,因為其IP 10.42.0.45是子網內部的私有IP,而筆記本在1級子網中的IP是192.168.31.156,所以10.42.0.45並不會被小米路由器路由到筆記本,進而也就無法向內部的android2進行路由了。解決的思路是為android1在筆記本中新增NAT規則,可以讓android1訪問筆記本IP192.168.31.156時,將目的地址轉化為對android2的訪問。這樣就能通過android1訪問到android2了。
三、NAT轉換
具體的命令是
sudo iptables -t nat -A PREROUTING -s 192.168.31.193 -j DNAT --to 10.42.0.45
說明下具體的引數含義。-t nat表明我們要操作的規則表是nat表;-A PREROUTING 表明我們要在PREROUTING規則鏈中新增一條;-s 192.168.31.193 表明我們要針對源IP 192.168.31.193實施轉換; -j DNAT 表明我們要做的目的地址修改,也就是以本機IP為目的地址的資料包會被修改為--to所指定的IP。
命令新增後 sudo iptables -t nat -vnL PREROUTING --line-number的輸出為:
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 8 480 DNAT all -- * * 192.168.31.193 0.0.0.0/0 to:10.42.0.45
此時測試已經可能以通過android1訪問到android2上的執行的小服務程式了。但是還有一個問題是,現在還是無法通過android1上的模擬終端ping通android2。這是為什麼呢?記得前面介紹nat時提到過“手冊中指明,這個表格只有在一個IP包要建立一個連線的時候才會生效“,也就是說這個連線應該是TCP連線,而ping是執行在IP層的,所以不會有連線存在,所以無法Ping通了。