現在,因為使用線纜和DSL的Internet連線速度已經超過了T1(傳輸速率可達1.544Mb/s的通訊線路),所以這兩種串連方式已經在商業領域得到了廣泛的應用。對於DSL和線纜串連來說,使用Linux來做路由器,是一個非常經濟的解決方案。特別是和一些高端商家(比如Cisco)的解決方案相比,這種優勢尤為明顯。
使用Linux路由器作為一個現有的、已經成熟的網路的一個部分,將會有一個比較特殊的問題。如果我們使用Linux伺服器作為DSL或者線纜串連的NAT(網路位址轉譯)伺服器,那麼我們將可通過Linux路由器對外提供服務。但是,對於大多數已經成熟的商業網路基礎構架,這種方式卻不一定實用,也不一定可行。比如,如果你的公司在現有的內部HTTP和SMTP服務上已經投入了可觀的資金,或者在一個HTTP伺服器上使用了Server Load Balancer以支援電腦商務交易,那麼你的公司將不太可能把這些服務移植到Linux伺服器上。但是,如果公司想尋找一種經濟的途徑來同時控制一些Internet服務,那麼基於Linux的路由器將是一個很好的選擇。
NAT的使用
讓我們來看一看公司的DSL/線纜串連只有一個IP地址的情況。我們如何才能把這個只有一個IP地址的流入資料包映射到內部主機呢?事實上,Linux已經把這一功能內建到了自己的核心中,所以我們只需幾個免費的軟體工具就可以來管理這個功能。
在資料包流出內部網時,我們使用一個叫做IP偽裝的功能來提供NAT解決辦法,它可以讓眾多的內部網主機共用一個IP地址。而對於外部串連來說,似乎所有的得到的資訊都來自同一個IP地址。在Linux裡,具有NAT功能的組件是一個比較容易搞混的功能,它可以在連接埠層級執行入站資料包的翻譯(有進也叫反向NAT或者解除偽裝)。Linux路由器會監聽連接埠80(HTTP服務使用的預設連接埠)的所有串連請求,並且當檢測到一個串連請求時,它會自動地把資料包轉寄到內部網對應的主機上。
事實上,之所以我們對反向NAT功能不太瞭解,是因為在主流的Linux發行版本中,一般沒有包括對該功能的組態工具。一個最一般的,也是用得最廣泛的用於管理這一功能的應用程式是“ipmasqadm”。要檢查你是否安裝了這一應用程式,你可以以系統管理員的身份登入,並在shell提示符下輸入“ipmasqadm”,如果得到“Command not found”的錯誤資訊,那麼你可以從網上下載最新的RPM安裝包(比如:rpmfind.net就有)。
典型的網路設定
描述的是一個線纜串連中使用Linux作為路由器的典型的網路結構圖。其中一個網路連接埠(eth0)為線纜數據機提供了物理串連,另外一個連接埠(eth1)把路由器串連到LAN。此外,我們還可以使用第三個網路連接埠eth2,雖然這不是必需的,但是使用它來提供一個獨立的DMZ (demilitarized zone,即非軍事區)。DMZ是放置公用資訊的最佳位置,這樣使用者、潛在使用者和外部存取者都可以直接獲得他們所需的關於公司的一些資訊,而不用通過內網。你公司中的機密的和私人的資訊可以安全地存放在內網中,即DMZ的後面。DMZ伺服器上的破壞最多隻可能造成在你恢複伺服器時的一段中斷服務。這樣通過使用獨立的NIC(網卡)把伺服器隔離,我們就把他們所有的活動和企業區域網路其它的部分分開。一般來說,我們使用DMZ來提供更好的防火牆保護,但是不管有無DMZ,在Linux伺服器上的連接埠轉寄都不會受到影響。
圖1 典型的網路結構圖
連接埠轉寄的配置
連接埠轉寄的功能很簡單:與Sendmail、Apache響應SMTP和HTTP資訊不同,我們使用“ipmasqadm portfw”來轉寄所有的資訊。
在啟用連接埠轉寄之前,要確保所有相關的核心都已載入。和連接埠轉寄服務相關的有三個模組,具體命令是(以root身分執行):
# insmod ip_masq_autofw.o
# insmod ip_masq_portfw.o
# insmod ip_masq_mfw.o
一旦運行了這些命令,Linux路由器就開始準備處理連接埠轉寄請求。來看下面的指令:
# ipmasqadm portfw -f
其中-f選項告訴Linux路由器重新整理連接埠轉寄規則表。執行這個命令不是必需的,只不過如果當前的表有多餘或者錯誤條目時,這是一個好辦法。
接下來的一系列命令將建立起Linux路由器轉寄資訊的規則。文法如下所示:
# ipmasqadm portfw -a -P PROTO -L LADDR LPORT -R RADDR RPORT [-p PREF]
其中-a參數指示這條規則應該被加入規則表中;-P PROTO參數告訴Linux路由器轉寄到哪一個IP地址(該選項只對TCP和UDP有效);-L參數指示要監控的IP地址和連接埠(預設的IP地址和Internet網卡連接埠);-R參數告訴路由器把資料包送到哪兒(IP地址和連接埠)。
在上述例子中,要路由流入的SMTP和HTTP的資訊,我們使用如下指令:
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 25 -R 192.168.1.1 25
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.2 80
第一行設定一個規則,告訴Linux路由器監聽對IP地址為172.16.1.1,連接埠為25的串連請求。並且把這些請求路由到內部網中IP地址為192.168.1.1的電子郵件伺服器的25連接埠上。同樣,第二條規則告訴路由器監聽連接埠80的串連請求,並將其路由到IP地址為192.168.1.2的HTTP伺服器的連接埠80上。
好了,現在所有在連接埠25和80的串連請求,都會被自動地轉寄到應的內部網主機上了。並且,任何時候,我們都可以使用“ipmasqadm portfw -l”命令來查看正在起作用的連接埠轉寄規則:
prot localaddr rediraddr lport rport pcnt pref
TCP 172.16.1.1 192.168.1.2 80 80 10 10
TCP 172.16.1.1 192.168.1.1 25 25 10 10
-n標記告訴命令不要執行DNS尋找IP地址,並且只列印出所指定數量的IP地址。
非預設連接埠的串連
當然,我們也可以使用Linux的連接埠轉寄能力來轉寄非預設的連接埠到預設的連接埠,反之亦然。比如下例:
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 11011 -R 192.168.1.1 110
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.2 25044
以上所示的第一行告訴Linux路由器把連接埠11011的串連請求,轉寄到內部主機192.168.1.1的連接埠110(POP3連接埠)。如果內部主機是一個POP3伺服器,那麼這個命令將可以讓遠端使用者使用非預設的連接埠串連到他們的POP3信箱。這可以阻止一些網路駭客試圖使用公用連接埠入侵POP郵件系統。
以上所示的第二行把Linux路由器上HTTP伺服器標準連接埠80上的請求轉寄到非標準連接埠25044上。這種情況主要是用於已經在預設連接埠上運行了Web伺服器,但是又想讓其能夠響應其它非預設的連接埠。
Server Load Balancer
如果公司有一個高層的電子商務網站,而同時又運行著一些Web伺服器,那麼就可以使用ipmasqadm portfw的 -p PREF參數來實現在這些伺服器中的Server Load Balancer。
-p的值雖然被稱為喜好設定,事實上它實現的是一個計數器的功能。一旦Linux路由器建立起了規則所指定的相應數目的串連,它就會跳到下一個入口。
比如,現在我們來建立如下所示的連接埠轉寄規則:
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.2 80 -p 5
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.3 80 -p 25
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.4 80 -p 10
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.5 80 -p 30
上面的指令說明,首先和Linux路由器串連的5個請求,將被送到IP地址為192.18.1.2的HTTP伺服器;接下去的25個串連將被送到地址為192.168.1.3的HTTP伺服器;接下去的10個串連送到192.168.1.4;下30個串連送到192.168.1.5。一旦30個串連都被送到192.168.1.5以後,整個過程重新開始。
這個轉寄順序的規則說明192.168.1.3 和192.168.1.5兩個伺服器處理串連的能力要強於192.168.1.2 和192.168.1.4。通過監測這些機器的伺服器負載,網路系統管理員就可以調整伺服器的映射參數,以使整個網站保持最佳的回應時間。
總結
在Linux裡,連接埠轉寄是一個強大的功能,但是相關的文檔較少。不過通過以上的學習,我們發現,其實這個功能並不難實現。現在,你不僅可以把所有流入的Internet資訊轉寄到內部網中的對應主機上了,而且還可以使你的整個網路在資訊流入和流出時共用一個IP地址,這將可以大增強內部網路的安全性。
文章錄入:csh 責任編輯:csh