用不同的isp訪問internet

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
   摘要:
本文介紹如何在linux上配置多個不同的isp,如何容易地在它們之間切換。我們使用的概念不但適合配置一台pc和一個internet聯接,也可用來使整個家庭同時上網,為了達到這個目的,我們在linux上配置了一個域名代理和ip欺騙。


介紹
internet訪問變得越來越容易,大多數isp除了長期合約和月費外,不會問任何其它的事情。如果一個isp有技術問題,或者提供服務不好,你只需要切換到下一個isp,在德國,我們稱之為「internet by call」.並且會更進一步,你不需要註冊或者簽署任何文件,只需通過你的日常電話費單付賬。注意:這跟免費internet訪問
不一樣。免費internet通常處於堵塞崩潰的邊緣,並且數據包錯包較多,而使用「internet by call」時,有時你會花費相當高的費用,但能得到好的帶寬服務。不管你所在國家具體情況怎樣,這篇文章會告訴你如何快速地切換isp,在不同時候使用不同的撥號internet連接.
本文提及的internet訪問類型是從你的pc撥號ppp聯機到你的isp.在linux上有個叫作pppd的程序用來設置這種連接.pppd是一個非常棒的軟體,有很好的適應性,但是不幸的是pppd所帶的文檔只有相當舊的例子並且用特定的認證方式登陸進你的isp.使用這些例子來設置大多數現代的isp的聯接將會導致失敗,現在的isp多採用:
.動態ip地址分配
.自動域名配置
.chap或pap認證
.有時自動http請求重定向到代理伺服器
這篇文章解釋了如何在linux下使用這些現代的功能.你僅僅需要從你的isp了解:電話號碼,登陸名和口令.
用linux和ip地址欺騙,可以很容易地把整個地址池,整個網路的計算機而不僅是一台計算機通過一個ppp鏈路聯接上你的isp.為了實現這些,你需要至少一台linux機器和任意數量的其它計算機.這看起來象下圖:

如果你使用這樣的ip欺騙linux網關,並且使用不同的isp,那麼你會通常遇到兩個問題:
1、每次當你切換isp時,dns伺服器需要更換,你有不想每次重新配置你所有的計算機,特別是如果某些計算機在運行windows和Mac os時.
2、你想有一個任何人可以選擇預配置好的isp列表,這個列表可能不適用你網中所有的操作系統.
我們可以用一個叫作dnrd的域名代理來解決問題1,並且可用一個CGI腳本產生一個你可以從哪裡撥出的web頁面.

配置pppd
所有的pppd配置文件通常位於/etc/ppp,通常你需要以root身份啟動pppd.在安裝和最早的測試你需要以root用戶登陸.等會我將會告訴你如何讓任何人啟動和停止pppd,經常用root登陸不太好.root用戶限制非常小,能夠在不小心中輕易地破壞你的配置文件.
pppd的重要文件:
/etc/ppp/options:對所有isp有效的通用配置文件
/etc/ppp/pap-secrets:ppp認證的口令
/etc/ppp/ip-up:當ppp連接激活時,自動執行的腳本(當ip連接剛聯結上就執行)
/etc/ppp/ip-down:當ppp連接被中止時,自動執行的腳本
/etc/ppp/peers/:放置一個isp的特定配置文件的目錄
你可以下載這些文件的壓縮包ppp.tar.gz,把它在/etc/下解壓。子目錄ppp和其它子目錄將會在/etc下被創建.如果你已有/etc/ppp目錄,那麼你應該在解壓前將它該名備份.
cd /etc
mv ppp ppp_old
tar zxvf ppp.tar.gz
解壓后,你會發現ppp.tar.gz中包含許多文件,它們都是用來簡化安裝,配置的交換腳本.(注意,按照示例中的配置文件中來做會付出一些代價,它們可能是錯誤的,查找isp的網頁,得到準確的信息.)
讓我們來看一下一個叫做arcor的isp的配置文件.
# This is /etc/ppp/peers/arcor
# Home page of the ISP arcor: http://www.arcor-online.de/
#----------
# serial device and modem speed (normally 38400 or 57600):
/dev/modem 57600
# modem dial-out script with phone number:
connect '/etc/ppp/scripts/ppp-on-dialer-pap 0192070'
# specific options, common options are
# read from /etc/ppp/options
noipdefault
# tell pppd to use this users name for PAP authentication:
user arcor
# try dynamic dns:
usepeerdns
#
以#開頭的行是註解行,
第一個變數(/dev/modem)是使用的串口設備,/dev/modem是你的modem使用的設備的軟聯接.(/dev/ttyS0或/dev/ttyS1):
cd /dev
ln -s ttyS0 modem
57600是modem速度,這取決於你的modem硬體.以connect開始的那行指定了一個腳本(/etc/ppp/scripts/ppp-on-dialer-pap)通過AT指令集來處理與modem之間的通訊.這些AT指令是關於modem的ASCII命令語言.傳給腳本的變數參數是要撥的電話號碼(0192070).
noipdefaults是分配動態IP地址所需要的選項;usepeerdns是自動DNS配置所需要的選項.自動DNS配置工作原理就是:
如果你的ISP在握手期提供給你一或者兩個DNS伺服器的IP地址,那麼它們將會在/etc/ppp/ip-up腳本中作為變數DNS1或DNS2被引用.
所有的解析器庫函數都需要讀一個叫作/etc/resolv.conf的文件來找出如何解析名稱的方法.這個文件被netscape,sendmail等應用程序使用來查找DNS伺服器.我們將會在ip-up腳本中來改變/etc/resolv.conf
儘管我們定義了電話號碼,modem速度,使用的串口,一些pppd的配置選項.在這裡我不想討論/etc/ppp/options中的通用配置選項.你可以看一看例子文件和pppd的man手冊.這樣我們現在就可以來撥號到我們的ISP.要撥號,我們還需要做多兩件事.
登陸名:arcor
口令:internet
這些信息需要輸入到文件 /etc/ppp/pap-secrets中,登陸名同時要輸入到文件/etc/ppp/peers/arcor中.
象下面例子一樣在文件/etc/ppp/pap-secrets中加上一行:
# This is /etc/ppp/pap-secrets
# client server secret IP-addr
arcor * internet 0.0.0.0
就是這樣了,現在我們可以來測試一下,鍵入下面一行來撥號:
pppd call arcor
在這會arcor是指在目錄/etc/ppp/peers/ 中的配置文件的名字.
modem將會撥號,幾秒鐘之後,你就在線了.當你在線的時候,用命令/sbin/ifconfig將會顯示一個叫作ppp0的介面.多試幾次直到你能看到它,現在你可以使用你的web瀏覽器到linuxfocus.org衝浪了.
要終止INTERNET連接你可以用命令
kil lall pppd
我希望這個例子你能用的上,在德國的讀者這會肯定能象這樣工作了,其它國家的人當然要改寫他們ISP的電話號碼,登陸名和口令.如果不能正常工作,請看本文結尾部分的疑難解決篇.
現在,你有一個工作的ISP了,要增加其它的ISP可以如下操作:
1,拷貝文件 /etc/ppp/peers/arcor給新的名字
2,改變該文件的電話號碼和用戶信息
3,在文件/etc/ppp/pap-secrets中加多一行
拷貝這個文件和使用一個文本編輯器修改要比用圖形化配置工具要快得多和容易得多.
出於這個目的,你應該大略了解下面的機制如何工作,下面,我們將要使用一些腳本來讓它更容易使用,我們特別要介紹兩個Set-UID perl腳本,來讓你以普通用戶身份(非root用戶)登陸系統時可以啟動和停止internet撥號聯接.
Set-UID是一個讓普通用戶行使特殊的命令,並被當作這個命令的擁有者在執行的機制.顯而易見地,這需要小心設計,防止產生安全問題,這些Set-UID perl腳本已經被包含進你剛解包的ppp.tar.gz中.它們得文件許可中含有"s",並且屬於root用戶.

> cd /etc/ppp/scripts
> ls -al ppp-on ppp-off
-rwsr-sr-x 1 root root 1258 Jan 7 13:24 ppp-off
-rwsr-sr-x 1 root root 2619 Jan 9 20:30 ppp-on

如果它們沒有這樣的許可權可以用下面的命令來改變它們:
chmod 6755 ppp-off ppp-on.
ppp-off 和ppp-on腳本僅僅是包裝腳本,它們做的僅僅是運行pppd call some-config-file 或者killall pppd.
這樣的好處是所有的用戶現在可以執行它.ppp-on腳本被作為一些特別的調用被那些不使用自動DNS配置的isp使用.
如果你碰巧有一個這樣的isp,那麼編輯這個文件,搜索"static",這裡面有一些例子可用來修改,你象下面一樣使用ppp-on/ppp-off 腳本.

撥號上網:
/etc/ppp/scripts/ppp-on arcor
中止聯接:
/etc/ppp/scripts/ppp-off
現在你機器上的所有用戶都可以使用它們了.arcor 對應/etc/ppp/peers/下的一個文件名.你或許想更歡一個不同的名字.
最後,我們將使用一個圖形化界面來啟動和停止internet聯接,一個cgi程序是一個生成互動式頁面的程序.一個設計良好的cgi程序在任何操作系統和任何瀏覽器上都工作正常.這就是為什麼我們使用cgi程序.它看起來象這樣.
幾乎所有現在發行的linux版本都會帶有一個配置好的apache WEB伺服器,你所需要作的僅僅是解壓pppcontrol.gz
並且拷貝到你WEB伺服器的cgi目錄下(大概是/home/httpd/cgi-bin/),為了讓它可執行,鍵入:
chmod 755 pppcontrol
接著編輯改文件,修改這個perl 腳本中的$url變數。當然你要先用gunzip把pppcontrol.gz解壓為pppcontrol。
$url一定要是這個腳本自己的url地址,比如你的pc是一台獨立的linux機器,並且使用自返ip地址的話,
$url="http://127.0.0.1/cgi-bin/pppcontrol"
這個pppcontrol cgi腳本要讀一個叫作/etc/ppp/gpppwrap.conf的配置文件。下面是它的使用語法:
ppponarg: <agument_to_pass_to_ppp_on> - some additional comment string
減號符開始是將會在pppcontrol頁面上顯示但不會傳遞到/etc/ppp/scripts/ppp-on程序的註解。下面有個例子,假設你的/etc/ppp/peers下有isp配置文件"arcor"和"talknet":

# This is /etc/ppp/gpppwrap.conf
ppponarg: arcor -- arcor.net 3pf/min
ppponarg: talknet -- internet by call 3.5pf/min

注意:上網費價格3pf/min和3.5pf/min可能會變化,或許到你看本文的時候已經是錯誤的。
這裡對你來說可能有一些新的內容,但是暫時只需要了解這麼多就可以設置好並運行起來。
現在你可以方便地在頁面上的ISP表單中選擇一個ISP,並只需按一下頁面上的一個按鈕就撥號出去。

域名代理
在上面的部分中,你已經了解如何配置一台linux機器撥號上網,當我們建立一個新的ppp聯接時,我們都要修改文件/etc/resolv.conf
如果你使用ip欺騙來給整個網路提供internet訪問的話,那麼給在網路中的每一台主機都修改/etc/resolv.conf就相當困難.
如果你有一些運行windows的機器,那麼任務變得近乎不可能.因為這些機器每次改變網路設置中的域名伺服器時都需要重啟動.
解決方案就是域名代理.這個小小的域名伺服器看起來象你自己網路中自己的域名伺服器,它僅僅是傳遞訪問請求給你isp的域名伺服器去處理.使用bind域名伺服器來作傳遞域名伺服器以實現這個目的也是可能的,儘管bind並不是為次而設計的.
dnrd是一個相當好的域名代理,它是專為這個目的來設計的.
假設你在一台linux機器上運行dnrd,並且你把這台linux機器的內部ip地址192.168.0.1作為你網路上其他機器的域名伺服器.這是一個靜態的設置,你不需要再更改它,非常容易.
要同過源代碼來安裝dnrd,你需要這樣做:
解壓
tar zxvf dnrd-2.10.tar.gz
cd dnrd-2.10/src/
編譯
make
strip dnrd
安裝
cp dnrd /usr/local/sbin/
創建空目錄/etc/dnrd/
mkdir /etc/dnrd/
域名伺服器設置(195.50.149.33和195.50.140.6是你isp的域名伺服器)
當ppp聯接激活時
dnrd -s 195.50.149.33 -s 195.50.140.6
當ppp聯接被終止時
dnrd
dnrd在腳本/etc/ppp/ip-up和/etc/ppp/ip-down自動被調用.這些腳本你前面已經下載了,預計dnrd安裝在目錄/usr/local/sbin/中.
dnrd能夠做更多的事情,它自己甚至可作一個真正的小域名伺服器.在unix上你通常要這樣設置/etc/host.conf
order hosts, bind
在/etc/hosts中提供你的小網路中所有機器的名字.不幸地是你網路中那些傻傻的windows機器就沒可能了.
如果dnrd在你的linux機器上找到一個/etc/hosts文件,它會自動為文件中提及的選項作域名伺服器.這樣就解決了問題.
/etc/hosts文件的語法如下:
# syntax:
# ip-addr hostname alias1 alias2 ...
# example:
192.168.0.1 linuxpc.mynet linuxpc
192.168.0.2 peppermint.mynet pepper mint

當dnrd運行時,你可在網路上任何地方使用http://linuxpc.mynet/或http://linuxpc/來代替http://192.168.0.1/
用dnrd來做域名代理,同時做域名伺服器,你需要增加這行:
daemon /usr/local/sbin/dnrd
這行增加到啟動腳本/etc/rc.d/init.d中.
這樣就可以了,現在你網路中任何人都可同時和其他人一同上網了,很容易地打開和停止ppp聯接,或者在不同的isp之間進行轉換.只需要把書籤指向我們的cgi腳本pppcontrol

改進之處
如果你不想再修改/etc/resolv.conf文件,你可以好好編輯/etc/ppp/ip-up和/etc/ppp/ip-down腳本.
echo .....> /etc/resolv.conf
或者
cat > /etc/resolv.conf << ENDOFCAT
...
ENDOFCAT
做完這些后,你只需要自返地址作為域名伺服器地址.
# This is /etc/resolv.conf when dnrd is running
nameserver 127.0.0.1
這樣的好處是你訪問外部時在所有的機器上也可以使用dnrd的緩存.
你可以用nslookup來測試域名代理:

>nslookup
Default Server: localhost
Address: 127.0.0.1

>pepper
Server: localhost
Address: 127.0.0.1

Non-authoritative answer:
Name: peppermint.mynet
Address: 192.168.0.2

用crtl-d可以中斷nslookup

下面我介紹一下如何激活pppd的debug輸出.這樣可以幫助你找出不能正常工作的原因,不幸地是,當它不能正常工作時,通常並不是我這端的配置錯誤.
第一件事是pppd為了運行/etc/ppp/scripts/ppp-on-dialer-pap腳本時打開的埠上(/dev/modem, 一個/dev/ttyS0的連接).這個腳本傳遞AT命令給數據機,這些命令讓數據機撥號到你的isp.如果其中出現任何錯誤,你都可以在文件 /etc/ppp/connect-errors中找到它們.大多數時候,這個connect-errors文件能給你足夠的信息讓你找出哪裡出錯.如果還不行的話,你可以手動輸入AT命令.
要這樣做你需要一個串列通訊程序,象minicom(大多linux發行版本都帶有的),或者是cu(uucp包的一部分),或者是kermit(在網址http://www.columbia.edu/kermit/ck70.html上可下載).使用這個個串列
通訊程序和你的數據機來"交談".當你鍵入AT,那麼數據機就會說"好",如果不是這樣,檢查速度設置,電源線等.如果正常的話,接者試試命令ATDT1234,數據機就會撥號1234,如果不是的話,查查你的數據機手冊.這個命令可能是ATD1234(沒有T)或者有其他錯誤.
你的數據機撥號到你的isp后的下一步是ppp-negotiation變數.要觀察這是如何進行的,你必須要在/etc/syslog.conf文件中使能daemon.debug選項.
編輯文件/etc/syslog.conf並且在/var/log/messages加入";daemon.debug"這行.例如:
*.info;mail.none;authpriv.none;daemon.debug /var/log/messages
接著用下面的命令重啟 syslog
/etc/rc.d/init.d/syslog restart
現在你可以在 /etc/ppp/options中使能debug選項了,接著鍵入
tail -f /var/log/messages
當連接到你的isp時觀察pppd的debug輸出.

一個成功的ppp連接可能看起來象:
Jan 14 17:18:11 bearix pppd[721]: pppd 2.3.10 started by root, uid 0
Jan 14 17:18:34 bearix pppd[721]: Serial connection established.
Jan 14 17:18:34 bearix pppd[721]: Using interface ppp0
Jan 14 17:18:34 bearix pppd[721]: Connect: ppp0 <--> /dev/modem
Jan 14 17:18:35 bearix pppd[721]: sent [LCP ConfReq id=0x1 ]
Jan 14 17:18:37 bearix pppd[721]: rcvd [LCP ConfReq id=0x46 ]
Jan 14 17:18:37 bearix pppd[721]: sent [LCP ConfNak id=0x46 ]
Jan 14 17:18:38 bearix pppd[721]: rcvd [LCP ConfReq id=0x47 ]
Jan 14 17:18:38 bearix pppd[721]: sent [LCP ConfAck id=0x47 ]
Jan 14 17:18:38 bearix pppd[721]: sent [LCP ConfReq id=0x1 ]
Jan 14 17:18:38 bearix pppd[721]: rcvd [LCP ConfAck id=0x1 ]
Jan 14 17:18:38 bearix pppd[721]: sent [PAP AuthReq id=0x1 user="arcor" password="internet"]
Jan 14 17:18:40 bearix pppd[721]: rcvd [LCP ConfReq id=0x49 ]
Jan 14 17:18:40 bearix pppd[721]: sent [LCP ConfReq id=0x2 ]
Jan 14 17:18:40 bearix pppd[721]: sent [LCP ConfAck id=0x49 ]
Jan 14 17:18:41 bearix pppd[721]: rcvd [LCP ConfAck id=0x2 ]
Jan 14 17:18:41 bearix pppd[721]: rcvd [CHAP Challenge id=0x5 <0c7672840494152025f937ac4f5e135e>, name = "klndiinternet"]
Jan 14 17:18:41 bearix pppd[721]: sent [CHAP Response id=0x5 , name = "arcor"]
Jan 14 17:18:41 bearix pppd[721]: rcvd [CHAP Success id=0x5 ""]
Jan 14 17:18:41 bearix pppd[721]: sent [IPCP ConfReq id=0x1 ]
Jan 14 17:18:41 bearix pppd[721]: sent [CCP ConfReq id=0x1 ]
Jan 14 17:18:41 bearix pppd[721]: rcvd [IPCP ConfReq id=0x8e ]
Jan 14 17:18:41 bearix pppd[721]: sent [IPCP ConfAck id=0x8e ]
Jan 14 17:18:41 bearix pppd[721]: rcvd [IPCP ConfRej id=0x1 ]
Jan 14 17:18:41 bearix pppd[721]: sent [IPCP ConfReq id=0x2 ]
Jan 14 17:18:41 bearix pppd[721]: rcvd [LCP ProtRej id=0xfb 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Jan 14 17:18:41 bearix pppd[721]: rcvd [IPCP ConfNak id=0x2 ]
Jan 14 17:18:41 bearix pppd[721]: sent [IPCP ConfReq id=0x3 ]
Jan 14 17:18:41 bearix pppd[721]: rcvd [IPCP ConfAck id=0x3 ]
Jan 14 17:18:41 bearix pppd[721]: local IP address 145.253.88.6
Jan 14 17:18:41 bearix pppd[721]: remote IP address 145.253.1.150
Jan 14 17:18:41 bearix pppd[721]: primary DNS address 145.253.2.11
Jan 14 17:18:41 bearix pppd[721]: secondary DNS address 145.253.2.75
Jan 14 17:18:41 bearix pppd[721]: Script /etc/ppp/ip-up started (pid 723)
Jan 14 17:18:42 bearix pppd[721]: Script /etc/ppp/ip-up finished (pid 723), status = 0x0

要完全明白這些輸出,你可能要了解ppp 協議的細節了.我不知道ppp 協議到底如 何工作,但是我可以猜懂一點點事情,
僅僅明白大致如何進行就通常夠了.

"sent ... ConfReq"意味著為了談判一些事情傳遞一個配置請求,回答就是在"rcvd ... ConfAck"或"rcvd ... ConfRej"中.
如果都成功了,你就會看到分配的動態ip地址和你isp的網關地址.
在這裡討論每一個錯誤是不可能的,因為首先我不知道你的設置,其次,這有太多地方可能導致錯誤.
通過這篇文章你可以找到通常的錯誤就有點創造性了,如果你實在不能搞定它,而且看起來不是你這邊的錯的話,換一個isp吧,這可能是isp的錯.





[火星人 ] 用不同的isp訪問internet已經有790次圍觀

http://coctec.com/docs/net/show-post-68504.html