阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux下搭建 PPPoE Server 问题总结

113次阅读
没有评论

共计 4065 个字符,预计需要花费 11 分钟才能阅读完成。

注:本记录适用于 Debian 系列 Linux 操作系统。在 Ubuntu 14.10 以及 Linux Mint 17 下验证成功。

在综合课程设计的搭建 PPPoE Server 环节中,本人以及组员碰到各种问题。在此总结,以备日后需要。

搭建过程

安装和配置 PPPoE 程序

PPPoE 程序在 Debian 操作系统中应该是自带的。可以使用 pppoe-server -h 命令查看版本。可以使用 sudo apt-cache search pppoe 查找相关软件。

配置文件存放在 /etc/ppp 文件夹中。先设置 options 文件:

  1. 设置 ms-dns 的值。要设置成一个可以使用的 DNS 服务器的 IP 地址,比如 114.114.114.114 这是 Windows 主机拨号连接时会分配的 DNS 地址。
  2. 注释掉 +pap,取消 -pap 的注释,这表示不使用 pap 认证方式。同时,取消 +chap 的注释,表示使用 chap 认证方式。

接下来设置 chap-secrets 文件:

按照文件注释的内容,分别填入:用户名 服务器名 密码 IP 地址,例如,在最后插入一行:

testing * password *

表示用户名为 testing,服务器名为任意,密码为 password,IP 为任意的 IP。

下来,编辑 pppoe-server-options 文件 ( 如果没有,则新建一个 1)
在 pppoe-server-options 里加入:

auth
require-chap
logfile /var/log/pppd.log

这样就配置完毕了。

设置系统的 ip 策略

开启 ip 转发功能

使用超级用户的身份,注意,必需是超级用户身份,sudo 都没有这个权限,执行:

cat 1 > /proc/sys/net/ipv4/ip_forward

如果单单是执行这个命令,只会暂时开启 IP 转发功能。重启后会自动关闭。如果想一直打开,则应该编辑 /etc/sysctl.conf 文件,取消 net.ipv4.ip_forward=1 的注释,再执行 sudo sysctl -p 就可以永久打开 IP 转发功能了。

设置 iptables 的 IP 策略

以超级用户身份执行:

iptables -A POSTROUTING -t nat -s 10.10.10.0/24 -j MASQUERADE

注:-s 参数后面的网络地址是一会儿将要开启的 pppoe-server 设置的网络地址,这个地址可以根据需要自己设定,只要 iptables 和 pppoe-server 匹配就好。

运行 PPPoE Server

输入:

sudo pppoe-server -I wlan0 -L 10.10.10.1 -R 10.10.10.100 -N 100

注:

  1. -I 参数用于指定监听哪个网络端口。可以使用 ifconfig 命令查看当前工作的端口名称。由于本人的笔记本电脑使用无线网络,所以是 wlan0 端口。
  2. -L 参数用于指定在一个 PPP 连接中,PPPoE 服务器的 IP 地址。由于本人假设的以太网网络地址为 10.10.10.0/24,所以就使用网络地址的第一个 IP 地址作为服务器的地址了。
  3. -R 参数用于指定当有客户连接到服务器上时,从哪个 IP 地址开始分配给客户。
  4. -N 参数用于指定至多可以有多少个客户同时连接到本服务器上。

如果一切顺利,在 Windows 上建立拨号连接,用户名和密码分别为 testing 和 password,应该就可以连接到 linux 下的 PPPoE Server 上并且正常上网了。

PPPoE 协议过程分析

过程图解

PPPoE 协议主要有以下几个过程:

Created with Raphaël 2.1.2 客户客户服务器服务器 PADIPADOPADRPADS

解释

  1. 主机广播发起分组(PADI),分组的目的地址为以太网的广播地址 0×ffffffffffff,CODE(代码)字段值为 0×09,SESSION-ID(会话 ID)字段值为 0×0000。PADI 分组必须至少包含一个服务名称类型的标签(标签类型字段值为 0×0101),向接入集中器提出所要求提供的服务。
  2. 接入集中器收到在服务范围内的 PADI 分组,发送 PPPoE 有效发现提供包(PADO)分组,以响应请求。其中 CODE 字段值为 0×07,SESSION-ID 字段值仍为 0×0000。PADO 分组必须包含一个接入集中器名称类型的标签(标签类型字段值为 0×0102),以及一个或多个服务名称类型标签,表明可向主机提供的服务种类。
  3. 主机在可能收到的多个 PADO 分组中选择一个合适的 PADO 分组,然后向所选择的接入集中器发送 PPPoE 有效发现请求分组(PADR)。其中 CODE 字段为 0×19,SESSION_ID 字段值仍为 0×0000。PADR 分组必须包含一个服务名称类型标签,确定向接入集线器(或交换机)请求的服务种类。当主机在指定的时间内没有接收到 PADO,它应该重新发送它的 PADI 分组,并且加倍等待时间,这个过程会被重复期望的次数。
  4. 接入集中器收到 PADR 分组后准备开始 PPP 会话,它发送一个 PPPoE 有效发现会话确认 PADS 分组。其中 CODE 字段值为 0×65,SESSION-ID 字段值为接入集中器所产生的一个唯一的 PPPoE 会话标识号码。PADS 分组也必须包含一个接入集中器名称类型的标签以确认向主机提供的服务。当主机收到 PADS 分组确认后,双方就进入 PPP 会话阶段。
  5. 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 文件或者该文件没有 authrequire-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。然后在宿主机上进行连接测试。则有以下几个问题:

  1. 如果虚拟机采用 NAT 模式,则宿主机无法登陆。因为 NAT 模式下,宿主机是无法与虚拟机通信的。各种模式下的通信功能见下图:Linux 下搭建 PPPoE Server 问题总结
  2. 如果采用的是有线网络,则无法使用桥接模式。因为有线网络为固定 IP,无法为桥接再分配一个 IP 地址。因此,最好的方法是使用无线网络。
  3. 如果宿主机是 linux 操作系统,则可以虚拟 Windows XP,同时使用 Host-Only 模式,设置好相应的网络地址,不启用 DHCP 服务器,在 Windows XP 中设置好自己的 IP、子网掩码,这样就可以和宿主机进行通信了。在这样的情况下,没有拨号连接时无法上网,拨号连接好可以上网,是对实验环境的最近似的模拟。

目前碰到的问题就是这样了,以后碰到问题再添加吧。最重要的是理解各个步骤和协议的原理,这样才能快速排查错误的原因。

  1. 这个问题困扰了我很久。网上说是编辑这个文件,但是在操作系统中没有这个文件,我一直以为是版本的问题,后来才发现需要自己新建。这个和.vimrc 以及.bashrc 等文件是一样的。
  2. - i 用于指定端口,host 指定的 ip 应该在 windows 用 ipconfig 查看得到,可能不一样。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-03/115454.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计4065字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中