wangkeIDC 2015-03-25
注:本记录适用于Debian系列Linux操作系统。在Ubuntu 14.10 以及 Linux Mint 17下验证成功。
在综合课程设计的搭建 PPPoE Server 环节中,本人以及组员碰到各种问题。在此总结,以备日后需要。
PPPoE程序在Debian操作系统中应该是自带的。可以使用 pppoe-server -h
命令查看版本。可以使用 sudo apt-cache search pppoe
查找相关软件。
配置文件存放在 /etc/ppp
文件夹中。先设置 options
文件:
114.114.114.114
这是Windows主机拨号连接时会分配的DNS地址。接下来设置 chap-secrets
文件:
按照文件注释的内容,分别填入:用户名 服务器名 密码 IP地址,例如,在最后插入一行:
testing * password *
表示用户名为testing,服务器名为任意,密码为password,IP为任意的IP。
下来,编辑 pppoe-server-options
文件(如果没有,则新建一个1)
在pppoe-server-options里加入:
auth require-chap logfile /var/log/pppd.log
这样就配置完毕了。
使用超级用户的身份,注意,必需是超级用户身份,sudo都没有这个权限,执行:
cat 1 > /proc/sys/net/ipv4/ip_forward
如果单单是执行这个命令,只会暂时开启IP转发功能。重启后会自动关闭。如果想一直打开,则应该编辑 /etc/sysctl.conf
文件,取消 net.ipv4.ip_forward=1
的注释,再执行 sudo sysctl -p
就可以永久打开IP转发功能了。
以超级用户身份执行:
iptables -A POSTROUTING -t nat -s 10.10.10.0/24 -j MASQUERADE
注:-s 参数后面的网络地址是一会儿将要开启的pppoe-server设置的网络地址,这个地址可以根据需要自己设定,只要iptables和pppoe-server匹配就好。
输入:
sudo pppoe-server -I wlan0 -L 10.10.10.1 -R 10.10.10.100 -N 100
注:
如果一切顺利,在Windows上建立拨号连接,用户名和密码分别为testing和password,应该就可以连接到linux下的PPPoE Server上并且正常上网了。
PPPoE协议主要有以下几个过程:
可能的原因是没有正确打开服务器。通过WireShark抓包可以看到,Windows在发送了4次PADI报文而没有得到PADO回复后,会报告引错误。
因此,可能是在 pppoe-server
打开时没有指定到正确的网卡。也可能是使用虚拟机上网时没有设置好上网模式,如果没有使用桥接模式上网而是使用了NAT模式,则也可能遇到此问题。
同时,如果没有pppoe-server-options
文件或者该文件没有 auth
和 require-chap
选项设置的话,也会出现这个问题。
同时,该问题也可能是因为在Windows拨号连接时在属性中指定了一个服务器,和linux下开启的PPPoE Server名称不同造成的。
pppoe-server中,-S参数用于指定服务器名称。
错误内容为
PPP链接控制协议终止
这个原因可能是在 pppoe-server-options
文件中加入了 login
选项。如果设置了该选项,则登陆的用户名必需和linux系统下的一个用户名相同,否则会出现这个错误。
错误内容为
在连接完成前,连接被远程计算机终止
通过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.100
可以看到,只有从主机10.10.10.100发出的报文,但是没有发送给10.10.10.100的报文。
出现这个错误的原因,可能是没有打开IP转发功能。所以当网络上的报文发送给linux主机时,linux主机不会把报文转发给Windows主机,而是由于目的地址不是自己而直接丢弃。
同时也可能是没有设置iptables
的POSTROUTING的nat规则。
一般是在虚拟机上安装一个linux操作系统,搭好PPPoE Server。然后在宿主机上进行连接测试。则有以下几个问题:
目前碰到的问题就是这样了,以后碰到问题再添加吧。最重要的是理解各个步骤和协议的原理,这样才能快速排查错误的原因。