用Linux將區域網帶入Internet(轉)

ba發表於2007-08-12
用Linux將區域網帶入Internet(轉)[@more@]一、概述

通常我們所遇到的問題是這樣的:一個使用私有IP的區域網,一臺聯入Internet的機器,然後要你透過一定的手段將整個區域網聯入Internet。其實,該方案的實現手段很多,比如在Windows下,你可以用諸如wingate、winroute以及MS Proxy等等代理軟體實現,但是本文所論述的是怎樣在linux下不花一分錢就解決問題。本文將從最基本的接入方法開始,一步步的教你實現將使用私有IP的區域網帶入Internet的方法。

二、接入方法:

常用的接入方法有撥號上網和專線上網。通常,個人使用者使用撥號上網方式,而單位使用者則使用專線上網方式。並且,撥號方式可以分為PSTN和ISDN撥號,專線則可以分為ISDN專線和DDN專線。
ISDN撥號方式一般用外接TA介面卡,相當於模擬MODEM,Linux下的使用方法與外接MODEM一樣,內建的一般叫ISDN PC卡,Linux下一般較難配置,單位使用者也最好不買內建的,普通MODEM外接的也比內建的好。所以外接TA撥號上網可以歸入外接MODEM一樣,確實是一摸一樣。其實ISDN撥號方式就是數字式的MODEM,專線方式就是在路由器內部自己撥號,透過撥號聯接建立起來的類DDN方式。
ISDN的專線方式必須使用ISDN路由器,專線方式128K電信部門一般給8個合法的IP地址,ISDN路由器撥號是在路由器中進行的,另外ISDN路由器一般還帶4個網口,本身整合了PPP Server的功能,又相當於一臺撥號伺服器,ISDN專線方式還支援回撥功能,由局方向使用者撥號,建立聯接,聯接建立之後就相當於DDN了,Linux不涉及撥號,線路聯接設定等,就是路由器提供靜態IP。其實ISDN撥號方式就是數字式的MODEM,專線方式就是在路由器內部自己撥號,透過撥號聯接建立起來的類DDN方式。
DDN即數字資料網,DDN的專線方式通常是這樣實現的,路由器的廣域網口用V.35連線到基帶Medom,再由基帶Medom連線到DDN線路。
PSTN也就是我們通常所說的公用電話網。使用電話撥號上網也是目前個人使用者最常用的上網方式。但是在linux下要實現電話撥號上網並不是一件輕鬆的事,因為雖然在linux下的撥號工具很多,但是好多都得進行復雜的配置。在這裡,我們向讀者介紹一種最具智慧化的撥號工具--wvdial,並用wvdial和ppp實現輕鬆上網。
wvdial是linux下的智慧化撥號工具,利用wvdial和ppp可以實現linux下的輕鬆上網。在整個過程中wvdial的作用是撥號並等待提示,並根據提示輸入相應的使用者名稱和密碼等認證資訊;ppp的作用是與撥入方協商傳輸資料的方法並維持該連線。

1.wvdial及其相關配置

wvdial的功能很強大,會試探著去猜測如何撥號及登入到伺服器,同時它還會對常見的錯誤智慧的進行處理,不象chat一樣,要求你去寫登入指令碼。wvdial只有一個配置檔案 /etc/wvdial.conf。wvdial的啟動過程是這樣的:首先載入wvdial.conf配置檔案,然後再初始化modem並撥號,撥號後等待撥入方的響應,收到撥入方響應後則啟動pppd。

可以用wvdialconf程式自動生成wvdial.conf配置檔案,自行該程式的格式為:
wvdialconf /etc/wvdial.conf
在執行該程式的過程中,程式會自動檢測你的modem的相關配置,包括可用的裝置檔名,modem的波特率,初始化字元等等相關的撥號資訊,並根據這些資訊自動生成wvdial.conf配置檔案。如果/etc/wvdial.conf檔案已經存在時,再次執行該命令只會改變其中的 Modem、Band、Init等選項。

wvdial的執行格式為:
wvdial --help | --version | section
相關的說明如下:
--help:顯示簡單的幫助資訊
--version:顯示wvdial的版本號
section:這裡的section有點象windows裡的ini檔案,一個wvdial.conf配置檔案可以有好多個section,每一個section由一些變數組成,即由 變數=值 的語句組成,如上所示。使用wvdialconf自動生成配置檔案時將會自動生成一些常用的變數說明如下:

Inherits=InheritedSection:
使用wvdialconf自動生成配置檔案時將會自動生成[Dialer Defaults],除此之外,你還 可以自定義你自己的section。程式執行時,首先載入[Dialer Defaults],然後再用指 定的section的相應選項覆蓋[Dialer Defaults]的相應選項。比如,我們在 wvdial.conf中還有[Dialer Tom],假如我們執行wvdail Tom,則系統將先讀入[Dialer Defaults],然後再用[Dialer Tom]覆蓋[Dialer Defaults]的相應選項。如果除了以上 的section之外還有[Dialer 169]並且內容如下:
[Dialer Tom]
Username=tom
Password=xxx
Inherits=169
[Dialer 169]
Phone=169
如果這時候我們執行wvdial Tom則系統將先讀入[Dialer Defaults],然後再用[Dialer Tom]覆蓋[Dialer Defaults]的相應選項,最後再用[Dialer 169]的相應選項來覆蓋前二者的相應選項。由此可見,利用wvdial,我們可以很方便地在不同的ISP或modem之間來回移動(假如你有幾個ISP或medom的話)。

Medom=/dev/ttySx:用於指定是用的medom,預設的為/dev/medom。當然,在這裡我們的medom是由wvdialconf自動檢測並配置的,所以我們可以忽略該變數。
Dial Prefix=x: 假如你正在使用分機,撥外線需撥9時,可設該值為9。
Username=xxxx:登入時的使用者名稱
Passwd=xxxxxx:登入密碼
Phone=xxxxx: 所撥的號碼
PPPP Path=:設定pppd所在的路徑,預設為/usr/sbin/pppd
New PPPD= 1 or 0: pppd 2.3.0及其以上版本需要/etc/ppp/peers/wvdial檔案,如果你的pppd是2.3.0以上版本請設為1.
Auto Reconnect=on :斷線時是否自動重新連線,預設設為是。
以上只是wvdial.conf中的常用選項,具體情參考wvdial手冊。

2.pppd及其相關配置

pppd的配置選項相對要複雜得多,你可以用命令列的形式引用有關的選項,也可以把要引用的選項寫到/etc/ppp/options中進行引用。
下面的示例檔案包含了最常用的選項及其相關的說明:
# /etc/ppp/options
# 如果指定了"noipdefault" 選項, pppd將使用撥入方提供的ip地址
noipdefault
# 選定該選項, pppd 將接受撥入方自己的ip地址
ipcp-accept-remote
# 設定預設閘道器
defaultroute
# 在傳輸資料包之前,讓撥入方先自我認證,注意一般的ISP(如169、163)都不包含該機制,故應選中noauth
noauth
# 如果連線空閒了n秒後自動斷線
idle n
以上只是options中的常用選項,具體情參考pppd手冊。

三、實現手段

1.原理

從原理上,我們可以將實現的手段分為兩種。其一是透過IP欺騙,也就是透過網路地址轉換(NAT)來實現;其二是透過代理軟體來實現,而透過代理的方法又可以分為傳統代理方法和透明代理方法。

1.1 IP欺騙的工作原理:
IP欺騙技術已經出現好幾年了,現在linux下的IP欺騙技術已經很成熟了。
可以這樣說:IP欺騙技術已經支援大多數的常用協議。那麼IP欺騙是怎樣工作的呢,原理很簡單:客戶機將進行IP欺騙的linux機器設定為預設閘道器,當進行IP欺騙的linux機器收到客戶機的請求包時,它對其進行改寫,將源地址替換為自己的合法IP地址,將源埠換成一個新的埠號,並且對該過程進行記錄;當收到Internet主機的響應包時,如果其埠號正是先前所指定的埠號則再對該包進行改寫,將其目的IP及目的埠號替換為原來記錄的客戶機IP和埠號,然後再傳送給客戶機。

1.2 代理的工作原理:
在TCP/IP網路中,傳統的通訊過程是這樣的:客戶端向伺服器請求資料,伺服器響應該請求,將資料傳送給客戶端。在引入了代理伺服器以後,這一過程變成了這樣:客戶端向伺服器發起請求,該請求被送到代理伺服器;代理伺服器分析該請求,先檢視自己快取中是否有請求資料,如果有就直接傳送給客戶端,如果沒有就代替客戶端向該伺服器發出請求。伺服器響應以後,代理伺服器將響應的資料傳送給客戶端,同時在自己的快取中保留一份該資料的複製。這樣,再有客戶端請求相同的資料時,代理伺服器就可以直接將資料傳送給客戶端,而不需要再向該伺服器發起請求。

2. IP欺騙的實現

在核心版本2.2.x以上的linux中,我們可以透過ipchains來實現IP欺騙。
2.1配置系統核心
確定你的核心已經配置了支援IP欺騙的相關特性,如果沒有,請你重新編譯核心。一般在RedHat6.x以上,系統已經預設配置了這些特性。

2.2 裝載所需模組
你可以在系統啟動時裝載所需模組。可以在/etc/rc.d/rc.local檔案中新增下列語句來在系統啟動時自動裝載所需模組。
/sbin/depmod -a
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_raudio
/sbin/modprobe ip_masq_irc
/sbin/modprobe ip_masq_cuseeme
/sbin/modprobe ip_masq_vdolive
等等。
2.3 啟用IP轉發
在2.2.x以上的版本中,IP轉發預設是禁止的,你可以透過以下語句來啟用IP轉發。
echo "1" > /proc/sys/net/ipv4/ip_forwarding
如果你用的是Redhat的發行版本, 你也可以將/etc/sysconfig/network檔案中的
FORWARD_IPV4=false改為FORWARD_IPV4=true來啟用IP轉發。然後重新啟動系統。
2.4 配置客戶端
步驟一、將客戶機的預設閘道器設定為進行IP欺騙的機器的區域網口的IP;
步驟二、設定客戶機的DNS伺服器為你真實的DNS伺服器;
步驟三、設定瀏覽器為直接與Internet相連;

2.5 設定ipchains規則
關於ipchains的詳細語法,你可以參考IPCHAINS-HOWTO文件。這裡我們只給出具體的應用。
假設你的區域網IP為192.168.1.*,eth1為區域網口,eth0為廣域網口,則你可以設定如下的ipchains規則來實現IP欺騙:

#!/usr/bin
/sbin/ipchians -A forward -s 192.168.1.0/24 -d 0/0 -i eth0 -j MASQ

如果你使用撥號方式並且你的關於網口為ppp0,則相應的配置為:
#!/usr/bin
/sbin/ipchians -A forward -s 192.168.1.0/24 -d 0/0 -i ppp0 -j MASQ

3. 傳統代理的實現

3.1 安裝軟體
我們以目前最新的穩定版本squid-2.3.STABLEX為例。
rpm包的安裝
1.進入/mnt/cdrom/RedHat/RPMS
2.執行rpm -ivh squid-2.2.STABLE4-8.i386.rpm。
當然,我們也可以在開始安裝系統的過程中安裝該軟體。

3. 原始碼包的安裝
1.從下載squid-2.3.STABLE2-src.tar.gz。
2.將該檔案複製到/usr/local目錄。
3.解開該檔案 tar xvzf squid-2.3.STABLE2-src.tar.gz。
4.解開後,在/usr/local生成一個新的目錄squid-2.3.STABLE2,為了方便用mv命令將 該目錄重新命名為squid mv squid-2.3.STABLE2 squid;
5.進入squid cd squid
6.執行./configure 可以用./confgure --prefix=/directory/you/want指定安裝目錄
系統預設安裝目錄為/usr/local/squid。
7.執行 make all
8.執行 make install
9.安裝結束後,squid的可執行檔案在安裝目錄的bin子目錄下,配置檔案在etc子目錄下。

3.2 配置squid
由於RedHat各方面的優勢(包括易用性,穩定性等等),全世界範圍內使用該發行版的使用者比較多,所以,我們下面的說明都是以RedHat6.1環境下squid-2.2.STABLE4-8版本為主。從我的使用經驗看來,該版本的squid要比其他版本穩定的多,以前的1.1.22版本也比較穩定,但是在功能及靈活性方面有所欠缺。
squid有一個主要的配置檔案squid.conf,在RedHat環境下所有squid的配置檔案位於/etc/squid子目錄下。

1.常用的配置選項
因為預設的配置檔案有問題,所以我們必須首先修改該配置檔案的有關內容,以便讓squid跑起來。
下面我們來看一看一些常用的選項:
1.http_port
說明:定義squid監聽HTTP客戶連線請求的埠。預設是3128,如果使用HTTPD加速模式 則為80。你可以指定多個埠,但是所有指定的埠都必須在一條命令列上。

2.cache_mem (bytes)
說明:該選項用於指定squid可以使用的記憶體的理想值。這部分記憶體被用來儲存以下物件 :
In-Transit objects (傳入的物件)
Hot Objects (熱物件,即使用者常訪問的物件)
Negative-Cached objects (消極儲存的物件)
需要注意的是,這並沒有指明squid所使用的記憶體一定不能超過該值,其實,該選項只 定義了squid所使用的記憶體的一個方面,squid還在其他方面使用記憶體。所以squid實際 使用的記憶體可能超過該值。預設值為8MB。

3.cache_dir Directory-Name Mbytes Level-1 Level2
說明:指定squid用來儲存物件的交換空間的大小及其目錄結構。可以用多個cache_dir命令來定義多個這樣的交換空間,並且這些交換空間可以分佈不同的磁碟分割槽。"directory "指明瞭該交換空間的頂級目錄。如果你想用整個磁碟來作為交換空間,那麼你可以將該目錄作為裝載點將整個磁碟mount上去。預設值為/var/spool/squid。"Mbytes"定義了可用的空間總量。需要注意的是,squid程式必須擁有對該目錄的讀寫權力。"Level-1"是可以在該頂級目錄下建立的第一級子目錄的數目,預設值為16。同理,"Level-2"是可以建立的第二級子目錄的數目,預設值為256。為什麼要定義這麼多子目錄呢?這是因為如果子目錄太少,則儲存在一個子目錄下的檔案數目將大大增加,這也會導致系統尋找某一個檔案的時間大大增加,從而使系統的整體效能急劇降低。所以,為了減少每個目錄下的檔案數量,我們必須增加所使用的目錄的數量。如果僅僅使用一級子目錄則頂級目錄下的子目錄數目太大了,所以我們使用兩級子目錄結構。
那麼,怎麼來確定你的系統所需要的子目錄數目呢?我們可以用下面的公式來估算。
已知量:
DS = 可用交換空間總量(單位KB)/ 交換空間數目
OS = 平均每個物件的大小= 20k
NO = 平均每個二級子目錄所儲存的物件數目 = 256

未知量:
L1 = 一級子目錄的數量
L2 = 二級子目錄的數量

計算公式:
L1 x L2 = DS / OS / NO
注意這是個不定方程,可以有多個解。

4.acl

說明:定義訪問控制列表。
定義語法為:
acl aclname acltype string1 ...
acl aclname acltype "file" ...
當使用檔案時,該檔案的格式為每行包含一個條目。
acltype 可以是 src dst srcdomain dstdomain url_pattern urlpath_pattern time port proto method browser user 中的一種。
分別說明如下:
src 指明源地址。可以用以下的方法指定:
acl aclname src ip-address/netmask ... (客戶ip地址)
acl aclname src addr1-addr2/netmask ... (地址範圍)
dst 指明目標地址。語法為:
acl aclname dst ip-address/netmask ... (即客戶請求的伺服器的ip地址)
srcdomain 指明客戶所屬的域。語法為:
acl aclname srcdomain foo.com ... squid將根據客戶ip反向查詢DNS。
dstdomain 指明請求伺服器所屬的域。語法為:
acl aclname dstdomain foo.com ... 由客戶請求的URL決定。
注意,如果使用者使用伺服器ip而非完整的域名時,squid將進行反向的DNS解析來確 定其完整域名,如果失敗就記錄為"none"。
time 指明訪問時間。語法如下:
acl aclname time [day-abbrevs] [h1:m1-h2:m2][hh:mm-hh:mm]
day-abbrevs:
S - Sunday
M - Monday
T - Tuesday
W - Wednesday
H - Thursday
F - Friday
A - Saturday
h1:m1 必須小於 h2:m2,表達示為[hh:mm-hh:mm]。
port 指定訪問埠。可以指定多個埠,比如:
acl aclname port 80 70 21 ...
acl aclname port 0-1024 ... (指定一個埠範圍)
proto 指定使用協議。可以指定多個協議:
acl aclname proto HTTP FTP ...
method 指定請求方法。比如:
acl aclname method GET POST ...

5.http_access

說明:根據訪問控制列表允許或禁止某一類使用者訪問。
如果某個訪問沒有相符合的專案,則預設為應用最後一條專案的"非"。比如最後一條為允許,則預設就是禁止。所以,通常應該把最後的條目設為"deny all" 或 "allow all" 來避免安全性隱患。

3.3啟動、停止squid。
配置並儲存好squid.conf後,可以用以下命令啟動squid。
squid
或者,使用RedHat的啟動指令碼來啟動squid.
/etc/rc.d/init.d/squid start
同樣地,你也可以用下列指令碼停止執行squid或重啟動squid.
/etc/rc.d/init.d/squid stop
/etc/rc.d/init.d/squid restart


4. 透明代理
關於透明代理的概念我們已經在第一節將過了,下面我們看一下怎麼樣在squid中實現透明代理。
透明代理的實現需要在Linux 2.0.29以上,但是Linux 2.0.30並不支援該功能,好在我們現在使用的通常是2.2.X以上的版本,所以不必擔心這個問題。下面我們就用ipchains+squid來實現透明代理。在開始之前需要說明的是,目前我們只能實現支援HTTP的透明代理,但是也不必太擔心,因為我們之所以使用代理,目的是利用squid的快取來提高Web的訪問速度,至於提供內部非法ip地址的訪問及提高網路安全性,我們可以用ipchains來解決。
實現環境:RedHat6.x+squid2.2.x+ipchains
4.1 linux的相關配置
確定你的核心已經配置了支援透明代理解的相關特性,如果沒有,請你重新編譯核心。一般在RedHat6.x以上,系統已經預設配置了這些特性。
4.2squid的相關配置選項
設定squid.conf中的相關選項,如下所示:
http_port 3218
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
說明:
1.http_port 3128
在本例中,我們假設squid的HTTP監聽埠為3128,即squid預設設定值。然後,把所有來自於客戶端web請求的包(即目標埠為80)重定向到3128埠。
2.httpd_accel_host virtual
httpd_accel_port 80
這兩個選項本來是用來定義squid加速模式的。在這裡我們用virtual來指定為虛擬主機模式。80埠為要加速的請求埠。採用這種模式時,squid就取消了快取及ICP功能,假如你需要這些功能,這必須設定httpd_accel_with_proxy選項。
3.httpd_accel_with_proxy on
該選項在透明代理模式下是必須設定成on的。在該模式下,squid既是web請求的加速器,又是快取代理伺服器。
4.httpd_accel_uses_host_header on
在透明代理模式下,如果你想讓你代理伺服器的快取功能正確工作的話,你必須將該選項設為on。設為on時,squid會把儲存的物件加上主機名而不是ip地址作為索引。這一點在你想建立代理伺服器陣列時顯得尤為重要。

4.3 ipchains的相關配置
ipchains在這裡所起的作用是埠重定向。我們可以使用下列語句實現將目標埠為80埠的TCP包重定向到3128埠。

#接收所有的回送包
/sbin/ipchains -A input -j ACCEPT -i lo
#將目標埠為80埠的TCP包重定向到3128埠
/sbin/ipchains -A input -p tcp -d 0.0.0.0/0 80 -j REDIRECT 80

當然在這以前,我們必須用下面的語句開啟包轉發功能。
echo 1 > /proc/sys/net/ipv4/ip_forward

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-950374/,如需轉載,請註明出處,否則將追究法律責任。

相關文章