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/pppvim pppoe.conf
修改下面几个值,其他的不要动
ETH=eth0
USER=rp-pppoe
LINUX_PLUGIN=/etc/ppp/plugins/rp-pppoe.so
vim pppoe-server-options
下面是全部内容
require-paprequire-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 指定pppoeserver的IP地址
-R 为客户分配的起始IP地址
-N 指定分配给客服端IP地址的个数
-k 使用内核模式现在就可以用pppoe客户端来连接我们已经运行的pppoeserver了,用户名和密码为上面设置的
rp-pppoe和rp-pppoe,认证方式为CHAP
但是客户端连接上去后不能上网,因为服务器那边没有进行数据包的转发。
虚拟机添加了2块网卡,eth0和eth1,eth0是静态IP,eth1为DHCP方式获取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=Ethernetvimifcfg-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.206是linux下eth1的IP,每次局域网网关收到eth0上的数据,然后把源IP改成eth1的IP,目的IP不变,
广域网网卡收到远端服务器返回的数据,就把目的IP修改成内网主机pppoe的IP。
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 包负责会话阶段的数据传输。
转载于:https://blog.51cto.com/devingeng/1358368