Linux下的NAT及防火牆的混合應用

【摘要】
主要講述Linux系統下的NAT(網絡地址轉換)和基於NAT的防火牆技術。
首先由Linux系統的安裝引入,着重介紹LINUX下的NAT的網絡配置(服務端和客戶端),以及防火牆配置原則。
其次,從理論上闡述,“什麼是NAT”和網絡上的攻擊方法。

【引言】
LINUX憑藉其穩定性、安全性和代碼開放在這幾年中,風靡全球;作爲一種類UNIX系統,Linux正在互聯網的各

個層面得到應用,從科學計算到銀行取款機,從網絡web服務到高層的Oracle 數據庫應用。都可以看到linux的

影子。而由於Linux遵循於GPL協議(公共軟件許可證),任何人可以得到並且修改它的源代碼,所以他的安全性

相較於其他的非開源系統來說要高的多;並且它可以從網絡中免費下載。從這2點來說他非常適合用於網絡信息

閘(軟路由或網關)和自制防火牆(事實上國內的硬件防火牆廠商都是用工業X86硬件和linux來做他們的產品,

雖然那不是真正意義上的硬件防火牆)。現在學校過於注重對windows及其windows平臺上的軟件、開發工具的

學習。但是學生們沒有意識到,真正撐起這個互聯網的正是UNIX系統;就從我對Linux的見解爲大家展示UNIX系

統的一角吧。
什麼是NAT?
NAT英文全稱是Network Address Translation,稱是網絡地址轉換,它是一個IETF標準,允許一個機構(包括多

個網絡節點)以一個地址出現在Internet上。NAT將每個局域網節點的地址轉換成一個IP地址,反之亦然。它也可

以應用到防火牆技術裏,把個別IP地址隱藏起來不被外界發現,使外界無法直接訪問內部網絡設備,同時,它還

幫助網絡可以超越地址的限制,合理地安排網絡中的公有Internet 地址和私有IP地址 的使用。
爲什麼要進行NAT
假設校園網提供園區Internet接入服務,爲了方便管理,校園網絡中心分配給園區用戶的IP地址都是僞IP

(內部ip),但是部分用戶要求建立自己的WWW服務器對外發布信息,這時候我們就可以通過NAT來提供這

種服務了。我們可以在防火牆的外部網卡上綁定多個合法IP地址或端口,然後通過NAT技術使發給其中某一

個IP地址的包轉發至內部某一用戶的WWW服務器上,然後再將該內部WWW服務器響應包僞裝成該合法IP發出的包。

實驗環境介紹
本文所有到的實驗環境如下:
LINUX系統主機一臺(服務端):雙網卡 REDHAT 9.0 主機名:host
WINDOWS 98 系統主機一臺(客戶端):單網卡     主機名:test    
聯想D-link 8口 10M/100M交換機一個

【正文】
網絡拓撲結構:


一、 RED HAT 9.0安裝和注意點
Linux是一個獨立的操作系統,所以不能在其他操作系統下進行安裝,他有自己的啓動方式,可以採用以

下兩種方法進行安裝。
● 從CD-ROM進行安裝
● 從FTP服務器進行安裝
由於Linux系統安裝(第一種方法),有隨機參考手冊,難度不大,所以我們着重介紹從ftp安裝。
在安裝之前製作啓動盤:
1. 在windows操作系統下將安裝盤放入光驅;
2. 運行 e:/dosutils/rawrite.exe(e盤爲光驅)
3. 在運行後的界面中輸入e:\images\bootnet.img
4. 指定目標盤,輸入用戶軟盤盤符:a
這樣一張安裝程序的啓動盤就建好了。
 
用軟盤引導計算機,進入藍色界面後,輸入FTP服務器地址和ftp上的用戶名及口令就可以下在安裝了。
RED HAT 9.0安裝界面爲中文,安裝中文說明基本可以完成系統定製,在此要強調的是,分區的時

候,/swap(交換分區)大小要是內存大小的2倍;既然是作NAT網關,要把/var(日誌分區)

單分出來,並且不要少於500M,有充裕的空間存儲日誌,也爲將來將來系統故障或受到攻擊做到有據可查。
二.LINUX的網絡設置和NAT原理
2.1網絡設置
我們把Linux系統安裝完後,整個設置平臺算是搭建完畢,但是還要設置網絡;設置網絡之前,或者說

讓linux上網前,應該把和這臺服務器應該起到作用的無關服務關掉。
可以在命令行下敲入setup回車,會出現一個文本菜單,裏面有“系統服務”一項,直接用空格鍵取消

服務前面的勾然後重新啓動系統就行了。
假如是UNIX的熟練用戶,可以在取消服務後,不用重新啓動,在命令行俠打入
  ps aux    

會顯示現在在後臺運行的所有服務,看到要殺死的進程後,打入
kill -9
(-9代表強制殺掉進程)殺死進程。
然後進入/etc/sysconfig/network-scripts/目錄
vi ifcfg-eth0會出現以下內容
device=eth0
onboot=yes
bootproto=none
IPADDR=192.168.0.1 #(內網網卡iP)
netmask=255.255.255.0
TYPE=ETHERNET
USERCTL=NO
PEERDNS=NO
NETWORK=192.168.0.0(網絡號)
Broadcast=192.168.0.255(廣播號)
上面的設置的意思是:eth0對內的內網網卡,ip地址爲192.168.0.1,子網掩碼爲:255.255.255.0;

vi ifcfg-eth1會出現以下內容
device=eth1
onboot=yes
bootproto=none
IPADDR=202.204.208.5 #(外網網卡iP)
netmask=255.255.255.128
TYPE=ETHERNET
USERCTL=NO
PEERDNS=NO
NETWORK=202.204.208.0(網絡號)
Broadcast=202.204.208.127(廣播號)
上面的設置的意思是:eth1是對外的外網網卡,ip地址爲202.204.208.5。
網卡的設置就完成了


加入nat客戶端ip和名稱
vi /etc/hosts
格式爲:
ip地址 主機名
127.0.0.1 host

指定內網網關
vi /etc/sysconfig/network
gateway=202.204.208.7 #(網關地址,假如服務端的外網爲撥號,就不要指定)

設置DNS服務器
vi /etc/resolv.conf
格式爲
nameserver ip地址
nameserver 202.106.196.115
都設置好後,從新啓動系統,在命令行下打入
route -a #察看路由表,看一下默認網關是否爲202.204.208.7
假如是的話,服務端的網絡配置就已經全部完成。

下面是客戶端的網絡配置
因爲是win 98系統,所以只給出配置參數,配置方法略
ip地址爲192.168.0.2
子網掩碼:255.255.255.0
域名服務器:202.106.196.115
網關:192.168.0.1
全部網絡設置完成

2.2 NAT原理
2.2.1在進入NAT設置之前,我們要先討論一下NAT的工作原理
在引言部分,我們已經提到了一個NAT應用實例,從這個實例中可以看出NAT和防火牆是一體的,換句話說,

NAT就是防火牆。NAT對防火牆來說是子集的關係。
在本節,我們會深入討論NAT的原理部分,爲了更清晰的認識NAT,我們借用INTERNET標準化組織發佈的RFC3022文

檔的部分內容。
NAT有三種類型:靜態NAT(Static NAT)、網絡地址端口轉換DNAT(destination- NAT)、動態地址

NAT(Pooled NAT)。我們主要討論前面2種NAT.
靜態nat解決問題的辦法是:在內部網絡中使用內部地址,通過NAT把內部地址翻譯成合法的IP地址

在Internet上使用,其具體的做法是把IP包內的地址域用合法的IP地址來替換。NAT設備維護一個狀態表

(路由表,所以也稱NAT爲軟路由),用來把非法的IP地址映射到合法的IP地址上去。每個包在NAT設備中

都被翻譯成正確的IP地址,發往下一級,這意味着給處理器帶來了一定的負擔。但對於一般的網絡來說,

這種負擔是微不足道的。
網絡地址端口轉換NAT,也叫做反向NAT,他解決問題的方法是:在內部網絡中,使用內部地址的計算機開設了

網絡服務(80,21等),當外部ip想訪問這些服務時,NAT網關把外部訪問ip翻譯成內部ip,也就是說,把內

部開設的服務,映射到一個合法的ip和端口上,已供外部訪問。
假如想進一步瞭解他的工作原理,NAT其實就是一種IP包欺詐,也可以說是對IP報頭的修改,請看下錶
4位版本
4位首部長度
8位服務類型
16位總長度(字節數)
16位標識
3位標誌
13位片偏移
8位生存時間(ttl)
8位協議
16位首部校驗和
32位源ip地址
32位目的ip地址
其他選項
攜帶數據
IP數據包格式和報頭中的各字段
NAT網關(外202.204.208.5;內192.168.0.1)收到本地局域網內的客戶機(192.168.0.2),發來的ip數據,

先判斷是否是本地子網中發來的,假如通過,則按照她的目的ip地址查找本地路由表進行轉發,NAT在包被繼續

向前送出之前轉換32位源地址192.168.0.1成202.204.208.5。相應的,IP包往回傳時依據相同的地址進行轉換。
2.2.2 NAT設置
我們知道了NAT的原理,就可以進行NAT的配置了,我們前面說過了NAT就是防火牆,在RED HAT 9.0下自

帶防火牆 IPTABLES
我們在做好網絡設置後,假如要實現客戶端(win98)通過服務端上網(靜態NAT),可以在命令行下直接

打入
iptables -t nat -A POSTROUTING -o eth1 -j SNAT - to 202.204.208.5
說明:
   -t nat : 調用NAT表,調用這個表說明遇到了產生新的連接的包。
   -A :該命令將一條規則附加到鏈的末尾。
  POSTROUTING:指定正當信息包打算離開防火牆時改變它們的規則。
  -o eth1:輸出接口爲eth1
  -j SNAT:跳轉,也叫觸發條件,當滿足SNAT規則是便發生跳轉
  整條語句的意思爲: 當防火牆遇到產生新的連接的包,則在他要離開防火牆時改變他的源ip爲

202.204.208.5並且從eth1出口送出。

    nat的規則指定完成後,還要打開ip轉發功能:
         echo 1 > /proc/sys/net/ipv4/ip_forward
這樣,客戶端就可以通過208.5上網了。

假如208.5的客戶端192.168.0.2開設了80端口的web服務,如何讓外部訪問到這個

局域網內部的服務呢?
這就用到了Dnat(也叫反向NAT,端口跳轉),在命令行下打入:
iptables -t nat -A PREROUTING -i
eth1 -d 202.204.208.5 -p tcp -dport 80 -j DNAT -to-destination 192.168.0.2:80

語句說明:當有通過eth1接口的tcp協議訪問202.204.208.5的80端口的時候,

則觸發跳轉,跳轉至局域網的192.168.0.2的80端口。
但是這同時也出現一個問題,在同一局域網內的機器,無法訪問202.204.208.5的80端口。以下是原因:
假設192.168.0.3不通過http://192.168.0.2:80這種方式進行瀏...蟯遊侍餑兀?/a>
在命令行下打入:
iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 -d 192.168.0.2/32 -j SNAT -to 192.168.0.1

語句解釋:當192.168.0.1-255這個範圍的ip訪問192.168.0.2這個ip的時候,當數據包離開的時候修改源ip地址

爲192.168.0.1,這相當於在局域網內部,又作了一次NAT轉換。局域網內部通過192.168.0.1作爲轉發,而不是

直接進行通信,這就避免了無法訪問局域網內部ip的情況。

目前,nat的功能就已經實現,但是並沒有對包進行過濾。

三.網絡攻擊和防火牆
3.1什麼事網絡攻擊
當混亂的Internet和你良好的、有序的Linux服務器網絡之間進行連接時,你最好能知道哪些東西可以進入

你的大門。這就需要制定包過濾策略,既然是包過濾,肯定是要過濾掉那些對網絡有害的或者是無用的包,

但哪些包是有害的呢?我們既然是在防守,不妨聽聽敵人的想法。
作爲一個老練的入侵者,他並不會盲目的展開攻擊和入侵,他首先會確定自己的目標,當然,確定目標的方

法有2種,一是根據個人的好惡或審美觀點確定目標,二是根據廣義掃描器(反饋結果簡單,但是速度很快

的掃描器)的反饋結果,選擇整體安全性不高的網絡作爲攻擊目標。
接下來要做的就是了解這個網絡服務器,就象和人交往一樣,你對那個人越瞭解,就越清楚那個人的弱點,

從而你對它的傷害就越致命。對人的瞭解通過交談,對服務器的瞭解要通過掃描;首先要確定的是這臺服務

器都開有什麼服務,這很簡單,通過tcp協議的3次握手:
1. 當請求端對要掃描的服務器端口送一個包含SYN標誌的TCP報文,這個報文指明客戶端使用的端口以及

TCP連接的初始端口。
2.服務器在接受到客戶端的SYN包問候,假如客戶端請求連接的端口存在,則返回一個SYN+ACK的報文,表

示客戶端的請求被接受。同時TCP序號被加一。那麼掃描器接受到SYN+ACK報文後,會向入侵者報告,掃描的

這個端口是打開的,從而使入侵者判斷這是什麼服務。
3. 客戶端也返回一個確認報文ACK給服務器端,同樣TCP序列號被加一,到此一個TCP連接完成。
4. 假如服務器的這個端口不存在,或者沒有返回SYN+ACK報文,則掃描端發出一個FIN標誌報文,撤銷這

個TCP連接。

當確定了服務器開設了什麼端口以後,有經驗的入侵者可以從端口判斷出這臺服務器開設的具體服務,然後

就是按照不同的服務進行漏洞攻擊或入侵了。

從以上攻擊步驟看出,不要讓服務器完全暴露在網絡中,是非常重要的,也就是首先對端口進行過濾,只允

許指定的服務通過制定的端口穿越防火牆。這也就引出了RFC2979規定的互聯網防火牆規則配置的基本準則

之一:
一切未被允許的就是禁止的。
基於該準則,防火牆應該封鎖所有的信息流,然後對希望提供的服務逐項開放。這是一種非常實用的方法,

可以造成一種十分安全的環境,因爲只有經過仔細挑選的服務才被允許實用。


3.2如何防禦網絡攻擊
從我們上例來看,我們只開設了web服務使用標準的80端口。
那我們要在防火牆中進行如下設置:
iptables -P INPUT -j DROP #我們用-P來攔截主機上所有通訊
iptables -A INPUT -p tcp -dport 80 -j ACCEPT #打開80端口的tcp協議
假如我們在將來還要還要添加適當端口,可以用上句的格式逐一添加

這樣我們就實現了對網絡服務器主機的端口過濾功能,這種方法也只是降低受到攻擊的攻擊,還要分別制

定防火牆策略。
1. 死亡之ping (ping of death)
ping,這個軟件是測試網絡間是否暢通用的,他應用於icmp協議,但並不依賴於哪個端口,由於在早期的階

段,路由器對包的最大尺寸都有限制,許多操作系統對TCP/IP棧的實現在ICMP包上都是規定64KB,並且在對

包的標題頭進行讀取之後,要根據該標題頭裏包含的信息來爲有效載荷生成緩衝區,當產生畸形的,聲稱自

己的尺寸超過ICMP上限的包也就是加載的尺寸超過64K上限時,就會出現內存分配錯誤,導致TCP/IP堆棧崩潰,

致使接受方當機。
爲了解決這個問題,我們可以在防火牆中加入以下內容
iptables -A INPUT -p icmp -icmp-type echo-request -i eth1 -j DROP
這句話的意思是,從接口eth1進入的icmp協議的請求全部丟棄。

2. SYN Flood (拒絕服務攻擊)
SYN Flood 是目前最流行的拒絕服務攻擊與分佈式拒絕服務攻擊的方式之一,這是一種利用TCP協議缺陷,

發送大量僞造的TCP連接請求,從而使得被攻擊方資源耗盡的攻擊方式。
前面已經提過TCP的三次握手,問題就出在TCP連接的三次握手中,假設一個用戶向服務器發送了SYN報文後

突然死機或掉線,那麼服務器在發出SYN+ACK應答報文後是無法收到客戶端的ACK報文的(第三次握手無法完成)

,這種情況下服務器一般會重試(再次發送SKY+ACK給客戶端)並等待一段是句丟棄這個未完成的連接,這段時

間的長度我們稱爲(SYN Timeout),一般來說這個時間是分鐘爲單位(半分鐘-2分鐘);一個用戶出現異常導致

服務器的一個線程等待1分鐘並不是什麼很大的問題,但如果有一個惡意的攻擊者大量模擬這種情況,服務器端

將爲了維護一個非常大的半連接列表而消耗非常多的資源----數以萬計的半連接,即使是簡單的保存並遍歷也

會消耗很多的CPU資源與時間,何況還要不斷對這個列表中的IP進行SYN+ACK的重試。實際上如果服務器的TCP/IP

棧不夠強大,最後的結果往往是堆棧溢出崩潰---即使服務器端的系統足夠強大,服務器端也將忙於處理攻擊者

僞造的TCP連接請求而無暇理睬合法請求(客戶端的正常請求相較於非法請求來說非常小),此時從正常連接的

角度來說,服務器失去了響應,這種情況我們稱爲服務器收到了洪水攻擊。
從防禦角度來說,可以縮短SYN-Timeout時間,由於SYN FLOOD攻擊效果取決於服務器上保持的SYN半連接數,

這個值等於SYN攻擊的頻度* SYN Timeout,所以通過縮短從接受到SYN報文到區定這個報文物校並丟棄連接的

時間,,可以降低服務器的負荷。
我們可以在用IPTABLES執行如下語句:
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

在所有的IPTABLES規則制定完後,可以用$ iptables-save > iptables-script把寫入的全部的規則寫入到文

件,然後 在 /etc/rc.d/rc.local
加入:iptables-restore iptables-script
這樣每次重新啓動系統將自動載入iptables設定好的規則。

【結論】
本設計實現了Linux服務器在局域網內的代理上網應用和網絡防火牆應用,大量使用了Linux下的防火牆iptables。

並且對tcp/ip協議作了透徹的講解,對網絡的典型攻擊方式進行了明確的闡述。證明Linux在作爲網絡網關服務器

有充分的方式,不僅系統強壯,並且配置性很強。希望給廣大喜歡網絡及網絡管理的同學提供了新的思路。

 
發佈了11 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章