Android實現pppoe撥號上網(二)具體步驟
實驗環境搭建,滿足pppoe鏈接的基礎服務,就是保證ppp協議能夠封裝在以太網框架中的一種網絡隧道協議,因為集成了ppp協議,所以實現了創痛以太網不能提供身份驗證,加密和壓縮的功能。本質上,它是一個允許在以太網廣播域中的兩個以太網接口間創建ppp協議隧道。它使用傳統的基于PPP的軟件來管理一個不是使用串行線路而是使用類似于以太網的有向分組網絡的連接。這種有登陸和口令的標準連接,方便了接入供應商的記費。并且,連接的另一端僅當PPPoE連接接通時才分配IP地址,所以允許IP地址的動態復用。
---wiki : http://zh.wikipedia.org/zh-cn/PPPoE
(PPPoE及TCP/IP協議棧)
(一)pppoe-server
也就是PC機器,我這邊只說linux系統下面的情況,我的是Ubuntu系統,下載rp-pppoe: http://www.roaringpenguin.com/products/pppoe
按照里面的README來要求來安裝rp-pppoe。最簡單的就是default直接運行go腳本。然后PC機器就可以運行pppoe-server命令了。不要急,還要對server進行配置,配置文件在/etc/pppoe-server-options,打開進行改寫。我的配置如下:
# PPP options for the PPPoE server # LIC: GPL auth #鏈接時候驗證require-chap #CHAP認證# login #鏈接后驗證 lcp-echo-interval 10#每10秒發送心跳信令request lcp-echo-failure 2#連續兩條心跳信令reply沒有回復斷開鏈接
保存退出,這樣配置完成,這樣在建立ppp鏈接的Discovery階段就會進行驗證,server保存的驗證用戶名,密碼就在/etc/ppp/chap-secrets里面:
# Secrets for authentication using CHAP # client server secret IP addresses"user_xiaokeweng" * "my_password" *
其中各個字段的含義,顧名思義,*指代all。最后在PC端啟動pppoe-server,輸入命令:
sudo pppoe-server -I eth0
(二)pppoe-client
在android上面移植pppoe模塊,同樣使用rp-pppoe,我們可以build成模塊移植到android終端上面,需要自己寫make file,我這邊是用Android.mk:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:=\ src/pppoe.c \ src/if.c \ src/debug.c \ src/common.c \ src/ppp.c \ src/discovery.c LOCAL_MODULE_PATH := $(LOCAL_PATH) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := pppoe LOCAL_C_INCLUDES += $(LOCAL_PATH)/src include $(BUILD_EXECUTABLE)
于是build出來pppoe可執行模塊,push到/system/bin下面,當然可以直接改寫rp-pppoe的makefile。于是在終端就可以發起pppoe鏈接請求了。
(三)運行測試
(1)首先要保證Client,Server都在一個廣播域中,按照前文中的思路,手持終端是通過wifi,鏈接到接入LAN中的無線路由器中,而PC是直接接入到LAN中的。
(2)adb進入設備終端后,輸入
/system/bin/pppoe -d
就會發起Discorvery,在廣播域內廣播PADI報文,成功的話會返回發現的pppoe-server的MAC地址,并且在PC端抓包eth0的話,使用ppp||pppoed進行過濾,能夠收到終端的廣播報文。這樣就能說明已經實現pppoe通路。接著:/system/bin/pppd pty "/system/bin/pppoe -I wlan0" user user_xiaokeweng password my_password
這樣就會發起pppoe鏈接,經過Discovery,認證,LCP,最終建立其ppp鏈接。在PC端會看到新建立起來的ppp0,Client端也會看到。
(四)后續配置
(1)PC端配置iptable使終端的數據包能夠請求訪問internets
echo 1 > /proc/sys/net/ipv4/ip_forward //打開iptable,該命令切換到root運行 iptables -t nat -F //清空表項 iptables -t nat -L //現實表項 iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to 192.168.163.254 //-s 為終端獲得的ip,--to 為ethx 的ip
(2)在終端增加路由表項目
ip -d route //查看路由表項 ip route del default//刪除掉全部default,需要操作多遍 ip route adddefault dev ppp0 //將默認路由設為ppp0 ip -d route //再次查看
(3)配置dns
這樣操作的話是不需要設置dns的,因為鏈接wlan的時候,使用的dns-server與現在的是完全一樣的,如果經過上述操作,能夠ping通internet但是不能夠正常上網的話,一定就是dns的問題了。
getprop
net
.dns1
//查看默認路由1
getprop
net
.dns2
//查看默認路由2
setprop
net
.dns1
110
.112
.120
.115
//設置默認路由1
setprop
net
.dns2
110
.112
.120
.114
//設置默認路由2