首先,我們通過介質(網線)連接到ISP的主機,這時候我們的機器只能和ISP通訊,除此之外就不能幹其他的事情了。
然後我們需要和ISP協商我想訪問外網輸入用戶名密碼,通過他的驗證後,他就會分配一個IP地址,讓你訪問外網了。
從中我們可以看出,如果我們想進行PPPOE撥號的開發驗證,如果我們使用家裏用的網線撥號會將是一個非常痛苦的情況,
我很難經行調試跟蹤。 所以,我們需要搭建一個pppoe服務器,然後用我們pppoe客戶端驗證。
清單:1、linux主機一臺(虛擬機的情況測試失敗){這裏還可以用RASPPPOE_099.ZIP window server的程序,在win7無法安裝,之後沒有嘗試}
2. rp-pppoe-3.8.tar.gz
3. wireshrk 軟件
首先,我們先解決重點的問題 android的pppoe移植,pppd程序安卓已經幫我們搞定了,我們就不折騰了。
【andorid源碼環境】沒有話我也不知道怎麼往下說了。
然後我們開始
#在andorid目錄下我們建立一個文件夾放pppoe的程序,我們可以看到pppd這個程序也在android/external/ppp下,我們照葫蘆畫瓢先建立一個文件夾叫pppoe
mkdir xxxxxx/android/external/pppoe/
#然後把rp-pppoe-3.8.tar.gz 裏面的src目錄扔到pppoe目錄裏,然後新建一個Android.mk
最後的效果pppoe目錄下: Android.mk src
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)
#開始編譯了,先到andorid源碼的根目錄
. build/envsetup.sh
lunch
#這裏選擇一個產品,
cd external/pppoe
mm
#發現編譯出錯的那個文件,給編譯錯誤的文件加上一些代碼
/* Structure used to connect() the socket to a particular tunnel UDP
* * socket over IPv6.
*
*/
struct pppol2tpin6_addr {
__kernel_pid_t pid; /* pid that owns the fd.
* 0 => current */
int fd; /* FD of UDP socket to use */
__u16 s_tunnel, s_session; /* For matching incoming packets */
__u16 d_tunnel, d_session; /* For sending outgoing packets */
struct sockaddr_in6 addr; /* IP address and port to send to */
};
/* The L2TPv3 protocol changes tunnel and session ids from 16 to 32
* bits. So we need a different sockaddr structure.
*/
struct pppol2tpv3_addr {
pid_t pid; /* pid that owns the fd.
* 0 => current */
int fd; /* FD of UDP or IP socket to use */
struct sockaddr_in addr; /* IP address and port to send to */
__u32 s_tunnel, s_session; /* For matching incoming packets */
__u32 d_tunnel, d_session; /* For sending outgoing packets */
};
struct pppol2tpv3in6_addr {
__kernel_pid_t pid; /* pid that owns the fd.
* 0 => current */
int fd; /* FD of UDP or IP socket to use */
__u32 s_tunnel, s_session; /* For matching incoming packets */
__u32 d_tunnel, d_session; /* For sending outgoing packets */
struct sockaddr_in6 addr; /* IP address and port to send to */
};
#重新編譯
pppoe程序就OK了,然後放到andrid system/bin 目錄下
#安卓pppoe服務端
#解壓
#./go
#安裝完畢
配置服務器
1.vim /etc/ppp/pppoe-server-options
對server進行配置
# PPP options for the PPPoE server
# LIC: GPL
auth #鏈接時候驗證
require-chap #CHAP認證
# login #鏈接後驗證
lcp-echo-interval 10 #每10秒發送心跳信令request
lcp-echo-failure 2 #連續兩條心跳信令reply沒有回覆斷開鏈接
2、這樣在建立ppp鏈接的Discovery階段就會進行驗證,server保存的驗證用戶名,密碼就在/etc/ppp/chap-secrets裏面:
vim /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
usr * 123 *
3.start server
pppoe-server -I wlan0 -L 192.168.5.1 -R 192.168.5.5 -N 10 #啓動服務
# -I wlan0 因爲我是用wifi上網這裏的節點號是wlan0, -L 主機地址這個是虛擬的隨便取即可,-R 是分配的起始IP地址 -N 一共可以分配的IP地址數量
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -j SNAT --to-source 192.168.0.141
#這裏--to-source 192.168.0.141 這個地址是實際的服務器的物理網卡ip地址
echo "1">/proc/sys/net/ipv4/ip_forward //開啓ipv4的轉發功能 ,不設置這步導致客戶端無法上網
#這樣服務器就已經完成了,忘記了幹一件事情我們把調試的工具安裝好
sudo apt-get install wrieshark
#打開這個程序遇到了一些狀況
出現原因:權限不夠,所以不能夠讀取網卡
我們需要 setuid
root@u-VirtualBox:/home/u/a20/android# whereis dumpcap
dumpcap: /usr/bin/dumpcap /usr/bin/X11/dumpcap /usr/share/man/man1/dumpcap.1.gz
chmod 4755 /usr/bin/dumpcap
我們監控一下wlan0 ,過濾條件是ppp||pppoed
下面我們來看客戶端的情況
pppd pty ‘/system/bin/pppoe -I wlan0 ′ user usr password 123
忘記了必須讓服務器端和客戶端處在同一個網段下。
我們觀察獲取一下pppoed鏈接的包是否有,如果有恭喜環境神馬的都對了,如果沒有先用windows pppoe 撥號嘗試一下是否收到包
如果不能的話,檢查是否在同一個局域網,然後看服務是否起來,另外虛擬的情況的橋接可以跟宿主機通訊 NAT和橋接和其他機器測試都發現不可以
如果正常的話:我們可以觀察到建立鏈路和協商的包
1.廣播 ff:ff:ff:ff:ff:ff code 0x09(active discovery initiation PADI) session_id 0x0000 想介入集線器提出要求提供服務
2.集線器收到PADI 發送PPPoe有效發現提供 PADO包相應請求 code 0x07(active discovery offer PADO) session_id 0x0000
3.主機可能收到多個PADO包 選擇一個合適的,然後想鎖選擇的介入集線器發送PPPOE有效發現請求PADR 0x19 session_id 0x0000
4.接入集線器收到ADDR 後準備PPP 會話 發送一個PPPoe有效發現會話確認 PADS 0X65 SESSION_ID爲介入集線器產生的唯一PPPoe會話標誌號碼
PADT 指示PPP會話終止, code 0xa7, 終止會話的session_id
第四步有兩種奇怪,如果密碼錯誤或者服務器端配置書寫錯誤都會直接斷開連接發送PADT命令
鏈路建立成功。我們在andorid可以看到分配出192.168.5.x的一個ip地址,(我們測試的話本來局域網就能上網有些不太方便)
現在路由表還是有問題的上網決定是用的wlan0或者eth0上網,還需要配置一下路由表和dns
busybox route add -net 0.0.0.0 netmask 0.0.0.0 dev ppp0
busybox route add default gw 192.168.5.1 dev ppp0
#這裏兩條都可以,實際用isp的情況未測試。
setprop net.dns1 114.114.114.114 #這裏不明白dns能否直接獲取到,設置成114發現可用
.