PPPoE还有一个PADT分组,它可以在会话建立后的任何时候发送,来终止PPPoE会话,也就是会话释放。它可以由主机或者接入集中器发送。当对方接收到一个PADT分组,就不再允许使用这个会话来发送PPP业务。PADT分组不需要任何标签,其CODE字段值为0×a7,SESSION-ID字段值为需要终止的PPP会话的会话标识号码。在发送或接收PADT后,即使正常的PPP终止分组也不必发送。PPP对端应该使用PPP协议自身来终止PPPoE会话,但是当PPP不能使用时,可以使用PADT。
问题分析 连接时错误 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.100
可以看到,只有从主机10.10.10.100发出的报文,但是没有发送给10.10.10.100的报文。
出现这个错误的原因,可能是没有打开IP转发功能。所以当网络上的报文发送给linux主机时,linux主机不会把报文转发给Windows主机,而是由于目的地址不是自己而直接丢弃。
同时也可能是没有设置iptables 的POSTROUTING的nat规则。
网络拓扑相关问题一般是在虚拟机上安装一个linux操作系统,搭好PPPoE Server。然后在宿主机上进行连接测试。则有以下几个问题:
如果虚拟机采用NAT模式,则宿主机无法登陆。因为NAT模式下,宿主机是无法与虚拟机通信的。各种模式下的通信功能见下图:
如果采用的是有线网络,则无法使用桥接模式。因为有线网络为固定IP,无法为桥接再分配一个IP地址。因此,最好的方法是使用无线网络。
如果宿主机是linux操作系统,则可以虚拟Windows XP,同时使用Host-Only模式,设置好相应的网络地址,不启用DHCP服务器,在Windows XP中设置好自己的IP、子网掩码,这样就可以和宿主机进行通信了。在这样的情况下,没有拨号连接时无法上网,拨号连接好可以上网,是对实验环境的最近似的模拟。
目前碰到的问题就是这样了,以后碰到问题再添加吧。最重要的是理解各个步骤和协议的原理,这样才能快速排查错误的原因。
这个问题困扰了我很久。网上说是编辑这个文件,但是在操作系统中没有这个文件,我一直以为是版本的问题,后来才发现需要自己新建。这个和.vimrc以及.bashrc等文件是一样的。
-i用于指定端口,host指定的ip应该在windows用ipconfig查看得到,可能不一样。