实验环境搭建,满足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
LOCAL_CFLAGS += '-DVERSION="3.10"' \
'-DPPPD_PATH="/system/bin/pppd"'
include $(BUILD_EXECUTABLE)
include $(call all-makefiles-under,$(LOCAL_PATH))
于是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 add default 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