搭建 PPPOE 拨号上网

简介:

PPPoE是point-to-point protocol over ethernet的简称,可以使以太网主机通过一个简单的桥接设备连到一个远端的接入集中器上。通过pppoe协议,远端接入设备能够实现对每个接入用户的控制和计费。rp-PPP0E是一个集成了拨号客户端和服务端的解决方案
下载地址:http://www.roaringpenguin.com/products/pppoe


编译、安装的步骤:
rp-pppoe-3.10.tar.gz  /opt 目录下。

tar -zxvf rp-pppoe-3.10.tar.gz
cd rp-pppoe-3.10/src
./configure
make
make install


修改配置文件:
cd /etc/ppp

vim pppoe.conf
修改下面几个值,其他的不要动
ETH=eth0
USER=rp-pppoe
LINUX_PLUGIN=/etc/ppp/plugins/rp-pppoe.so


vim pppoe-server-options
下面是全部内容
require-pap

require-chap

login

lcp-echo-interval 10

lcp-echo-failure 2

logfile /var/log/pppoe.log

ms-dns 218.108.248.200

ms-dns 8.8.4.4

defaultroute


vim chap-secrets
rp-pppoe  *  rp-pppoe  *

以上表示用户名和密码都是rp-pppoe


vim options
local

运行程序:
(用户模式)
/usr/sbin/pppoe-server -I eth0 -L 10.0.0.1 -R 10.0.0.2 -N 64

-I 指定局域网网卡
-L 
指定pppoeserverIP地址
-R 
为客户分配的起始IP地址
-N 
指定分配给客服端IP地址的个数
-k 
使用内核模式

现在就可以用pppoe客户端来连接我们已经运行的pppoeserver了,用户名和密码为上面设置的
rp-pppoe
rp-pppoe,认证方式为CHAP
但是客户端连接上去后不能上网,因为服务器那边没有进行数据包的转发。
虚拟机添加了2块网卡,eth0eth1,eth0是静态IPeth1DHCP方式获取IP

需要修改下配置脚本

cd/etc/sysconfig/network-scripts
vim ifcfg-eth0

#Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=lan
IPADDR=192.168.61.120
NETMASK=255.255.255.0
GATEWAY=192.168.61.1
DNS1=61.139.2.69
DNS2=192.168.61.1
HWADDR=00:0c:29:6b:71:d6
ONBOOT=yes
BOOTPROTO=static
USERCTL=no
IPV6INIT=yes
NM_CONTROLLED=yes
TYPE=Ethernet

vimifcfg-eth1

TYPE="Ethernet"
HWADDR=00:0C:29:6B:71:E0
BOOTPROTO=dhcp
DEVICE=wan
ONBOOT=yes


开启数据包转发

echo"1">>/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

好了,现在客户端这边就可以上网了。

下面是 etherPeek 抓包的截图,pppoe发现阶段已经省去,只是TCP3次握手和4次挥手的抓包。
10.0.0.10
pppoe客户端的IP,192.168.61.206linuxeth1IP,每次局域网网关收到eth0上的数据,然后把源IP改成eth1IP,目的IP不变,
广域网网卡收到远端服务器返回的数据,就把目的IP修改成内网主机pppoeIP

TCP3次握手

4次挥手





PPPoE 的验证过程
PPPoE 的验证过程包括 2 个阶段,Discovery 阶段和 PPP Session 阶段。
Discovery 阶段,包含 4 个步骤:
Step 1: PADI
PPPoE 
客户端发送主动发现初始包(PPPoE Active Discovery Initiation,PADI),以太头中的目的地址是以太广播地址 FF:FF:FF:FF:FF:FF,PPPOE 头中的 CODE 为 0x09,SESSION_ID 值必须为 0,负载部分必须只包含一个 Service-Name 类型的 TAG 表示请求的服务类型,另外可以包含其他 TAG,整个 PPPOE 包不能超过 1484 字节;
Step 2: PADO
服务器端 PPPoE 进程在网络接口侦听到 PADI 包后,发送主动发现提议包(PPPoEActive Discovery Offer, PADO),用来回应客户机的 PADI 包,以太头中的目的地址是客户机的MAC 地址,PPPOE 头中的 CODE 为 0x07, SESSION_ID 值必须为 0,负载部分必须包含一个 AC-Name 类型的 TAG,用来指示本 AC 的名称,一个在 PADI 包中指定的Service- Name 的 TAG,另外可以包含其他 Service-Name 的 TAG。如果 AC 不对该客户机提供服务,AC 就不回应 PADO 包。
Step 3: PADR
PPPoE 
客户端收到 PADO 包后,在 PADO 包中选择一个(可能有多个 PPPoE 服务器,通常选取最快的一个)发送主动发现请求包(PPPoEActive Discovery Request,PADR),以太头中的目的地址是所选取的 PADO 包的源以太头地址(即 PPPoE 服务器的 MAC 地址),PPPOE 头中的 CODE 为 0x19,SESSION_ID 值必须为 0,负载部分必须只包含一个 Service-Name 类型的 TAG 表示请求的服务类型,另外可以包含其他 TAG
Step 4: PADS
MAC 
地址匹配的 PPPoE 服务器收到 PADR 包后,发送主动发现会话确认包(PPPoE Active Discovery Session-confirmation, PADS),将产生一个SEESSION_ID 值用来标志本次 PPP 会话,以 PADR 包方式发送给客户机。以太头中的目的地址是客户机的 MAC 地址,PPPOE 头中的 CODE 为 0x65,SESSION_ID 值必须为所生成的那个SESSION_ID,负载部分必须只包含一个 Service-Name 类型的 TAG表示该服务类型被 PPPoE 服务器接受,另外可以包含其他 TAG。如果 PPPoE 服务器不接受 PADR 中的

Server-Name,PADS 中则包含一个 Service-Name -Error 类型的 TAG,这时 SESSION_ID 设置为 0


PPP Session 阶段:
当客户端与服务器端远成发现阶段之后,即进入会话阶段,在 PPP 会话阶段,PPP 包被封装在 PPPOE 以太帧中,以太包目的地址都是单一的,以太协议为 0x8864,PPPOE 头的CODE必须为0,SESSION_ID必须一直为发现阶段协商出的SEESION_ID值,PPPOE的负载是整个 PPP 包,PPP 包前是两字节的 PPP 协议 ID 值。
在 Session 阶段,主机或服务器任何一方都可发 PADT(PPPoE Active Discovery Terminate)报文通知对方结束 Session


PPPoE 的身份验证发生在会话(PPP Session)阶段。可以这样更解,rp-pppoe 包负责Discovery 及会话终止 PADT,ppp 包负责会话阶段的数据传输。


本文转自Devin 51CTO博客,原文链接:http://blog.51cto.com/devingeng/1358368


相关文章
|
2月前
|
设计模式 网络协议 安全
《网络是怎么样连接的》 - ADSL
《网络是怎么样连接的》 - ADSL
27 0
|
Shell 网络安全 Python
ADSL拨号代理的搭建
ADSL拨号代理的搭建
217 0
|
数据安全/隐私保护 网络架构
PPPoE拨号小案例配置
PPPoE拨号小案例配置
136 0
PPPoE拨号小案例配置
|
网络协议 数据库 网络虚拟化
|
网络协议 Shell 网络架构
|
数据安全/隐私保护 网络架构 内存技术