最近手養跟同學借了 3(.5)G 的無限網卡 Bandluxe C270, 然後去申請了Hinet 3G, 3天的. 主要是因為我宿舍這邊網路是用NAT,外面根本連不進來,網管大概也是外面請來的我也沒辦法要求什麼。所以想說如果辦了3G 平常出去可以上網,到學校的時候有無限網路,網卡就可以插在家裡PC 透過3G 連進來。
總而言之,去申請了3天250的方案(好貴)試看看。第一部分先是網卡&播號...
sudo eject /dev/sr1 #原本的光碟機是 sr0, 網卡的是 sr1)
#下完指令成功以後要等一下 等device 切換模式
sudo modprobe usbserial vendor=0x1a8d product=0x1009 #(可以用 lsusb 看)
成功的話在這邊看 dmesg|tail 應該可以看到ttyUSB0, 1, 2 被產生出來(可能需要等個幾秒),然後使用 wvdial:
如果懶的自己設定, 可以用 wvdialconf, 他會自動偵測然後寫入/etc/wvdial.conf, 不過我想大部分的設定並不會差到哪裡去,用寫好的就可以了,這邊是我的設定:
[Dialer pin]
Init1 = AT+CPIN=0000
Baud = 9600
Modem = /dev/ttyUSB0
[Dialer Defaults]
Init3 = ATQ0 V1 E1 +FCLASS=0
Init4 = AT+CGDCONT=1,"IP","internet"
Modem Type = Analog Modem
Phone = *99#
ISDN = 0
Username = "123"
Init2 =
ATZ
Password = "456"
Modem = /dev/ttyUSB0
Baud = 9600
New PPPD = 1
Auto DNS = off
Auto Reconnect = on
因為每一次接上電腦都需要先輸入pin code,可是又不是每次都需要,所以分成兩個:剛接上以後,eject 了,就用 wvdial pin 來播號,之後直接 wvdial 就可以了。
播號了以後會產生另一個 pppd,在我的電腦以 ppp0 的裝置顯示,同時如果看 route -n 會看到類似這樣的結果
10.64.64.64 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
這邊10.64.64.64 就是要用ppp0 連出去時的 gateway。
由於我的宿舍是用NAT,本身電腦就接著NAT,開機時自動設的gateway 也是經由宿舍出去,這樣別人就算想要由3G device 進來建立連線時,出去的封包還是會經由NAT,甚至被濾掉,這不是我想要的,於是我問了朋友該怎麼辦,他跟我講的解法是用ip route:
我要讓從 ppp0 連進來的連線中傳送出去的封包也透過 ppp0 而不是 default gateway (eth0),這相當於"source 是 ppp0 的封包要由 ppp0 送出,而不是 eth0 (接NAT)",這樣的規則透過 ip route 可以解決。
首先建立一個 ip route table (root):
在 /etc/iproute2/rt_tables 增加一個 ip route table
1 c270
然後在裡面設定 default gateway:
ip route add default via 10.64.64.64 dev ppp0 table c270
再來只要把 source 是 ppp0 的封包都套用 c270 就可以了:
ip rule add from [addr] table rt1
其中addr 是你撥接後對外的 ip,這個用 ifconfig ppp0 | perl -ne 'print "$1\n" if /inet addr:([\d\.]*)/' 可以取得,這樣就可以由外面連進來了。
不過因為過程中需要知道撥接取得的ip,所以要在撥接後設定才有用,而且pppd 結束了以後route table 會被清掉(找不到ppp0),ip rule 的設定卻會殘留(沒用的設定),如果能寫成 pppd 的 post-up script, post-down script 應該會很方便... 有時間來寫..