星期三, 9月 09, 2009

Ubuntu C270 setup (續)

昨天晚上試了一下,把ip route 的部分寫成 pppd post-up script,也就是pppd up 以後會執行的script。由於pppd 的up script 是共用的,所以我用 ipparam 來指定是否需要執行ip routing 的設定。
這個設定是基於上一篇 的下半部,所以如果需要可能要看一下。
首先先在 /etc/ppp/ip-up.d/ 加入下面這個檔案 (以下以 root 身份執行)
iproute:
#!/bin/bash

if [ ${6} == "AUTOROUTE" ]
then
IP_ADDR=${4}
IP_GW=${5}
ip route add default via ${IP_GW} table c270
ip rule add from ${IP_ADDR} table c270
fi
並設定為可執行
chmod +x /etc/ppp/ip-up.d/iproute
同樣在 /etc/ppp/ip-down.d/ 加入以下檔案
iproute
#!/bin/bash

if [ ${6} == "AUTOROUTE" ]
then
IP_ADDR=${4}
ip rule del from ${IP_ADDR}
fi

同樣設定為可執行
chmod +x /etc/ppp/ip-down.d/iproute
然後在 wvdial 的地方,加上 ipparam 的參數,在pppd up 以後會傳給script 的。
/etc/ppp/peers/wvdial:
加上
ipparam AUTOROUTE
這樣就會在連線建立完以後自動加上ip rule, route table,連線完也會自己刪除

星期二, 9月 08, 2009

Ubuntu C270 setup

最近手養跟同學借了 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 應該會很方便... 有時間來寫..

星期六, 9月 05, 2009

libfreemsn

最近手養,著手寫了一個 msn 的 library。
目前我找到的 msn library 要嘛就是叫高階語言寫的(C#, Java.. 其實有些都寫的很完整了) 要不然就是用 GPL 釋出的。當然用 GPL 沒什麼不好,就是限制多了點。我希望能用 C 寫一個 Library,這樣 port 到 Perl 也很方便(有萬能XSUB)。

總而言之,我就刻了一個 library ,目前放在github,以 BSD Licence 釋出的。還在開發階段,只能傳送/收訊息而已,不過有興趣的人可以看看。

code 寫的很亂不要笑我 :p

github: http://github.com/freehaha/libfreemsn/tree/master