作者 主題: 請問一台電腦上如何取得兩個浮動式的公共IP  (閱讀 54065 次)

0 會員 與 1 訪客 正在閱讀本文。

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
狀況如下:
想寫一個伺服器/使用者的應用程式,主要是可讓該應用程式有網路的功能
比如一個進銷存系統,可在不同地方都連上網路共享資源且可以抓取其他網站資
料的一個應用程式,因為擔心惡意入侵的問題所以希望能不要使用固定的IP或主機名稱
如果有要連上系統則打個電話到某家分店詢問IP後輸入即可連上真正的主機(先連到分店
應用程式存有主機傳來目前所使用的IP,依此IP新加入的電腦可連到主機)
所以該應用程式(還沒寫好但已能取得PPP0介面的IP)預定可透過系統取得中華電信浮動
式的二個IP後其中一個為正常連線使用,另一個IP由主機取得後向以連線上來的使用者傳
回做為預定下次(不固定分鐘數後第一個IP即斷線)連線的位置,希望能透過這樣交叉變換
IP的方式達到"完全不相干者"的惡意入侵(相干者的入侵可能無法預防)

目前問題:(希望解決)
因為不會設定所以電腦上只能取得一個PPP0介面公共IP(希望能取得兩個以上)
硬體方面目前有兩台電腦3塊網路卡可供運用
最希望的解決方案是能在壹台電腦兩塊網路卡的情形下取得兩個中華電信所提供的
浮動式公共IP(例如能有PPP0及PPP1兩個介面)

謝謝!多謝您的幫忙...感恩T.T
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #1 於: 2007-01-30 16:04 »
歹勢!!英文的看不懂耶
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

harrier

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 1856
  • 性別: 男
    • 檢視個人資料
    • 國屬武裝兵
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #2 於: 2007-01-30 16:07 »
聽起來...
防火牆建立 VPN 符合需求?
...90Net(90:1200/1203),GameNET(99:700/707),ALLNet(92:9200/3111),InfoNet(30:100/103)..MaximusCBCS(浮懷),AirNet,TenderNet,StormNet,FidoNet...
<<- www.nas.vg ->>

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #3 於: 2007-01-30 18:59 »
搞了一個下午還是無法成功:(不過有點接近了....大概吧?)
將/etc/sysconfig/network-scripts/下的
ifcfg-eth0複製到ifcfg-eth1
ifcfg-ppp0複製到ifcfg-ppp1

ifcfg-eth0內容如下:
代碼: [選擇]

DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.1.255
IPADDR=192.168.1.2
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=no
GETEWAYDEV=ppp0
USERCTL=no
PEERDNS=no
TYPE=Ethernet

複製到ifcfg-eth1後eth0改成eth1,ppp0改成ppp1.網段改成2
代碼: [選擇]

DEVICE=eth1
BOOTPROTO=none
BROADCAST=192.168.2.255
IPADDR=192.168.2.2
NETMASK=255.255.255.0
NETWORK=192.168.2.0
ONBOOT=no
GETEWAYDEV=ppp1
USERCTL=no
PEERDNS=no
TYPE=Ethernet

ifcfg-ppp0複製到ifcfg-ppp1也如法泡製
ifcfg-ppp0內容如下:
代碼: [選擇]

USERCTL=yes
PEERDNS=yes
TYPE=xDSL
DEVICE=ppp0
BOOTPROTO=dialup
ONBOOT=yes
PIDFILE=/var/run/pppoe-adsl.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
PERSIST=no
SYNCHRONOUS=no
DEFROUTE=yes
USER='********@hinet.net'
PROVIDER=hinet
ETH=eth0

ifcfg-ppp1內容如下:
代碼: [選擇]

USERCTL=yes
PEERDNS=yes
TYPE=xDSL
DEVICE=ppp1
BOOTPROTO=dialup
ONBOOT=yes
PIDFILE=/var/run/pppoe-adsl.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
PERSIST=no
SYNCHRONOUS=no
DEFROUTE=yes
USER='********@hinet.net'
PROVIDER=hinet
ETH=eth1


結果:
ppp0能正常連線的情況下ppp1無法連線,需將ppp0關閉後ppp1才能正常連線,也就是
ppp0及ppp1無法同時連線!!!

請問該如何解決呢 ?__?a
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #4 於: 2007-01-30 19:11 »
這個可以參考一下

http://phorum.study-area.org/viewtopic.php?t=10085

有詳細的說明,

不過,我比較不建議用這個方式防駭
=========================
http://www.kuolung.net
==========================

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #5 於: 2007-01-30 20:58 »
不好意思:由於這還只是個概念(想法)所以有說錯的還請指正,謝謝

目前一般主機提供服務必須(大概是吧!)有一個固定的IP供使用者每次連線都使用一個固定
(或多個固定)的IP以連上主機
不過這也有一個顯而易見的問題:跑得了和尚跑不了廟(借用鳥哥書上的)當一個有心入侵別
人主機的侵入者可能不確定他要入侵到哪一個主機可能只是隨便輸入或用一個程式不斷的
測試某個IP是否可以連接,如果可以則"進去看看".....
就好像現在詐騙集團一樣他可能不知道您的名字,可是他只要知道例如打到台南要加(06)
所以就從(06)0000000一直撥到(06)9999999一定會有N通是可撥通的
就好像您一定接到過打錯電話的吧!打錯電話的人並不知道這個號碼不是空號只是恰好按錯
所以撥通到您的電話了
重點來了:如果您的電話號碼不是"固定"的,而且您和要打給您的親朋好友約定,先響一聲後
掛斷再打一次,您才會把電話"接起來"否則電話機馬上更換到備用電話號碼那麼接到打錯
電話的機會是不是能夠降到最低呢?

不過這也有一個問題:因為IP(電話號碼)會隨時變來變去所以當要連接(撥通電話)的
使用者(親朋好友)並無法得知您現在的IP(電話號碼)是幾號?
本人想到的解決辦法是:如果連線(撥通)成功後必須傳回下次的IP(告知下次要打幾號)
如此一來當不小心被詐騙集團(惡意入侵者)撥通了可是因為還必須傳入一個"識別字串"
(響一聲後掛斷再重撥)如果沒有該"識別"則馬上切換到另一個IP(電話號碼),而原先的IP
(電話號碼)則棄置不用並重新取得新的IP(電話號碼)..PPP0與PPP1相互切換
PS.該"識別"不一定是一個字串,也可以是一個如N位元長度內第XYZ個字元是否為S字串
等等的程式設計者自行編碼的任一識別

用電話號碼的比喻很像有點爛(現實生活這樣幹的話可能會沒有朋友而且也不切實際)
不過如果是電腦的話,因為主機已傳給使用者下一次可連線的IP所以當主機斷線時則取用
這個備用的IP並重新取得依個新的備用IP,如此不斷切換主機的IP並傳輸下次應連線IP
即可保持已連線者不致和主機斷線,(如果只有一個IP則需每次通知)
而新加入的使用者則須與主機的管理人員(或其他使用者)查詢目前主機的IP後輸入到應用程式
內,該應用程式即可依此IP與主機連線
............結果還是要打電話><!

以上就是本人為什麼想要取得2個PPPn介面IP了,只是不知道這種方法可不可行?

目前本人正在開發應用程式,對網路應用的部分還在摸索中希望前輩能不吝指教
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #6 於: 2007-01-31 17:23 »
已經搞定....
去google那裏拜了一下(用"二個IP"搜尋)找到這份文件:
http://www.uplooking.com/content/view/2549/2/
將ifcfg-ppp1下的這一個
PIDFILE=/var/run/pppoe-adsl.pid
改成
PIDFILE=/var/run/pppoe-adsl1.pid
然後執行/etc/rc.d/init.d/network restart

就搞定了^^!
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #7 於: 2007-01-31 17:47 »
補充一下:
在未重開機的情形下如再次執行/etc/rc.d/init.d/network restart
可能會使ppp1啟動失敗(原因不清楚?不過這是剛才用的時候發現的問題)
所以必須重新開機一次後即會自動抓到ppp0及ppp1這兩個介面
這時多次執行/etc/rc.d/init.d/network restart 也就正常了!!
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #8 於: 2007-01-31 18:11 »
再補充:><!
/etc/ppp/chap-secrets 或pap-secrets(我的是在pap-secrets)檔案內也要加上一個帳號*密碼
原來的:
"用户名1" * "密码1"
更改成:
"用户名1" * "密码1"
"用户名2" * "密码2"

用户名1與密码1可以和用户名2密码2相同
這個檔案務必設定,否則也將會有其中一個連上一個沒連上的情況發生(而且不限定哪一個)
我想可能是程式鎖定該檔時另一個同時要求連線卻因為只有一個用戶名及密碼字串
造成行程的競爭失敗而使得連線失敗吧?因為用Xwindow下的[系統工具]->[網路裝
置控制]時個別啟用ppp0及ppp1是ok的...?__?a
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #9 於: 2007-01-31 19:12 »
建議不要使用/etc/rc.d/init.d/network restart 的方式測試
這樣常會發生有一個pppn的介面沒抓到
可以用
infup ppp0->infdown ppp0
infup ppp1->infdown ppp1
的方式交替關閉並開啟pppn介面這樣就可以每次都抓到一個新的浮動IP

下行速度很像有變快了?應該是錯覺吧^^?
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #10 於: 2007-01-31 23:54 »
不錯哦。。。 加油!

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #11 於: 2007-02-01 19:10 »
題外話:
看到netman大哥的相片.....很想在他的腮幫子捏一把的說...超想捏的^^
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #12 於: 2007-02-01 19:12 »
.....換相片了...T__T
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #13 於: 2007-02-08 16:43 »
在/etc/sysconfig/network-scripts/ifcfg-ppp1須將檔案權限變更為與ifcfg-ppp0
相同的權限:原來是-rw-------應改成-rw-r--r--如此才可在程式內以system()重新
啟動ppp1(檔案擁有者是root但以其它使用者執行程式)介面否則會有:
代碼: [選擇]

/sbin/ifdown: line 35: ../networking/profiles/default/ifcfg-ppp1: 拒絕不符權限的操作
usage: usernetctl <interface-config> <up|down|report>
使用者無法控制這個裝置。

的錯誤訊息(這是今天寫的時候找到的bug)

ps.不好意思把這裡當成"日記"在寫了,不過我是有原因的:
1.我字很醜所以常常以後要看時自己都看不懂--->其實是懶惰
2.存在這理比較好找:貴站分類清楚,自己寫下來的可能要找半天--->還是懶惰
3.以前寫的筆記常常莫名其妙的不見@@?
4.不知名的原因---->總而言之就是懶
所以如果這樣對貴站有造成困擾請說一聲,小弟將自我約束....再說一聲不好意思了
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #14 於: 2007-02-16 06:42 »
在/etc/sysconfig/network-scripts/ifcfg-eth0,eth1,ppp0,ppp1
的權限設為-rw-r--r--即可,如設為-rwxrwxrwx的高權限反而有反效果
(雖將參數USERCTL=yes但仍無法以一般使用者開啟關閉該介面)
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #15 於: 2007-02-22 21:37 »
現在已能在"一塊網路卡"情況下取得兩個浮動IP

主要是參考[鳥哥的Linux私房菜-伺服器架設篇-第9章:多IP與Router的架設]

不過在重新取得IP後還是要用run_ip.sh跑一下才能令PPP1可以使用(用二塊網卡也一樣)
http://phorum.study-area.org/viewtopic.php?t=44511

所以在跑server端時必須以root去執行才能有效的進行IP迴避

感謝kuolung大大的幫忙

[筆記]
在重新取得IP時有約7秒的停頓,使用run_ip.sh也有相同的狀況,不過向中華電信要求
浮動IP 的步驟可透過執行緒使程式不會有停下來等的狀況,不過run_ip.sh應該不行,因
為要執行run_ip.sh後ppp1才能用,所以可能程式還是要有停下來等的情形發生,但還沒
寫到那裡所以還是要把它實做出來先才知道可透過何種手段使之不會有停頓狀況
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #16 於: 2007-02-23 20:17 »
[筆記]
多個IP與下面幾個檔案有很大的關係
/etc/sysconfig/network-scripts/ifcfg-ethX
/etc/sysconfig/network-scripts/ifcfg-pppX
/etc/ppp/chap-secrets



********************硬體(網路卡)的設定檔********************
檔名:/etc/sysconfig/network-scripts/ifcfg-eth0
檔名ifcfg-eth0表示這個檔案存放一個硬體(第一塊網路卡)的設定檔
如果有兩塊以上的網路卡必須多出一個檔名為ifcfg-eth1,第三塊則為ifcfg-eth2以此類推

參數:GETEWAYDEV=ppp0
這個參數指向一個與外部網路的介面ppp0所以應該也要有一個ifcfg-ppp0為檔名的設定檔
不過ifcfg-ppp0內的參數完全不同於ifcfg-eth0 所以不可覆製過去,要指定這個參數是因為
下面的虛擬界面同樣也要指向一個pppn介面的檔案,如不設定則兩個硬體相關的檔案將
無法得知須指到哪一個檔案(以寫作習慣來說應該會指到預定的地方,不過並不知道預定      
是何者所以還是給它指定一下較好,在我的機器上沒設這個參數時eth0:0會去抓eth1)

檔名:/etc/sysconfig/network-scripts/ifcfg-eth0:0
當只有一塊網路卡時可以將檔名設為ifcfg-eth0:0代表[與核心溝通]的介面仍是eth0這一
塊網卡,但它是一個[虛擬]的所以必需建立在eth0上:號代表它是虛擬的硬體,所以一塊網卡
上允許有多個虛擬的硬體,訣竅是覆製多個ifcfg-eth0:n不過檔名不可重覆,只要將n由0開
始當然它有可能有一定的上限不過是多少則無相關資料所以無法知道了,所以要設第一個
虛擬硬體介面時ifcfg-eth0:0第二個則為ifcfg-eth0:1依此類推
[GETEWAYDEV=ppp1]參數須指向與ifcfg-eth0不同的ppp介面

小結:
要取得幾個IP就要有幾個硬體介面相信是原則之一,不管是實體(有這塊網卡插在電腦上),
還是虛擬的(eth00:0這類沒有這塊網卡插在電腦上)



********************撥接軟體(pppoe)的設定檔********************
檔名:/etc/sysconfig/network-scripts/ifcfg-ppp0
這是關於pppoe連線軟體的介面,也就是用ADSL要連到網際網路的軟體相關的設定檔,所以與
硬體的設定檔一樣它也可以從ppp0到pppn,依寫作慣例來說還是從ppp0開始,這與網路卡的
設定檔須相呼應,網路卡eth0的參數GETEWAYDEV=ppp0,後面的ppp0即表示eth0這個介面將以
ifcfg-ppp0這個檔案相關設定取得網際網路上的IP,所以當只有一塊網卡時eth0:0需對應到
ifcfg-ppp1這個檔案

參數:ETH=eth0,ETH=eth0:0
同樣的在檔案內有個參數必須指向硬體的位置(識別)所以在多塊網卡的情形下ETH=eth1表
示該設定檔以使用的硬體是eth1這個網路卡,ETH=eth0:0則是在一張網卡有多個虛擬介面的
情形下指向該虛擬設備的

小結:
實際與網際網路溝通的是ppp介面,所以每一個ppp設定檔可以取得一個IP,相信原則是每一
個ppp介面必須對應到一個硬體設定檔(不論它是實體或虛擬的)



********************其它的設定檔********************
多條線路:
檔名:/etc/ppp/chap-secrets
這個檔案存放了ADSL業者給的帳號及密碼的資料,所以當有多條線路時就會有多個帳號與
密碼了,所以只要將第一個帳號密碼複製過去
(中間可能有不是空白的非可視字元所以應整列複製後在予以修改帳號及密碼,如果是直
接依其格式輸入則程式在讀取時可能會失敗)

開機啟動:
檔名:/etc/rc.local
目前以一條線路一塊網卡取得兩個IP的狀況下是這樣的:
ifup ppp0
ifup eth0:0
ifup ppp1
這樣在每次開機時跑到很多[ OK ]的地方時可看到ppp0與ppp1在取得IP(一個IP約7秒)


********************注意事項********************
已取得的第二個以後的IP不代表它就可以用(通)了,實際狀況是可取得多個IP但第二個以
後的IP並無法通,這個時候就要把  前輩  搬出來了(空格以示尊重)
http://phorum.study-area.org/viewtopic.php?t=44511
在四樓有一個連結,下載後將其解壓縮,得到一個multipath的目錄底下有一個run_ip.sh
執行它(必須以root執行)----->搞定->收工->回家


參考資料:
http://www.uplooking.com/content/view/2549/2/
http://phorum.study-area.org/viewtopic.php?t=44511
[書]:鳥哥的LINUX私房菜-伺服器架設篇-第9章
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #17 於: 2007-02-23 22:12 »
我看了,您的筆記,和我的認知有一點點不太一樣,不知道是版本不同,還是我以前的測試有誤 :

1.  pppn 不用對應幾個  ethn:x , 我記得我以前都是用同一個 ethx 也可以

2. "GETEWAYDEV=ppp0" 這個應不要設

3. 不用  ifup eth0 ->> 再 ifup ppp0

4. 以您的環境,實在不太需要去執行 run_ip.sh
  只要在 ifup pppx 後面再加 3條指令就可以了

   ip rule del pref  x0 from $oldppp table x0
   ip rule add pref x0 from $ppp table x0
  ip route replace default via  $gwppp dev $ppp table x0
=========================
http://www.kuolung.net
==========================

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #18 於: 2007-02-23 22:58 »
筆記寫起來這樣到客戶那邊時直接上網看(這樣不用拿本子出來當場遜掉 :lol:)

檔案相互對應個人覺得這樣應該會比較有分別...可能有些參數會要不同所以小弟比較傾向個別對應

GETEWAYDEV=ppp0這個之前沒設時ppp1參數:ETH=eth0:0在開機時會去抓eth1
然後就一直抓不到,還好我還有一塊卡給他插回去後將此參數設進去就ok了
可能我又在/etc/rc.local 有給它動過,我再試試好了

ifup eth0:0沒設進去ppp1可以抓到但以ifconfig指令沒看到覺得亂怪一把的所以還是設進去了 :D

這幾天來實在很感謝您的幫忙喔 :lol:  :lol:  :lol:

ip rule del pref x0 from $oldppp table x0
ip rule add pref x0 from $ppp table x0
ip route replace default via $gwppp dev $ppp table x0
這三個指令是加在/etc/rc.local下吧....試試看先
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #19 於: 2007-02-24 15:21 »
GETEWAYDEV=ppp0.....這個真的要設;雖然將ifcfg-eth0及ifcfg-eth0:0裡面的
"GETEWAYDEV=ppp0"參數拿掉可以去取得IP及連到本站,但在我想要點入本文章進行編輯(只有點
文章)時無法進入,剛第一次是以瀏覽器上網時發生當機,再來第二次才是可上網但點文章
時沒當機但瀏覽器自動關閉,把這個參數設回去後就正常了(這是發文前的情形)


報告:
ip rule del pref x0 from $oldppp table x0
ip rule add pref x0 from $ppp table x0
ip route replace default via $gwppp dev $ppp table x0
這三個指令有給他加在/etc/rc.local下了....還是不行
我把目前的架構畫出來看看:
代碼: [選擇]

              網際網路
                |
                |(一條中華電信的8M線路)
                |
      中 華 電 信 給 的 小 烏 龜
      |||   |||   |||   |||(共有四個孔)
       |     |     |     | (接三台電腦:windowsxp,RH9Linux2.4,RH9Linux2.4
       |     |     |     |  兩台Linux是做測試的機器,一台扮演server可取得兩個IP
       |     |     |     |  一台扮演client可取得一個IP,三台都可連上網際網路  
     Linux  [無]   XP   Linux
    (clinet)           (server)
     ||                 ||
   一張網卡eth0          一張網卡eth0及eth0:0
   一個IP-ppp0          二個IP-ppp0,ppp1

現在以clinet那一台去ping另一台server的ppp0的IP時是OK的
但去ping另一個ppp1的IP時卻無法通;在執行過run_ip.sh後再去ping它-->可以通

現在可以確定一件事:要連線沒問題,一定是設定錯誤了 :-?

/etc/rc.local的內容是這樣的
代碼: [選擇]

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

#鳥哥書上的,很像只能抓到預設的第一個裝置
# adsl-start

# 以下是參考網路上的資料加上來的 http://www.uplooking.com/content/2549/2/
ifup ppp0
ifup eth0:0
ifup ppp1
#這是網路上抓下來的,詳細用途不清楚,有沒有這些很像都沒差
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o ppp1 -j MASQUERADE
ip route replace default scope global nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1
ip route flush cache

#這是討論區由前輩提供的
ip rule del pref x0 from $oldppp table x0
ip rule add pref x0 from $ppp table x0
ip route replace default via $gwppp dev $ppp table x0
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #20 於: 2007-02-24 19:35 »
嗯...換地方了.....謝謝,感恩
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #21 於: 2007-02-24 22:14 »
發現一個有趣現象:
以ifconfig指令觀察時
代碼: [選擇]

eth0      Link encap:Ethernet  HWaddr 00:50:FC:31:BA:36
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:905 errors:0 dropped:0 overruns:0 frame:0
          TX packets:895 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:109921 (107.3 Kb)  TX bytes:120041 (117.2 Kb)
          Interrupt:10 Base address:0x9000

eth0:0    Link encap:Ethernet  HWaddr 00:50:FC:31:BA:36
          inet addr:192.168.11.1  Bcast:192.168.11.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:737 errors:0 dropped:0 overruns:0 frame:0
          TX packets:586 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:77147 (75.3 Kb)  TX bytes:72918 (71.2 Kb)
          Interrupt:10 Base address:0x9000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:5293 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5293 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:361179 (352.7 Kb)  TX bytes:361179 (352.7 Kb)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:122.123.148.205  P-t-P:122.123.128.254  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:68 errors:0 dropped:0 overruns:0 frame:0
          TX packets:217 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:6263 (6.1 Kb)  TX bytes:23817 (23.2 Kb)

ppp1      Link encap:Point-to-Point Protocol
          inet addr:122.123.133.239  P-t-P:122.123.128.254  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:737 errors:0 dropped:0 overruns:0 frame:0
          TX packets:586 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:77147 (75.3 Kb)  TX bytes:72918 (71.2 Kb)

可被接通的ppp0對應的eth0第二行是這樣的
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
無法被接通的ppp1對應的eth0:0第二行是這樣的
inet addr:192.168.11.1  Bcast:192.168.11.255  Mask:255.255.255.0
雖然ppp0與ppp1都有取得IP了,不過卻有不是相同動作的樣子?___?

目前ifcfg-eth0是長這樣的
代碼: [選擇]

DEVICE=eth0
ONBOOT=no
BOOTPROTO=none
BROADCAST=192.168.10.127
IPADDR=192.168.10.1
NETMASK=255.255.255.128
NETWORK=192.168.10.0
GETEWAYDEV=ppp0
USERCTL=no
PEERDNS=no
TYPE=Ethernet

ifcfg-eth0:0長這樣:
代碼: [選擇]

DEVICE=eth0:0
ONBOOT=no
BOOTPROTO=none
BROADCAST=192.168.11.255
IPADDR=192.168.11.1
NETMASK=255.255.255.0
NETWORK=192.168.11.0
GETEWAYDEV=ppp1
TYPE=Ethernet
USERCTL=no
PEERDNS=no

ifcfg-ppp0長這樣:
代碼: [選擇]

USERCTL=yes
PEERDNS=yes
TYPE=xDSL
DEVICE=ppp0
BOOTPROTO=dialup
ONBOOT=yes
PIDFILE=/var/run/pppoe-adsl.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
PERSIST=no
SYNCHRONOUS=no
DEFROUTE=yes
USER='********@hinet.net'
PROVIDER=hinet
ETH=eth0

ifcfg-ppp1長這樣:
代碼: [選擇]

USERCTL=yes
PEERDNS=yes
TYPE=xDSL
DEVICE=ppp1
BOOTPROTO=dialup
ONBOOT=yes
PIDFILE=/var/run/pppoe-adsl1.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
PERSIST=no
SYNCHRONOUS=no
DEFROUTE=yes
USER='********@hinet.net'
PROVIDER=hinet
ETH=eth0:0

rc.local長這樣:
代碼: [選擇]

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

# adsl-start

# 以下是參考網路上的資料加上來的 http://www.uplooking.com/content/2549/2/
ifup ppp0
ifup eth0:0
ifup ppp1
#echo 1 > /proc/sys/net/ipv4/ip_forward

#ip rule del pref x0 from $oldppp table x0
#ip rule add pref x0 from $ppp table x0
#ip route replace default via $gwppp dev $ppp table x0

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o ppp1 -j MASQUERADE
ip route replace default scope global nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1
ip route flush cache

ip rule del pref x0 from $oldppp table x0
ip rule add pref x0 from $ppp table x0
ip route replace default via $gwppp dev $ppp table x0

希望能再找出其它的解決方案(不用在程式內叫用run_ip.sh)^_^|||
不過禮拜一要開工了(雖然沒在甲頭路不過個人堅持假要放得夠 :oops: )先實作出來先
 非 常 感 謝 T.T
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #22 於: 2007-02-25 16:28 »
剛剛再去拜讀natman大大的文章http://www.study-area.org/tips/multipath.htm
發現下面的程式碼,用php寫的嗎,看起來很像C呢,沒學過php所以把它當C看,很像有點看
得懂呢...嘗試把它註解看看如果有不對的請不吝指教

ps.
小弟寫程式原則之一就是在還不是很了解某項東西時就開始註解
原本看不懂的可能就在註解過程中答案會慢慢浮現...試試看吧

代碼: [選擇]

//Get the real client IP ("bullet-proof"???)

function GetProxyIP()
{
 /*取得環境變數內關於"REMOTE_ADDR"的內涵值,因為有ADDR這個描述 所以應該
是取得IP這個變數內容的描述詞,因為是在if()內所以他將與另一個用 別種方法取出的值
一起被成立才執行其下的程序,另一個取出的值也是以 getenv()取得環境 變數內容,但
用到strcasecmp()忽略大小寫比對字串來與"unknown"這個字串做比對,所以
REMOTE_ADDR應該是如PATH這類的描述詞,而"unknown"字串則不清楚
unknown--字典查出來的意思是:不知的,未明的...
*/
       if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))

/*if()條件判斷為"真"時要執行的動作就是將getenv()取得的環境變數內容內該內容的
指標指定給$p這個變數,該內容應該就是REMOTE_ADDR此描述詞後面的咚咚了,而
$ip以C來說應該就是char *ip的意思了*/
           $ip = getenv("REMOTE_ADDR");
       else
/*if()條件判斷為"偽"時要執行的動作是指定一個字串給$ip,該字串為"unknown",翻譯
的意思是不知的,未明的所以應該是指該IP是未知的(可能就是浮動式IP了,因為如果是
固定IP會被設定進設定檔內,說不定就是環境變數REMOTE_ADDR就是固定IP的咚咚)
*/
           $ip = "unknown";
/*最後傳回&ip*/
   return($ip);
/*依函數名稱來說GetProxyIP() 應該是取得Proxy的IP但Proxy是啥東東其實還不是
很了解....聽過.看過.沒用過*/

}/*-------GetIP()-------*/


/*這個函數名稱應該滿清楚了,是取得Client的IP也就是使用者端的IP*/
function GetClientIP()
{
/*這些 if()...else if()...else()的判斷內容應該和GetProxyIP()的意思差不多了
不過環境變數描述詞有多所不同*/
   if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
           $ip = getenv("HTTP_CLIENT_IP");
       else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
           $ip = getenv("HTTP_X_FORWARDED_FOR");
       else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
           $ip = getenv("REMOTE_ADDR");

/*這一個判斷用到比較不同的isset(),就函數名稱來說is看得懂但在set什麼呢??
看來是一個_SERVER[]的字串陣列而其內的REMOTE_ADDR被當成陣列的索引值
所以這行說明REMOTE_ADDR環境變數的內容應該是一個數值,但用到單引號在C裡
面沒看過這種用法,所以應該是該語言比較特殊的語法吧*/
       else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
           $ip = $_SERVER['REMOTE_ADDR'];
       else
           $ip = "unknown";
   return($ip);
/*同樣該函數也是要傳回一個IP字串的指標,不過經過多個判斷後傳回"unknown"字串
的機會相對較少,所以現在要研究的是那些環境變數描述詞了,把這些詞的涵義搞懂了相信
就知道他到底在抓些什麼東西搞不好還知道抓這些東西的用意是什麼了*/

}

/*這些是輸出(顯示)的*/
printf("proxy IP: ");
print_r(GetProxyIP());
printf("<br>\n");
printf("client IP: ");
print_r(GetClientIP());



結論....找到個方向了,這個方向可能不是想要的但一定會對功力有所精進 :D
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #23 於: 2007-02-25 17:38 »
可能是我沒有寫得很清楚,才會有這樣的結果在 code 中

代碼: [選擇]

ip rule del pref x0 from $oldppp table x0
ip rule add pref x0 from $ppp table x0
ip route replace default via $gwppp dev $ppp table x0


我重新寫一個完整的給您好了

--> echo 1 > /proc/sys/net/ipv4/ip_forward
個人建議把它刪了,在 /etc/sysctl.conf 中

net.ipv4.ip_forward = 1

把 rc.local 改為如下  :

代碼: [選擇]


ifup ppp0
ifup eth0:0
ifup ppp1



晚一點再補完整上來
=========================
http://www.kuolung.net
==========================

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #24 於: 2007-02-25 21:10 »
對不起,居然是不能修改的,只好重新再 post 一篇

代碼: [選擇]


IPTABLES=/sbin/iptables
GREP=/bin/grep
AWK=/bin/awk
SED=/bin/sed
IFCONFIG=/sbin/ifconfig
IP=/sbin/ip

ifup ppp0
ifup eth0:0
ifup ppp1

IPPPP0="`$IFCONFIG ppp0 | $GREP 'inet addr' | $AWK '{print $2}' | $SED -e 's/.*://'`"

IPPPP1="`$IFCONFIG ppp1 | $GREP 'inet addr' | $AWK '{print $2}' | $SED -e 's/.*://'`"

$IP rule add pref 10 from $IPPPP0 table 10
$IP rule add pref 20 from $IPPPP1 table 20

GWPPP0="`$IFCONFIG ppp0 | $GREP 'inet addr' | $AWK '{print $3}' | $SED -e 's/.*://'`"

GWPPP1="`$IFCONFIG ppp1 | $GREP 'inet addr' | $AWK '{print $3}' | $SED -e 's/.*://'`"

$IP route add 192.168.1.0/24 dev eth

$IP route replace default via $GWPPP0 dev ppp0 table 10
$IP route replace default via $GWPPP1 dev ppp0 table 20

$IP route replace default scope global nexthop via $GWPPP0 dev ppp0 weight 1 nexthop via $GWPPP1 dev ppp1 weight 1



這樣一開機就不用 run_ip.sh 了
=========================
http://www.kuolung.net
==========================

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #25 於: 2007-02-25 21:49 »
非 常 之 萬 分 感 謝...可能明天才能試了--->要去天公廟拜拜 :P
搶頭香去--->可能連幾都擠不進去...哈哈 :P
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #26 於: 2007-02-26 20:15 »
報告:
情形很像調換過來了:下午時有將server那台重灌,在將其設定好(能連上網路)後將
代碼的部份給他複製到/etc/rc.local內重新開機,發現ppp1仍是無法被client給ping到
想了一下記起來:
代碼: [選擇]

--> echo 1 > /proc/sys/net/ipv4/ip_forward
個人建議把它刪了,在 /etc/sysctl.conf 中

net.ipv4.ip_forward = 1

就去原來net.ipv4.ip_forward = 0把它給改過來net.ipv4.ip_forward = 1

然後因剛好桌前的書被我翻到關於GETEWAYDEV=pppx的地方也說不要設所以將

ifcfg-eth0及ifcfg-eth0:0內的GETEWAYDEV=pppx刪掉然後存檔重開機,發現情

況變成client端要去ping那台server的ppp0時無法成功且出現一個訊息

connect:Network is unreachable

再去ping一次沒這個訊息變成卡住的狀態,然後去ping另一個ppp1的IP時

居然是通的 :x 哈哈....情形對換了...很像有點發現什麼的感覺 :P

再次回去將net.ipv4.ip_forward = 1改回來net.ipv4.ip_forward = 0後重開機

同樣的以clievt去ping那台server的ppp0的IP通了,再ping他的ppp1又是不通狀態

一賭氣將net.ipv4.ip_forward = 2試看看還是不行

乖乖的把它設為net.ipv4.ip_forward = 1

又變成ppp0可通ppp1不通了
請問我有多做或少做了什麼嗎???
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #27 於: 2007-02-26 22:18 »
對不起,有一點筆誤 :

-->> $IP route replace default via $GWPPP1 dev ppp0 table 20

應為

-->> $IP route replace default via $GWPPP1 dev ppp1 table 20


-->>  $IP route add 192.168.1.0/24 dev eth  這一行應刪


再來就是,以您的環境,

net.ipv4.ip_forward = 1 OR net.ipv4.ip_forward = 0

都不會影響結果才對
=========================
http://www.kuolung.net
==========================

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #28 於: 2007-02-27 01:35 »
搞定了!!搞定了!!

實在是很不好意思!!因為怕打錯字所以如果在可以複製的環境下小弟一定儘量不要打字
所以寫程式來說真正打字和複製後修改是一半一半的(小偷懶一下^^!)

由於之前在開機時跑到很多[ OK ]的地方有在抓eth0然後失敗,在仔細去看ifcfg-eth0後發現
把ONBOOT打成NOBOOT了 :oops: 還有PEERDNS也是

不過總算偷師成功,小弟過年這幾天真的學了不少呢 :D

最後要衷心的說:
真 是 非 常 感 謝
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問一台電腦上如何取得兩個浮動式的公共IP
« 回覆 #29 於: 2007-02-27 17:56 »
[筆記:將上面整理起來,且有之前本身錯誤觀念想法的補正]
經過測試運行良好,以前看書上說網路的程式很難除錯,所以將以各種(root及一般使用者)
身份登入,以及將某些參數(命令)拿掉,觀察其結果,這樣在程式除錯時才不用疑神疑鬼的
(事後證明絕大部份都是本身程式設計不良除了少部份硬體因素,系統因素更少)
環境如下:
代碼: [選擇]


              網際網路
                |
                |(一條中華電信的8M線路)
                |
      中 華 電 信 給 的 小 烏 龜(共有四個孔)
      |||   |||   |||   |||
       |     |     |     | (接三台電腦:windowsxp,RH9Linux2.4,RH9Linux2.4
       |     |     |     |  兩台Linux是做測試的機器,一台扮演server可取得兩個IP
       |     |     |     |  一台扮演client可取得一個IP,三台都可連上網際網路  
     Linux  [無]   XP   Linux
    (clinet)           (server)
     ||                 ||
   一張網卡eth0          一張網卡eth0及eth0:0
   一個IP-ppp0          二個IP-ppp0,ppp1

方法是各以root及使用者身份登入,每次登入都重開機

測試命令:
clinet端以ping -c 5 xxx.xxx.xxx.xxx
server端以ifconfig查詢目前取得的IP
1.server端以root登入,clinet以root登入------>clinet能ping到server端的兩個IP----->OK
2.server端以root登入,clinet以使用者登入---->clinet能ping到server端的兩個IP----->OK
3.server端以使用者登入,clinet以root登入---->clinet能ping到server端的兩個IP----->OK
3.server端以使用者登入,clinet以使用者登入-->clinet能ping到server端的兩個IP----->OK

設定檔的部份如下:以下設定檔與多IP有密切關係

************************* 硬體(網路卡)的設定檔 *************************
檔名:/etc/sysconfig/network-scripts/ifcfg-eth0
檔名ifcfg-eth0表示這個檔案存放一個硬體(第一塊網路卡)的設定檔
如果有兩塊以上的網路卡必須多出一個檔名為ifcfg-eth1,第三塊則為ifcfg-eth2以此類推
檔案內被分成兩部份(以空列分隔),上半部因為比較不清處其用途所以多以書上或預設的
為準,這部份是較不用修改的,比較要注意的是下面的部份,IPADDR的最後一個數字因為是第
一個設備所以取為10,而其它新加入的的ifcfg-eth0:n則延襲為11,12...110,112
DEVICE=eth0則是本設定檔欲控制的設備,依寫作習慣與檔名後面相同才不會有雜亂感
代碼: [選擇]

ONBOOT=no
BOOTPROTO=none
USERCTL=no
PEERDNS=no
TYPE=Ethernet

DEVICE=eth0
BROADCAST=192.168.1.255
IPADDR=192.168.1.10
NETMASK=255.255.255.0
NETWORK=192.168.1.0


檔名:/etc/sysconfig/network-scripts/ifcfg-eth0:0
當只有一塊網路卡時可以將檔名設為ifcfg-eth0:0代表[與核心溝通]的介面仍是eth0這一
塊網卡,但它是一個[虛擬]的所以必需建立在eth0上:號代表它是虛擬的硬體,所以一塊網卡
上允許有多個虛擬的硬體,訣竅是覆製多個ifcfg-eth0:n不過檔名不可重覆,只要將n由0開
始當然它有可能有一定的上限不過是多少則無相關資料所以無法知道了,所以要設第一個
虛擬硬體介面時ifcfg-eth0:0第二個則為ifcfg-eth0:1依此類推,除了檔名外其內的參數也
須對應,DEVICE=eth0:0這個參數延用ifcfg-eth0的慣例,IPADDR=192.168.1.11這個參數因為是
eth0的虛擬介面所以第四個數字的第一個字與其相同,第二字後給予延申1112...110,111...
代碼: [選擇]

ONBOOT=no
BOOTPROTO=none
USERCTL=no
PEERDNS=no
TYPE=Ethernet

DEVICE=eth0:0
BROADCAST=192.168.1.255
IPADDR=192.168.1.11
NETMASK=255.255.255.0
NETWORK=192.168.1.0

前面筆記有個參數:GETEWAYDEV=pppX後來經過證實是本人的瀏覽器有問題(後來完全不能上
網,給它重灌後發現這個參數是可以不要的:oops:
雖然不知道此參數是何用途但"多個香爐多隻鬼"還是聽前輩的免得後來真跑隻鬼出來

小結:
要取得幾個IP就要有幾個硬體介面相信是原則之一,不管是實體(有這塊網卡插在電腦上),
還是虛擬的(eth00:0這類沒有這塊網卡插在電腦上)


************************* 撥接軟體(pppoe)的設定檔 *************************
檔名:/etc/sysconfig/network-scripts/ifcfg-ppp0
這是關於pppoe連線軟體的介面,也就是用ADSL要連到網際網路的軟體相關的設定檔,所以與
硬體的設定檔一樣它也可以從ppp0到pppn,依寫作慣例來說還是從ppp0開始,這與網路卡的
設定檔須相呼應,網路卡eth0的參數GETEWAYDEV=ppp0,後面的ppp0即表示eth0這個介面將以
ifcfg-ppp0這個檔案相關設定取得網際網路上的IP,所以當只有一塊網卡時eth0:0需對應到
ifcfg-ppp1這個檔案
同樣將參數分成兩部份,下面的部份在每個pppn檔內應不同(相同的話就沒試過了)
比較重要的是:PIDFILE後面的...adsl1...的adsl1最後一字是數字1,所以如果有ppp2則應
該像這樣/var/run/pppoe-adsl2.pid所以在ifcfg-ppp0也可以是/var/run/pppoe-adsl0.pid
不過沒去給它測過就是了
代碼: [選擇]

USERCTL=yes
BOOTPROTO=dialup
TYPE=xDSL
ONBOOT=yes
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=20
LCP_FAILURE=3
LCP_INTERVAL=80
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
DEFROUTE=yes
SYNCHRONOUS=no
USER='********@hinet.net'
PEERDNS=no

PIDFILE=/var/run/pppoe-adsl.pid
NAME=DSLppp0
DEVICE=ppp0
PROVIDER=DSLppp0
ETH=eth0

檔名:/etc/sysconfig/network-scripts/ifcfg-ppp1
代碼: [選擇]

USERCTL=yes
BOOTPROTO=dialup
TYPE=xDSL
ONBOOT=yes
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=20
LCP_FAILURE=3
LCP_INTERVAL=80
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
DEFROUTE=yes
SYNCHRONOUS=no
USER='********@hinet.net'
PEERDNS=no

PIDFILE=/var/run/pppoe-adsl1.pid
NAME=DSLppp1
DEVICE=ppp1
PROVIDER=DSLppp1
ETH=eth0:0

小結:
實際與網際網路溝通的是ppp介面,所以每一個ppp設定檔可以取得一個IP,相信原則是每一
個ppp介面必須對應到一個硬體設定檔(不論它是實體或虛擬的)

********************其它的設定檔********************
多條線路:
檔名:/etc/ppp/chap-secrets
這個檔案存放了ADSL業者給的帳號及密碼的資料,所以當有多條線路時就會有多個帳號與
密碼了,所以只要將第一個帳號密碼複製過去
(中間可能有不是空白的非可視字元所以應整列複製後在予以修改帳號及密碼,如果是直
接依其格式輸入則程式在讀取時可能會失敗),

開機啟動:
檔名:/etc/rc.local
這個檔案很精彩(重要)了,目前以一條線路一塊網卡取得兩個IP的狀況下是這樣的:
代碼: [選擇]

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

PTABLES=/sbin/iptables
GREP=/bin/grep
AWK=/bin/awk
SED=/bin/sed
IFCONFIG=/sbin/ifconfig
IP=/sbin/ip

ifup ppp0
ifup eth0:0
ifup ppp1

IPPPP0="`$IFCONFIG ppp0 | $GREP 'inet addr' | $AWK '{print $2}' | $SED -e 's/.*://'`"
IPPPP1="`$IFCONFIG ppp1 | $GREP 'inet addr' | $AWK '{print $2}' | $SED -e 's/.*://'`"

$IP rule add pref 10 from $IPPPP0 table 10
$IP rule add pref 20 from $IPPPP1 table 20

GWPPP0="`$IFCONFIG ppp0 | $GREP 'inet addr' | $AWK '{print $3}' | $SED -e 's/.*://'`"
GWPPP1="`$IFCONFIG ppp1 | $GREP 'inet addr' | $AWK '{print $3}' | $SED -e 's/.*://'`"

$IP route replace default via $GWPPP0 dev ppp0 table 10
$IP route replace default via $GWPPP1 dev ppp1 table 20

$IP route replace default scope global nexthop via $GWPPP0 dev ppp0 weight 1 nexthop via $GWPPP1 dev ppp1 weight 1

其中有個命令要特別注意(剛剛測出來的,本人也只敢測到這邊,其它的完全不瞭所以不測)
ifup eth0:0這一個命令一定要加進去在將此命令刪除的測試中clinet端電腦ping時也只能
通一個IP而第二個ppp1是ping不通的,所以當有第三個IP時應該要ifup eth0:1再ifup ppp2
依此類推,所以這裡也是要對應的;而在沒有此檔的設定時在前幾天取得兩個IP的情況下都
是只有一個IP能通另一個不通的情形,除非是以root跑netman大大所寫的run_ip.sh才能通
(他自己說是"小複雜"啦...以vi打開一看...花團錦蔟(常數,變數,引數..)十分精彩(指令,命令,口令)的,一點都不"小"複雜)

以上資料要非常感謝kuolung大大熱心的提供,謝謝

參考資料:
http://www.study-area.org/tips/multipath.htm
http://www.uplooking.com/content/view/2549/2/
http://phorum.study-area.org/viewtopic.php?t=44511
[書]:鳥哥的LINUX私房菜-伺服器架設篇-第9章
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼