andorid pppoe撥號上網

簡單介紹一下PPPOE撥號

首先,我們通過介質(網線)連接到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發現可用




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章