實做NAT及防火牆
姓名:林宜鋒
硬體
P-100 , 32 MB RAM ,1.6GB HD.
軟體:
Mandrake 8.1 (KERNEL 2.4.9)
起因:
因為家裡有三台電腦、但是GIGA所配與的網路IP僅有一個,而且不可以重複登入。HINET可以一個帳號兩個浮動IP的登入,也就是最多可以兩台電腦同時上網。所以相對於改用到GIGA的寬頻之後,我變的相當麻煩。本來我是用SYGATE的東西來做NAT的功能,但是SYGATE來做的NAT的話,這樣一來我有一台的電腦會直接的面對外面的電腦。這樣是相當危險的,因為我之前就因為這個原因,再用網路芳鄰分享我的資源的時候,卻被外面的人侵入我的電腦。並且放入許多的病毒檔,如果我用WINDOWS做讀取的動作,直接就會自動開啟。並且寫入病毒檔。所以我決定一定要架一台防火牆阻擋別人的進入。所以我把家裡一台很舊的電腦,搭配上LINUX系統,架設了了NAT。並且利用IPTABLE慢慢的架設防火牆的功用。
電腦說明:
網際網路
NoteBookWIN2000 P-600 桌上型 WIN98 P-450

NAT
LINUX

如同上圖所示,我的電腦一共有三台而連接方式如上圖。在連接的時候,所有對外的網際網路均是透過一台NAT(Network Address Translator)的方式來管理。也就是說內部的兩台電腦,無法經過網路直接到達。
那這樣一來兩台內部的電腦要如何去連接到網際網路呢?因為我們都知道,網際網路是採取TCP/IP的方式去傳輸封包,所以不是應該每一台電腦都應該要有IP的數字才能傳輸不是嗎?所以每一台內部電腦都是需要透過NAT去做SOCKET傳送以及做IP偽裝的工作。
何謂Network Address Translation?
一般來說﹐在網路上封包從其來源(比方您家中的電腦)出去﹐然後到達目的地(比方www.kernelnotes.org)﹐會經過許許多多個不同的連接(links)﹕就我所在的澳洲來說就大約有 19 個之多。沒有任何一個連接會真的去更改您的封包﹕他們僅僅是將之傳送出去而已。
假如其中一個連接會做 NAT 的話﹐然後它們就會更改那些經它而過的封包之來源或目的地地址。誠如您能想像得到的﹐這並非系統被設計成這樣的﹐而是 NAT 所做的手腳而已。通常要做 NAT 的連線會記住它如何 mangled 封包的﹐然後當回應封包從另一方向過來的時候﹐然後就反過來 mangling 那個回應封包﹐所以所有東西都工作起來了。
為什麼我要做 NAT 呢﹖
在完美的世界裡﹐您無需這樣做啦。在目前來說﹐還是有其理由的﹕
用 modem 撥接上網
大多數的 ISP 在您連上去的時候只會給您一個單一 IP 地址。您喜歡的話﹐以任何來源地址把封包送出去都行﹐但只有回應到這個來源地址的封包才可以回到您那裡。如果您想用多台不同主機(例如家中網路)透過該連接上 internet 的話﹐那您就要 NAT 了。
這也就是今天 NAT 最常用之處﹐而在 Linux 世界最為人知的就是所謂的 `masquerading(封包偽裝術)' 了。我稱之為 SNAT﹐因為您改變了第一個封包的 source(來源) 地址的緣故。
多重伺服器
有時候﹐您會想去改變那些進入您網路的封包之路向。這最常是因為(如上述)您只有一個 IP 地址﹐但您卻想讓別人能夠連接到 `真實' IP 地址後面的主機去。如果您重寫這些內送封包的目的地址﹐這樣您就可以管理它們了。
一個常見的變動是負載分擔(load-sharing)﹐也就是在一組機器上面為封包做映對(mapping)的動作。這類型的 NAT ﹐在以前的的 Linux 版本中也就被稱為 port-forwarding 。
透明代理(Transparent Proxying)
有時候﹐您或許想要每一個經過您的 Linux 主機的封包送至主機本身的一個程式去。這就需要進行透明代理的動作了﹕一個代理就是一個位於您的網路和外部網路的程式﹐為彼此雙方負起溝通的任務。而所謂的透明﹐則是因為您的網路甚至無須知道在和一個代理對講﹐當然了﹐除非代理不再工作了吧。
Squid 可以配置成這樣的工作方式﹐這就是在過往的 Linux 版本中所謂的重導向(redirection)、或透明代理了。
什麼是防火牆
防火牆是汽車中一個部件的名稱。在汽車中,利用防火牆把乘客和引擎隔開,以便汽車引擎一旦著火,防火牆不但能保護乘客安全,而同時還能讓司機繼續控制引擎。在電腦中,防火牆是一種裝置,可使個別網路不受公共部分(整個網際網路)的影響。此後,文中將防火牆電腦稱為“防火牆”,它能同時連接受到保護的網路和網際網路兩端。但受到保護的網路無法接到網際網路,網際網路也無法接到受到保護的網路。如果要從受到保護的網路內部接到網際網路,就得telnet到防火牆,然後從防火牆聯上網際網路。最簡單的防火牆是dual homed系統(具有兩個網路聯結的系統)。如果你能相信所有你的用戶,那你只要裝設一台Linux(設定時將 IP forwarding/gatewaying 設為 OFF),並讓每人設一帳戶。他們隨後能登錄這一系統,使用telnet、FTP,閱讀電子函件和使用所有你提供的任何其他服務。根據這項設置,這一網路中唯一能與外界聯系的電腦便是這個防火牆。在這個網路中的其他電腦甚至不需要一條公用的路徑。需要再次說明︰要使上述防火牆發揮作用,就必須相信所有用戶﹗不過,我可不敢這么建議。
2.1 防火牆的缺陷
用於過濾之用的防火牆的問題是這種防火牆不讓網際網路進入你的網路。只有通過過濾防火牆才能取用功能。在有代理伺服器的情況下,用戶可登錄到防火牆,然後進入私有網路內的任何系統。此外,目前幾乎每天都有新型客戶機和伺服器上市。因此,得要有新的方法進入網路才能調用這些功能。
2.2 防火牆的種類
防火牆有兩種。
IP過濾防火牆 - 除一些網路功能外阻擋一切網路功能。
代理伺服器 - 替你進行網路聯結。
IP過濾防火牆
IP過濾防火牆在封包一層工作。它依據起點、終點、PORT和每一數據包中所含的數據包種類信息控制數據包的流動。這種防火牆非常安全,但是缺少有用的登錄記錄。它阻擋別人進入個別網路,但也不告訴你何人進入你的公共系統,或何人從內部進入網際網路。過濾防火牆是絕對性的過濾系統。即使你要讓外界的一些人進入你的私有伺服器,你也無法讓每一個人進入伺服器。 Linux從1.3.x版開始就在內核中包含了數據包過濾軟體。
代理伺服器
代理伺服器允許通過防火牆間接進入網際網路。最好的例子是先telnet系統,然後從該處再telnet另一個系統。在有代理伺服器的系統中,這項工作就完全自動。利用客戶端軟件連接代理伺服器後,代理伺服器啟動它的客戶端軟件(代理),然後傳回數據。由于代理伺服器重複所有通訊,因此能夠記錄所有進行的工作。只要配置正確,代理伺服器就絕對安全,這最它最可取之處。它阻擋任何人進入,因為沒有直接的IP通路。
防火牆的種類
1. 封包過濾器
封包過濾器的功能為取得每一個封包,經由我們所設定的規則去進行過濾,看是否允許封包的傳送或是拒絕封包,封包過濾器存在於網路階層,而且不會影響到封包中的資料。在 RedHat Linux 中有一個 ipchains的 套件(6.0以上已內含),可以經由它來做封包過濾器。
2.代理伺服器(Proxy firewalls)
代理伺服器又常被稱為應用程式閘道,允許通過防火牆間接進入網際網路。
防火牆原理說明:
我們都知道網際網路上最重要的就是保密與避免侵入,我們已經知道如果保護自己的密碼﹐和如何使用資料加密的手段來保護資料。但是如果您的電腦遭到入侵﹐密碼檔案和私有鍵值都被盜竊了﹐我們所作的努力不就白費了嗎﹖所以﹐一般的網路系統﹐都會使用“火牆(Fire Wall)”來保護自己的網路不被入侵。而一個防火牆除了做到控制每個封包的管理,並且應該做到SOCKET管理跟IP偽裝的工作。
而socks代理呢﹖就好像接線生那樣﹐僅是將您的TCP連接由裡面的接口搭至外面的接口而且。還記得在“網路概念”裡面提到的API嗎﹖socks代理其實就是代理API請求而已﹐而真正處理工作的﹐還是發出請求的主機本身。
這裡還要一提的是“IP偽裝(Masquerading)”﹐它的工作原理也非常近似socksproxy﹐不過﹐它是利用轉換封包的地址來達到目的。如果本地網路主機要將一個封包送到外面網路﹐當火牆收到這個封包的時候﹐就會啟動IP偽裝功能﹐將來源地址暫時轉換成其本身地址﹐然後等到接到回復封包之後﹐再將地址進行還原(demasquerading)。在裡面的機器根本就無需知道這個動作﹐一切都由火牆處理好了。這和Proxy一樣﹐也可以節省大量的IP地址﹐而讓使用私有IP位址的主機也能夠存取internet了。
如何安裝
1. 系統安裝部分
我們在這個系列之中我們是用Mandrake 8.1 所以以下的安裝步驟,都是以這個軟體上面的方法來提供。在裡面的所有設定就不加以詳述。只是在安裝的時候,必須選擇安裝FIREWALL的相關設定。這樣一來才會把IPTABLE的設定載入裡面,並且支援許多的MODURE設定。
可以使用LSMOD,去檢查有無以下幾個模組。
[root@kkdai kkdai]#
lsmod Module
Size Used by nls_iso8859-1
2880 1 (autoclean) isofs 18496 1 (autoclean) ipt_MASQUERADE
1600 2 (autoclean) iptable_nat
16560 2 (autoclean) [ipt_MASQUERADE ip_nat_irc
iptable_mangle
2048 0 (autoclean) (unused) iptable_filter
2048 0 (autoclean) (unused) ip_tables
11488 6 [ipt_MASQUERADE iptable_nat
iptable_mangle iptable_filter] via-rhine
11152 1 (autoclean) rtc
5600 0 (autoclean)
如果你用LSMOD的時候,發現有以下的MOD時。表示你的系統已經有載入IPTABLE了,你也就可以使用IPTABLE去做NAT及防火牆的工作。這樣一來表示我們在安裝上的準備工作已經準備完成了,再來的問題是:我們該如何設定我們的規則。
什麼是限定規則呢?
也就是針對區域網路內與外部網路的封包來往,每一個的管理規則。主要分為以下幾種
按照一系列原則(policy)和規則(rule)﹐來決定封包的處理方式。火牆一般都會根據封包的來源和目的地址、協定、port、界面等因素進行判斷﹐決定是否讓封包通過﹐和要傳去那裡。
我們可以為火牆建立一些基本原則來定義好各種的鏈(chain)﹕傳入(input)、傳出(output)、轉遞(forward)、重導(redirect)、等﹐來決定封包的處理動作﹕接受(accept)、拒絕(deny)、反彈(reject)、轉遞(forward)、偽裝(masquerade)、等。在此基礎上﹐然後再配合實際情形設定更多規則加以限制。
2. 開始管理自己的網路主機
首先我們要開始
規劃一下,我們的網路電腦的一些IP位址。首先如果我們只要做到IP偽裝的話。我們需要先設定一個為NAT,當然就是我們的主機阿
|
|
主機作用 |
IP |
系統 |
|
P-100 32MB |
NAT、防火牆 |
192.168.1.222 |
Mandrake Linux 8.1 |
|
P-450 256 MB |
一般用途 |
192.168.1.1 |
Windows 98 |
|
P-600 256 MB |
手提電腦 |
192.168.1.2 |
Windows 2000 |
瞭解我的電腦的規則之後,開始就是設定NAT的功能,如果我們只是要啟動IP偽裝的功能的話其實只要設定以下幾個工作就可以了。
[root@kkdai kkdai]#
echo "1" > /proc/sys/net/ipv4/ip_forward [root@kkdai kkdai]#modprobe
ip_nat_ftp [root@kkdai kkdai]#modprobe
ip_nat_irc [root@kkdai kkdai]#modprobe
ip_conntrack [root@kkdai kkdai]#modprobe
ip_conntrack_ftp [root@kkdai kkdai]#modprobe
ip_conntrack_irc [root@kkdai kkdai]#iptables
-t nat -A POSTROUTING -o ppp0
--source 192.168.0.1/32 -j MASQUERADE [root@kkdai kkdai]#iptables
-t nat -A POSTROUTING -o ppp0
--source 192.168.0.2/32 -j MASQUERADE [root@kkdai kkdai]#iptables
-A OUTPUT -t nat -p all -d 61.xx.1xx.1xx -j DNAT --to 192.168.1.254
以下開始解釋為何要這樣去管理主機
echo "1" > /proc/sys/net/ipv4/ip_forward
啟動IP轉送的功能這個主要是要讓你的NAT功能能啟動
modprobe ip_nat_ftp
載入這個MODURE 讓你可以用內部主機連接到FTP,不用特過PASSTIVE的方式去連接。
modprobe ip_nat_irc
載入連接到IRC的MODURE
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
可以上都是讓你可以連上FTP用的
ptables -t nat -A POSTROUTING -o ppp0 --source 192.168.0.1/32 -j MASQUERADE
I ptables -t nat -A POSTROUTING -o ppp0 --source 192.168.0.2/32 -j MASQUERADE
以上兩行為設定內部網路透過NAT 採用IP偽裝的方式,注意對外網路由於我是用ADSL所以是透過PPP0。
I ptables -A OUTPUT -t nat -p all -d 61.70.1xx.1xx -j DNAT --to 192.168.1.254
這個是設定好將每個內部網路送出去的封包都加上IP值,並且讓內部的電腦知道網路上電腦的位置,以後我內部網路也可以透過網際網路去尋找這一台NAT在網路上的位置。也就是說你可以從內部的電腦去TELNET 網路上的這台NAT 而不會找不到這台電腦的資訊。
光是上面的設定一般的網際網路服務與NAT就已經架設而成了,這邊還是有幾個問題會有的。第一個你可能無法用WINDOWS上面的NETMEETING的功能,因為你還沒使用H323的設定。這個在這版的KERNEL中還未支援,你必須要下載更新你的KERNEL才會獲得這些的功能,新版的KERNEL在NAT的功能之源上更加強勁。更多元,更是多樣化。使的NAT的之源上可以讓在內部的網際網路完整的使用到外面的資源,但是又不會有安全上的顧慮。
DMZ的定義與設定
DMZ 非武裝區域,也就是如果你要把你的一些網路服務公開在某些主機上面,也就是說讓外面的主機可以直接的存取你的主機:比如說WEB SERVICE、TELNET、BBS、FTP某些PORT。如果要可以開放TELNET 設定如下telnet 61.70.1xx.1xx 25 的確是可以 work,不過內部 192.168.1.x 的電腦若是 telnet 210.1.1.1 25 就不行.那補上下面的敘述:
iptables -A OUTPUT -t nat -p tcp -d 61.70.1xx.1xx --dport 25 -j DNAT --to 192.168.1.1:25
上面說的是單一 port 重導.. 若是需要的功能是全部 port 都重導的話,比方就是使用:
iptables -A PREROUTING -t nat -p tcp -d 61.70.1xx.1xx -j DNAT --to 192.168.1.1
然後再依您開放的 service 來轉向,或是您也可以只用一個 ip ,再依不同的 service 轉給不同的 server如 web 轉給 192.168.1.2
iptables -A PREROUTING -t nat -p tcp -d 61.70.1xx.1xx --dport 80 -j DNAT --to 192.168.1.2:80
再把 mail server 轉給 192.168.1.3
iptables -A PREROUTING -t nat -p tcp -d 61.70.1xx.1xx --dport 25 -j DNAT --to 192.168.1.2:25
iptables -A PREROUTING -t nat -p tcp -d 61.70.1xx.1xx --dport 110 -j DNAT --to 192.168.1.2:110
以上的這些東西可以把一些常用到PORT轉移到期他的主機身上(也就是我們所說的DMZ)這樣一來我們可以把這些主機分工,並且分擔掉風險避免一台主機當機全部的網路服務都因此而斷掉。