起源是這樣的,呆呆翰為了順暢的玩某個有鎖IP的日本網頁遊戲,終於下定決心去租用日本當地的VPS主機當跳板用了,結果在設定得時候發現ConoHa這間VPS的廠商,雖然可有提供安裝Ubuntu的選項,卻沒有提供購買額外IP在Ubuntu設定方式(Ubuntu源自Debian,他們的設定都長得蠻像的;Cent OS源自Rad Hat Enterprise)。
最開始,呆呆翰想說就照著廠商給的步驟設定,用ifconfig -a確認網路卡MAC位置,OK;編輯/etc/sysconfig/network-script/ifcofg-eth1,恩……等等Debian只有/etc/network/interfaces這個檔案吧,我看看……
DEVICE="eth1" < =eth1的狀況
HWADDR="FA:16:XX:XX:XX:XX" <= 確認的MAC Address寫這裡
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR="157.XXX.XXX.XXX" <=另外購買的IP寫在這邊
NETMASK="255.255.254.0"
所以寫成/etc/netwoek/interfaces就長這樣嘛:
iface eth1 inet static
address 157.XXX.XXX.XXX
netmask 255.255.254.0
有驚無險的搞定了,那接下來呢,路由表的設定,之前比賽學過一點點,應該可以吧:
# vi /etc/iproute2/rt_tables
201 gw1 < = 寫入適合的名稱
看起來沒甚麼問題,這個檔案我也有,就宣告一張路由表,名子讓我取嘛~
設定完第二、第三張路由表,接著就設定「閘道(Gateway)」:
# vi /etc/sysconfig/network-scripts/route-eth1
default via 157.X.X.1 table gw1 <= 加購IP的閘道寫在這裡
糟糕,Debian/Ubuntu沒有這個設定檔啊,不過看起來就是設定閘道嘛,我寫(錯誤示範):
gateway 157.X.X.1
寫下去的後果也很簡單,因為一張路由表只能有一個預設閘道,所以加購的IP可以用、原本的IP卻不能用了……
怎麼辦,只好稍微觀察觀察一下這個內容:
default via 157.X.X.1 table gw1
對Linux有點概念的都知道,「Linux系統=Linux核心+一堆軟體+一堆設定工具」,其中設定工具很多也都是ShellScript,就算工具不一樣最後也都會做一樣的事情。而這個檔案感覺就是某個網路設定的指令後面的參數,但不知道是哪個指令,只少慢慢摸索……
最後,在沒有其他參考資料的狀況下,大概得到以下結論:
如果network-scripts裡面有個檔案是route–eth1,內容是
default via 157.XXX.XXX.1 table rt1
RedHat系的Linux就會把它轉成以下的指令去:
ip route default via 157.X.X.1 dev eth1 table rt1
而network-scripts裡面的rule–XXX也是差不多的方式:
ip rule 檔案內容 dev XXX 指定的路由表
知道了指令怎麼打,果然讓對外IP暢通了(寫得很輕鬆,實際上研究了五個小時才知道這是怎麼來的),接著該怎麼讓它「一開機就設定好」呢?在/etc/network/interfaces裡面,可以自訂「介面卡啟動後,要輸入那些指令」,只要前面加個post-up就可以了。所以最後的interfaces檔案內容長這樣:
iface eth1 inet static
address 157.XXX.XXX.XXX
netmask 255.255.254.0
#提醒自己曾經犯下的蠢錯
#gateway 157.XXX.XXX.1
post-up ip route add default dev eth1 via 157.XXX.XXX.1 table rt2
post-up ip rule add from 157.XXX.XXX.XXX/32 table rt2