Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
1
Outline
IntroductionIP Address & MAC AddressTCP/UDP/ICMPIP Gateway, Network Mask, TTLRouting ProtocolNetwork Address Translation (NAT)Domain Name System (DNS)Dynamic Host Configuration Protocol (DHCP) / Asymmetric Digital Subscriber Line (ADSL) HyperText Transfer Protocol (HTTP) ProtocolVirtual Private Network (VPN)
2
前言
由於IPv4 之IP Address 只有32 bits為了解決IP Address 短少的問題,在RFC 1918中利用NAT (Network Address Translation網路位址轉換) 做位址轉換以便使用Private IP Address之網路設備本章介紹了NAT 之原理,並以Linux 的iptables/netfilter 機制設計一簡易的NAT
3
NAT技術簡介
傳統的標準TCP/IP通訊過程中,所有的router僅充當一個packet轉送的角色(即router為packet選擇最佳路徑,並將來源端MAC addr換成router的MAC addr)NAT(定義於RFC 1631):對Forward的Packet 進行修改
NAT 是出於某種特殊需要,而對Packet 的來源端IP位址、目的地IP位址、來源埠、目的埠進行改寫的讓在同一個(區域網路)LAN的電腦在LAN中使用一組正式的IP 位址
即NAT是在router 中進行一個更換 IP header 的動作,以便讓多台電腦能共用一個 IP 連上Internet 的技術
4
NAT技術簡介─舉例一個簡單的例子
192.168.0.1與192.168.0.3均使用61.218.155.22進出Internet,但使用不同source port
192.168.0.1GW: 192.168.0.254
192.168.0.2GW: 192.168.0.254
192.168.0.3GW: 192.168.0.254
hub
NAT or IP分享器Public IP: 61.218.155.22IP: 192.168.0.254
5
使用NAT 的優點
增加了內部網路的安全性,因NAT 利用IP偽裝的轉換過程來隱藏內部網路IP位址及網路路由資訊,形成了天然的防火牆 (即只有使用 public address 的電腦會被單位外部網路所存取, 使用private address 的電腦不會直接被存取, 有安全上的好處)解決了IPv4位址不足的問題,因為它可節省位址的使用 (由於對外只使用一個 IP address, 因此內部使用的 IP 可重覆地在不同單位使用;只要少數 public address 就能讓單位內所有電腦都連上 Internet)使用NAT 幾乎與一般應用程式無關,因為它只在TCP/IP中的第三層中運作處理
6
使用NAT 的缺點
若通訊設定資料中含有IP 位址若無適當的處理將無法使用,在Linux下有提供常用的FTP和ICMP的處理,但其他的協定並不一定有提供
以IP位址作為安全檢查的方式將不可行若於NAT內部架設Server 如WEB Server、TP Server、E-mail Server、BBS 等需藉由Port 轉送(Port Forward) 的機制,增加設定的負擔
7
Client的gateway設定為NAT主機,當要連上 Internet時,該封包就會被送到NAT主機,此時的封包 Header之source IP為192.168.1.100;透過這個NAT主機,會將client的對外連線封包的source IP(192.168.1.100)偽裝成 ppp0(假設為撥接情況)這個介面所具有的public IP,這個封包就可連上Internet!同時NAT主機並且會記憶這個連線的封包是由哪一個(192.168.1.100)client 端傳送來;由 Internet 傳送回來的封包,由NAT主機來接收,此時NAT主機會去查詢原本記錄的路由資訊,並將目標 IP由ppp0上面的public IP改回原來的192.168.1.100;最後,由NAT主機將該封包傳送給原先發送封包的 Client!
8
9
NAT分類與運作方式
m:需要被轉換的IP位址個數(Private IP或原來的IP位址)n :能夠被分配的IP位址個數(Public IP或轉換後的IP位址)
NATServer
原來的IP位址:M
轉換後的IP位址:N
10
Static NAT
在NAT Server上事先定義好一些Entry,當外部的Connection進來時,NAT Server會依事先定義好的Entry,將Connection轉到我們希望的內部IP Network機器上,這種作法即為靜態的NATPrivate IP addr個數=正式的IP addr個數Static NAT實作
假設新的IP位址為new-ip-addr 新的網路位址為new-network-addr 而原來NAT 前的IP位址為oldip-addr 則NAT 網路核心進行以下運算new-ip-addr = new-network-addr OR(old-ip-addrAND( NOT netmask ))
11
Static NAT─舉例一個簡單的例子
將網路192.168.0.0/24 所有的IP位址轉換成網路61.218.157.0/24上所有相對應的IP位址,子網路遮罩兩者皆為255.255.255.0現在要將私有的IP位址192.168.0.105轉換成正式的IP位址61.218.157.105
11000000 10101000 00000000 01101001: 192.168.0.10500000000 00000000 00000000 11111111: NOT 255.255.255.0AND Operation00000000 00000000 00000000 0110100100111101 11011010 10011101 00000000: 61.218.157.0OR Operation00111101 11011010 10011101 01101001: 61.218.157.105
(new address)
12
Dynamic NAT
主要是靠NAT Mapping Table中的Entry來做Redirect的動作,NAT Mapping Table上的這些Entry是在Private IP Network中有新的Connection對外時才動態建立,這種我們稱之為動態的NAT (Dynamic NAT)當所有public IP addr分配完畢後,任何的IP轉換要求將會被拒絕,並回傳unreachable的ICMP packet當M=N時基於安全上考量也使用動態NAT(天然防火牆)
13
Dynamic NAT─舉例一個簡單的例子
14
15
header manipulation(header 竄改)To modify the IP address, NAT has to modify the IP checksum, the TCP checksum ( cause TCP checksums cover pseudo IP header) To make multiple private hosts share one common public address, NAT has to modify the port number
16
IP 偽裝 (IP Masquerading)
只需要一個正式的IP位址就可以讓很多電腦連接到InternetLinux作業系統皆支援此功能IP masquerading是動態SNAT (source NAT)的一種(packet source addr改成界面的addr)在Linux下的Masquerading實作中,可擴充內部網路的電腦裝置,只要TCP ports夠用即可透過Masquerading上網會有一些限制,如某些UDP Based的應用程式將可能無法使用,這時候就需要配合其他的解決方法了(Port Forward 或Application Level Gateway)
17
應用層閘道式防火牆 (Application-Level Gateway)
應用層閘道器,是作用於OSI通信模組的應用層,它會針對不同的應用程式如FTP、HTTP、Telnet等來分別進行安全的稽核工作。它是利用一些專門性的程式來做網際網路上程式應用的佣介者—即閘道或代理器(Proxy)—將內部網路與外部網路區隔開來,而存儲轉發(Store-and Forward)就是它們運作的方式。
18
如圖所示,在防火牆內的客戶端實際是連接到防火牆之內的FTP伺服器,再由該伺服器以客戶端的身分去網際網路上真正的FTP伺服器上擷取檔案。
19
應用層閘道器會先將欲通過它的傳輸連接切斷,再另起爐灶地設置另一個連接,它會這個連接的過程之中獲得一些必要的資訊,並依照各個應用程式之中所設定的一些規則,來決定誰可以進出防火牆的內外、誰可以擷取那些資料。
例如組織內部的員工欲上網際網路時,要透過過防火牆內的代理伺服器,而從外界進入的交通,也可由這種形式的防火牆轉到特定的Web伺服器上。
20
IP Masquerading─舉例一個簡單的例子
Src.:192.168.0.105: 1255Dst.:120.133.4.2:80
Src.:192.168.0.200: 4666Dst.:120.133.4.7:23
NAT server
NAT table
23120.120.4.7
635424666192.168.0.200
80120.133.4.2
635411255192.168.0.105
Dst. PortDst. IP
Local NAT port
PortInternal
IP
Masquerading Table
Src.:61.218.157.162:63451Dst.:120.133.4.2:80
Src.:61.218.157.162:63452Dst.:120.133.4.7:23
21
其他的NAT技術
Source NAT (如前述)Destination NAT
主要目的是轉換目的地IP位址與Port number
NAT的應用Virtual servers (load balancing)多線廣域網路負載平衡
22
Virtual Servers(Load Balancing)
利用NAT Server當做Virtual Server,後端可連結多部Real Server,當一個連線進入時,NAT Server的負載,將下一個連線導向負載較輕的Server上如何正確的、快速的計算這些資訊,需要配合複雜的演算法公式計算與考量整體環境
舉列來說:有DNS Support for Load Balancing(RFC 1794)、Squid Cache程式等等這種架構也有其附加功用即是「備援系統」,當一台Server當機時,會自動導向另一台Server繼續運轉,不致於整個網站無法運作,結合DNS 更可達到目前市場上常見的所謂Multi-homing 的運作機制
23
Virtual Servers─舉例一個簡單的例子
NAT Rule:建立一個Virtual Server,IP位址為61.218.157.100使用兩台主機,IP位址為61.218.157.201及61.218.157.202,相對於Virtual Server而言,這些是Real Server現在有一個連線從Client到Virtual Server,將被NAT Server重新導向到其中一台Real Server主
24
Virtual server (load balancing)
ClientVirtual Server
61.218.157.100
61.218.157.201
61.218.157.202
61.218.157.203
……
Real server
25
多線廣域網路負載平衡
當內部網路某台電腦和外界連線時,僅需將Packet 送到預設的Router(在此例中指的是NAT Server),接著,NAT Server會決策要將Packet 由哪一條路徑運送,內部網路的使用者不需要知道路徑為何
這個架構的功用在於將可以共用多路ISP
內部網路 NAT Server
Dest. A
Dest. B
26
廣域網路負載平衡的意義
許多的公司開始採用Multihoming 策略,即藉由多條專線及多ISP之連線服務,改善連外網路的效能與可靠度。
多專線的意義在於更快速的網路存取服務以及更小的網路斷線時間。當某條連線或某個ISP 出問題時,可自動跳過有問題的線路,透過其他的線路來存取網路服務。
27
廣域網路負載平衡的技術分析
線路負載平衡器的核心價值在於線路的備援以及流量的分配,因此判斷線路是否斷線的機制以及流量分配的演算法是此類設備最重要的兩個功能。
目前一般最常使用的斷線偵測機制為“ ICMP 偵測法”,利用設備本身發出ICMP的封包來要求Internet上的某些網站回應,有取得回應則表示此線路正常,沒有取得回應則宣布此線路斷線。但此一偵測方式會有兩個問題:• 一是當被偵測的網站因某些因素如斷線或防火牆阻擋而無法回應ICMP 時,會造成線路誤判。
• 二是當線路壅塞時會無法順利將ICMP 封包送到被偵測網站,一樣會造成線路狀態的誤判。
另一種比較先進的線路偵測方式“ TCP 偵測法” ,這是針對Internet 上提供某種服務的伺服器偵測其服務埠號是否開啟來判斷線路是否斷線。這樣可以避免掉防火牆的阻擋干擾而造成的誤判。但是在線路壅塞時會有跟ICMP 偵測法有一樣的困擾。
28
目前看到最好的方式是“ 流量偵測法” (以上兩種偵測方式的結合),這樣可以大幅度的減少誤判的情形發生。
所謂的“ 流量偵測法” 指的是直接偵測線路上是否有對內的流量產生,有的話則表示則直接判定線路正常,因為只有線路正常時才會有對內的流量出現,否則的話再利用ICMP 或TCP 偵測法對Internet 上的偵測點要求回應來判斷線路是否正常。
29
傳統的負載平衡技術以及盲點
一般來說廣域網路負載平衡可以分為對外和對內兩種,這兩種使用的是完全不一樣的技術。
對外的負載平衡主要是利用NAT 的機制來改寫封包的IP 表頭,然後送到不同的線路去。對內的負載平衡則是利用分配不同DNS 紀錄的方式,將對內連線導引到不同的線路上去,達到對內的負載平衡的目的。
30
目前線路負載平衡設備常見的對外連線分配演算法:1. 固定指派(Fixed):選擇固定的線路,當有對外的連線產生時強制
走某一條選定的對外連線。
2. 依比重輪流指派(Round-Robin by Weight):設定每一條線路的比重,當有對外連線產生時,依照線路的比重輪流分配對外的連線。
3. 依連線數指派(By Connections):設定每一條線路的連線數比例,當有對外連線產生時,設備本身為依照預先設定好的比例來分配新的連線要走哪一條線路。
4. 依頻寬使用量(By Traffic):設備本身會自動監控每一條線路的頻寬使用狀況,然後再將新產生的對外連線導引到頻寬使用最少的線路,以取得最佳的頻寬使用效率。
5. 依應用程式(By Application):將新產生的對外連線依照不同的應用程式類別導引到不同的對外連線。
6. 依回應時間(Proximity):當新的對外連線產生時,設備會計算從每一條不同的路徑所需要的時間,然後再選擇一條時間最短的線路,使得對外連線能夠最快到達。
31
有些廠商會採用更特殊的演算法去偵測在廣域網路端的線路狀況,然後再決定流量如何分配。但因遠端的線路狀況變數太多,並不是單單的計算Hop Counts或者是Response Time所能得知,有時最少Hop counts 或者是最小的Response Time並不一定是最佳路徑,所以這些演算法在實際應用上用途並不大。
不論是哪一種演算法都有兩個共通的缺點:第一是流量分配的單位為“ Connection” 而不是“ Packet” 。第二是在進行切換線路時IP 位址會改變。
所以對於一些特殊的Application 並無法達到真正的線路負載平衡。
E.g. VPN 建立時,如果第一個connection 和第二個connection 的source IP 改變的話會造成VPN 連線失敗,所以此時只能利用“ Fixed” 的演算法將VPN 連線固定在某條線路上,以避免source IP 改變。但這樣一來也就失去了負載平衡以及線路備援的目的了。相同的情形也會發生在Video Conference 或者一些web mail 或電子商務等需要認證的服務上面。
32
Linux NAT 工具
Kernel 2.0.x時是使用ipfwadmKernel 2.1.x/2.2.x時,使用ipchainsKernel 2.3.x/2.4.s時,使用iptables,配用netfilter過濾機制
33
ipchains 概說
Red Hat Linux v6.0以上版本內含的套件,主要功能為Packet 過濾防火牆,並可利用Masquerade達到分享網路頻寛的功能會對所有經過的Packet 進行檢查,依照一系列原則(Policy)和規則(Rule),來決定Packet 的處理方式。防火牆一般都會根據Packet 的來源和目的地址、協定、Port、界面等進行判斷,決定是否讓Packet 通過或傳到那裡去
34
ipchains 概說─ Packet 進入機器的流程
我們可以為防火牆建立一些基本原則來定義好各種的鏈(Chain):輸入(Input)、輸出(Output)、轉送(Forward)、重新導向(Redirect)來決定Packet 的處理動作:接受(Accept)、拒絕(Deny)、拒絕並回應(Reject)、轉送(Forward)、偽裝(Masquerade)
checksum
DENY
Check by Device Driver
sanity
DENYDENY/REJECT
DENY/REJECT
Input Chain
Routing Decision
Forward Chain
Output Chain
Local Process DENY/REJECT
ACCEPT/ REDIRECT
35
ipchains語法
ipchains –[ADC] chain rule-specification [options]ipchains –[RI] chain rulenum rule-specification [options]ipchains –D chain rulenum [options]ipchains –[LFZNX] [chain] [options]ipchains –P chain target [options]ipchains –M [-L | -S] [options]ipchains –h [icmp] (print this help information, or ICMP list)
36
常見ipchains命令用法─指定協定種類
可使用‘-p’來指定協定種類,其中協定分為TCP、UDP、IMCP或是ALL,且能以數字代替協定(各種協定的編號在/etc/protocols中)(See. pp. 6-10~6-11)
37
常見ipchains命令用法─指定來源和目的地的IP位址
來源(-s)和目地(-d)的表示法有三種:使用完整的主機名稱 (E.g.: www.cyut.edu.tw)使用IP位址 (E.g.: 163.17.1.1)允許某範圍的IP位址 (E.g.: 140.134.4.2/24 or 140.134.4.2/255.255.255.0)#ipchains –A input –s 0/0 –j DENY(表示所有來源的IP addr會被拒絕)
38
常見ipchains命令用法─指定UDP和TCP的port
指定所有來源位址的port 80,其中80也可以用名字(’www’)來表示之E.g.: -p tcp –s 0.0.0.0/0 80若要TCP192.168.0.1的任何port,除了www port之以外E.g.: -p tcp –d 192.168.0.1 !www其中驚嘆號‘!’放置的位址也可以這樣指定E.g.: -p tcp –d ! 192.168.0.1 www也可以表示為不是192.168.0.1和www的portE.g.: -p tcp –d ! 192.168.0.1 www
39
常見ipchains命令用法─ log記錄/var/log/message
若加上“-i” 選項的話,關於ipchains的訊息會被記錄在/var/log/message檔案中,Linux系統上,Kernel預設的輸出訊息經由klogd(kernellogging daemon)所記錄
40
範例列出常見ipchains命令用法─ 列出ipchains的規則表
#ipchains –LChain input (policy ACCEPT)Chain forward (policy ACCEPT)Chain output (policy ACCEPT)
41
ipchains操作範例─ 1.啟用IP位址轉送功能
# echo “1” > /proc/sys/net/ipv4/ip_forward
42
ipchains操作範例─ 2. 關掉所有服務
基於安全的理由,我們要把所有對內、對外的窗口關閉起來,執行下列指令會將進入、輸出、轉送Packet 的預設政策(Policy) 設為拒絕(Deny),這一步最好放在最後的時候再來做,因為如果先設了所有DENY的規則,則後來設的ACCEPT規則會被先前的DENY給取代,這主要原因是ipchains的規則搜尋順序的問題
43
ipchains操作範例─ 3. 啟動私有IP位址的偽裝(Masquerade)服務
將內部私有IP位址192.168.0.0/24啟動IP Packet 轉送到外界的網路,使之可以連到外界的任何地方去
44
ipchains操作範例─ 4.改變ipchains Masquerade Timeout
系統預設是假如entry在設定的秒數後還沒有Packet 經過,就把連線中斷以節省資源(說明參數-S, --set tcp tcpfin udp )
45
ipchains操作範例─ 5.預防被別人‘ping’(Ping of Death)
頻寬消耗是網路上常見的攻擊手法,利用送出大量的Packet 來攻擊、消耗頻寬,使得對方的主機負荷過重而當機,或是使正當的Packet無法正確的傳送
46
使用一台有兩片網路卡的Linux 當成NAT 主機,對外的連線是使用ADSL Modem 接在Eth1 上,而對內則使用Eth0 連接在集線器(Hub)上,而集線器則再接上三部電腦主機分別為192.168.0.1~3
Eth1Public IP: 61.218.155.22GW: 61.218.155.254NetMask: 255.255.255.0
Eth0IP: 192.168.0.254
ADSLIP: 61.218.155.254
192.168.0.1GW: 192.168.0.254
192.168.0.3GW: 192.168.0.254
192.168.0.2GW: 192.168.0.254
47
NAT技術所衍生的問題
有些應用程式所使用的通訊協定將IP位址放在通訊協定的資料欄位中例如,網路視訊會議的SIP、H.323標準。而NAT只是將Packet 的IP Header與Port改變,並沒有改變IP Packet的Payload內容,所以NAT這時就在應用上出了問題,像是玩網路對戰遊戲、或者網路電話(Netmeeting) 都是如此ipchains會限制了來自外面的主動連線,也就是帶有SYN標籤的Packet。在這樣的情況也會發生問題,最知名的就是FTP穿透NAT Server時發生的錯誤訊息“Can’t create data connection: Connection refused.”
48
NAT技術所衍生的問題─解決方法
利用ipchains的外掛module目前有IP _ masq_ftp、IP _masq _ Cuseeme、IP_masq_irc、IP _masq_mfw、IP _masq_pptp、IP_masq_quake、IP_masq_raudio、IP _masq_user、IP _masq_vdolive、IP_masq_h323(SOFIA)等等
利用連接埠轉送(Port Forward)找出應用程式中使用了哪些port,然後將正式IP位址的某個port直接對應到內部IP位址上的某個port
49
Linux 2.4 netfilter架構圖
Pre-routing Routing Forward Post-routing
Local-IN
Local-OUT
Routing
Linux Network Protocol Stack
50
netfilter提供以下機制
傳統ipchains的任何功能(基本來源與目的Packet 過濾、導向、偽裝)提供Source NAT與Destination NAT的功能可以針對特定使用者、群組等限制網路連結的過濾存取
可以設定Packet 在Routing Table進出前先預先處理
可以針對外面自動建立與現有連線有關這類連線之過濾處理
可以針對MAC Address處理可以針對IP Header 與TCP Header 等進行分類與過濾
51
使用Linux iptables 進行NAT─ 1.通知核心載入NAT 相關模組
通知核心載入NAT 相關模組(如果是編譯為核心,如NetGuru,則不需此步驟)
52
使用Linux iptables 進行NAT─ 2.啟動IP Forward 的功能
53
使用Linux iptables 進行NAT─ 3.設定進行IP MASQUERADE 的條件
設定進行IP MASQUERADE 的條件,也就是讓192.168.0.0/24的網路使用MASQUERADE的規則