CentOS5.8安装配置PPPoE服务器以及问题总结
rp-pppoe是一个集成了拨号客户端和服务端的解决方案
1.下载
https://www.roaringpenguin.com/products/pppoe
2.编译安装:
将rp-pppoe-3.11.tar.gz 放到 /opt目录下
cd /opt
tar -zxvf rp-pppoe-3.11.tar.gz
cd /opt/rp-pppoe-3.11/src
./configure
2.1这时如果出现错误“no acceptable C compiler found in $PATH"
则运行 yum install gcc 安装GCC软件套件
再次运行./configure
成功
make
make install
3.接下来修改PPPoE配置文件
vi /etc/ppp/pppoe.conf
修改以下几个参数值
ETH=eth1
USER=rp-pppoe
LINUX_PLUGIN=/etc/ppp/plugins/rp-pppoe.so
vi /etc/ppp/pppoe-server-options
# PPP options for the PPPoE server
# LIC: GPL
require-pap
require-chap #added by Liping
login
lcp-echo-interval 10
lcp-echo-failure 2
#following added by Liping
logfile /var/log/pppoe.log
ms-dns 114.114.114.114
defaultroute
vi /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
####### redhat-config-network will overwrite this part!!! (begin) ##########
####### redhat-config-network will overwrite this part!!! (end) ############
rp-pppoe * rp-pppoe *
表示用户名和密码都是rp-pppoe
vi /etc/ppp/options
#lock
local
4.添加防火墙规则,做nat转换
设置iptables的IP策略
iptables -A POSTROUTING -t nat -s 10.0.0.0/24 -j MASQUERADE
注:-s 参数后面的网络地址是一会儿将要开启的pppoe-server设置的网络地址,这个地址可以根据需要自己设定,只要iptables和pppoe-server匹配就好。
iptables -A FORWARD -p tcp --syn -s 10.0.0.0/24 -j TCPMSS --set-mss 1256
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
第一条是添加nat,转换来自10.0.0.0/24网段的ip
第二天是修改mtu,根据自身需求改了
第三条打开转发
第四条是修改转发文件
5.运行程序: pppoe-server -I eth1 -L 10.0.0.1 -R 10.0.0.2 -N 20
注:
-I 参数用于指定监听哪个网络端口。可以使用ifconfig命令查看当前工作的端口名称。
-L 参数用于指定在一个PPP连接中,PPPoE服务器的IP地址。由于本人架设的以太网网络地址为10.0.0.0/24,所以就使用网络地址的第一个IP地址作为服务器的地址了。
-R 参数用于指定当有客户连接到服务器上时,从哪个IP地址开始分配给客户。
-N 参数用于指定至多可以有多少个客户同时连接到本服务器上。
还有一些其他的参数你可以参考一下,直接man pppoe-server自己看了,每个参数都有默认值
成功完成上述步骤,就完成了搭建pppoe服务器端了,下面就是windows验证了
6.windows验证
我的是windows xp系统,win7或者路由器应该都没问题
不过要改下验证方式,在“属性”--》“安全”--》“高级--设置”--》将“数据加密”改为“可选加密”,然后勾选上chap或者pap验证就可以了
输入用户名密码,应该就可以连接到linux下的PPPoE Server上并可以正常上网了
拨号成功后,客户端会有一个ppp设备
PPP adapter 123:
Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 10.0.0.7
Subnet Mask . . . . . . . . . . . : 255.255.255.255
Default Gateway . . . . . . . . . : 10.0.0.7
服务器端也会多出一个ppp0设备
ppp0 Link encap:Point-to-Point Protocol
inet addr:10.0.0.1 P-t-P:10.0.0.7 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1480 Metric:1
RX packets:45 errors:0 dropped:0 overruns:0 frame:0
TX packets:22 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:4033 (3.9 KiB) TX bytes:1340 (1.3 KiB)
7.过程图解
PPPoE协议主要有以下几个过程:
client server
---PADI--->
<--PADO----
---PADR--->
<--PADS----
解释
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 字节;
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 包。
3.PADR
PPPoE 客户端收到 PADO 包后,在 PADO 包中选择一个(可能有多个 PPPoE 服务器,通常选取最快的一个)发送主动发现请求包(PPPoEActive Discovery Request,PADR),以太头中的目的地址是所选取的 PADO 包的源以太头地址(即 PPPoE 服务器的 MAC 地址),PPPOE 头中的 CODE 为 0x19,SESSION_ID 值必须为 0,负载部分必须只包含一个 Service-Name 类型的 TAG 表示请求的服务类型,另外可以包含其他 TAG。。当主机在指定的时间内没有接收到PADO,它应该重新发送它的PADI分组,并且加倍等待时间,这个过程会被重复期望的次数。
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。当主机收到PADS分组确认后,双方就进入PPP会话阶段。
5.PADT
PPPoE还有一个PADT分组,它可以在会话建立后的任何时候发送,来终止PPPoE会话,也就是会话释放。它可以由主机或者接入集中器发送。当对方接收到一个PADT分组,就不再允许使用这个会话来发送PPP业务。PADT分组不需要任何标签,其CODE字段值为0×a7,SESSION-ID字段值为需要终止的PPP会话的会话标识号码。在发送或接收PADT后,即使正常的PPP终止分组也不必发送。PPP对端应该使用PPP协议自身来终止PPPoE会话,但是当PPP不能使用时,可以使用PADT。
8.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 包负责会话阶段的数据传输。
9.问题分析
连接时错误
Windows拨号连接显示错误651
可能的原因是没有正确打开服务器。通过WireShark抓包可以看到,Windows在发送了4次PADI报文而没有得到PADO回复后,会报告引错误。
因此,可能是在 pppoe-server 打开时没有指定到正确的网卡。也可能是使用虚拟机上网时没有设置好上网模式,如果没有使用桥接模式上网而是使用了NAT模式,则也可能遇到此问题。
同时,如果没有pppoe-server-options 文件或者该文件没有 auth 和 require-chap 选项设置的话,也会出现这个问题。
同时,该问题也可能是因为在Windows拨号连接时在属性中指定了一个服务器,和linux下开启的PPPoE Server名称不同造成的。
pppoe-server中,-S参数用于指定服务器名称。
Windows拨号连接显示错误734
错误内容为
PPP链接控制协议终止
这个原因可能是在 pppoe-server-options 文件中加入了 login 选项。如果设置了该选项,则登陆的用户名必需和linux系统下的一个用户名相同,否则会出现这个错误。
Windows拨号连接显示错误628
错误内容为
在连接完成前,连接被远程计算机终止
通过WireShark抓包分析,可以看到在原理分析的四个阶段完成后,立刻收到一个PADT报文。PADT报文的内容描述为:
Generic-Error: RP-PPPOE: child pppd process terminated
这个描述十分有误导性,网上甚至有人说这个需要将pppoe编译进内核,以便可以使用pppoe-server命令的-k参数。后来我发现终究是配置问题,出现了配置错误,一般是出现了程序无法识别的配置。这个错误很麻烦,应当结合刚刚配置的logfile以及自己注释掉一些不确定的命令来排查错误。
无法识别用户名和密码
很可能是用户名和密码输入错误,也可能是设置错误。注意,设置用户名和密码时,两个星号是不能省略的。
上网错误
此类错误是Windows可以拨号连接成功,但是无法上网。主要是在linux下使用 tcpdump 或者 wireshark 程序进行排查。
使用命令:
tcpdump -i wlan0 host 10.10.10.1002
可以看到,只有从主机10.10.10.100发出的报文,但是没有发送给10.10.10.100的报文。
出现这个错误的原因,可能是没有打开IP转发功能。所以当网络上的报文发送给linux主机时,linux主机不会把报文转发给Windows主机,而是由于目的地址不是自己而直接丢弃。
同时也可能是没有设置iptables 的POSTROUTING的nat规则。