本文主要是介绍PPPoE服务搭建与交互流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
环境使用Ubuntu 16.04.5 LTS系统主机,使用apt-get安装pppoe服务端:
$ sudo apt-get install pppoe
$ pppoe-server -h
PPPoE-Server Version 3.11, Copyright (C) 2001-2009 Roaring Penguin Software Inc.
PPPoE-Server comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under the terms of the GNU General Public License, version 2
or (at your option) any later version.
http://www.roaringpenguin.com
由pppoe-server的-h的帮助信息可见,ubuntu集成的是Roaring Penguin开发的pppoe服务端程序,版本为3.11。通过查看RP的官网,可看到其pppoe服务端已经更新到了3.13版本,源代码可由此下载:https://dianne.skoll.ca/projects/rp-pppoe/download/rp-pppoe-3.13.tar.gz。此处我们仍使用ubuntu集成的3.11版本。
安装完成之后,需要修改三个配置文件,设置pppoe-server工作。
文件1:/etc/ppp/pppoe-server-options,如果此文件不存在,需要手动创建,填写一下三行内容,设置认证方式为CHAP,log文件保存位置/var/log/pppoed.log,log文件的名字可任意指定。
$ cat /etc/ppp/pppoe-server-options
auth
require-chap
logfile /var/log/pppd.log
文件2:/etc/ppp/options,此处包含三个配置,为windows客户端指定DNS服务器;禁用PAP认证,打开CHAP认证。
$ cat /etc/ppp/options
# /etc/ppp/options# Specify which DNS Servers the incoming Win95 or WinNT Connection should use
# Two Servers can be remotely configured
ms-dns 192.168.1.1# Don't agree to authenticate using PAP.
-pap# Require the peer to authenticate itself using CHAP [Cryptographic
# Handshake Authentication Protocol] authentication.
+chap
文件3:/etc/ppp/chap-secrets,此处设置CHAP认证方式使用的用户名与密码,以及客户端IP地址。可为不同的客户端指定不同的认证用户名和密码。这里使用*代表所有的客户端使用相同的认证信息。
$ sudo cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
test * 123456 *
至此pppoe服务端配置完成。如果需要转发数据包,还要打开本机的转发选项。
修改配置,重启之后有效
sudo vi /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
临时打开转发,重启后失效:
echo 1 > /proc/sys/net/ipv4/ip_forward
启动PPPoE服务端,指定绑定的接口,本地IP地址,以及为客户端分配的IP起始地址(30.30.3.13),-N指定允许连接的客户端数量:
sudo pppoe-server -I eth3 -L 30.30.3.9 -R 30.30.3.13 -N 10
使用PPPoE客户端连接成功之后,可通过log文件查看:
$ cat /var/log/pppoed.log Using interface ppp0
Connect: ppp0 <--> /dev/pts/9
local IP address 30.30.3.9
remote IP address 30.30.3.13
查看本地接口信息,与log信息相符,ppp0接口的本地IP为30.30.3.9,远端(PPPoE客户端)的IP地址为30.30.3.13:
$ ip addr6: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:90:27:fe:d0:04 brd ff:ff:ff:ff:ff:ffinet 30.30.3.9/24 brd 30.30.3.255 scope global eth4valid_lft forever preferred_lft forever
16: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc pfifo_fast state UNKNOWN group default qlen 3link/ppp inet 30.30.3.9 peer 30.30.3.13/32 scope global ppp0valid_lft forever preferred_lft forever
使用TCPDUMP抓取PPPoE交互的数据包,流程如下:
上图可见,首先是4个PPPoED交互数据包,仅看一下第一个数据包PADI的格式:
其后为典型的PPP协商数据包。LCP协商认证方式与压缩算法等:
客户端的认证过程由3个PPP CHAP数据包完成(我们配置使用CHAP方式认证),PPPoE服务端发送CHAP Challenge数据包到客户端,客户端基于test用户的密码对Challenge数据进行hash计算,将结果返回给服务端,服务端验证一致性,返回认证成功给客户端,即最后一个PPP CHAP报文(Access granted),第二个客户端发往服务端的交互报文携带明文的用户名称(test),存在泄漏风险。
最后看一下IPCP Nak报文,其传输分配给客户端的IP地址(30.30.3.13)与DNS配置信息(192.168.1.1)。
至此初始的交互完成。LCP将一直发送echo/replay数据包检测链路,如下为Echo Reply(10), Echo Request的Code代码为(9):
完。
这篇关于PPPoE服务搭建与交互流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!