Linux 系统服务器配置文档—《PPPoE 篇》

来源:互联网 发布:淘宝海外市场前景 编辑:程序博客网 时间:2024/06/06 09:03
Linux 系统服务器配置文档—《PPPoE 篇》

一、简介
   1.1. 什么是 PPPoE?
   PPPoE 即Point to Point Protocol over Ethernet的简称,即基于以太网的点对点协议。
最初由IETF在的RFC 2516中定义。1998年后期问世的以太网上点对点协议(PPP over Ethernet)技术是由Redback 网络公司、客户端软件开发商RouterWare公司以及Worldcom子公司UUNET Technologies公司在IETF RFC的基础上联合开发的。
   通过把最经济的局域网技术以太网和点对点协议的可扩展性及管理控制功能结合在一起,网络服务提供商和电信运营商便可利用可靠和熟悉的技术来加速部署高速互联网业务。它使服务提供商在通过数字用户线、电缆调制解调器或无线连接等方式,提供支持多用户的宽带接入服务时更加简便易行。同时该技术亦简化了最终用户在动态地选择这些服务时的操作。

   1.2. PPPoE 应用
   PPPoE 基于以太网的点对点协议,当前的 PPPOE 主要被 ISP用于 xDSL 和 cable   modems 与用户端的连接,他们几乎与以太网一样。 PPPoE 是一种标准的点对点协议(PPP), 他们之间只是传输上的差异:PPPoE 使用 modem 连接来代替普通的以太网。
一般来说 , PPPoE 是基于与用户认证和通过分发 IP 地址给客户端。一个 PPPoE 连接由客户端和一个访问集线服务器组成,客户端可以是一个安装了 PPPoE协议的电脑。
PPPoE 客户端和服务器能工作在任何以太网等级的网络接口上。
   除了应用于modem与用户端的连接之外,也常用于在LAN接入方式的宽带环境中用户端接入。

   1.3. PPPoE 软件的选择
   PPPoE 实现包含两个主要的软件包:
   ppp-2.4.2-6.4.RHEL4
   官方网站:
   rp-pppoe-3.5-22
   官方网站:http://www.roaringpenguin.com/penguin/pppoe/
   为了使PPPoE支持mppe加密方式的客端端接入,因此需加入mppe支持。由于所使用系统内核并未支持mppe,因此加入动态模块支持:
   dkms-2.0.6-1.noarch.rpm
   kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
   软件包来源:http://sourceforge.net/project/showfiles.php?group_id=44827
   dkms-2.0.6-1.noarch.rpm和kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm包在建立支持mppe加密的pptpd方式的VPN服务器环境中也需要用到,见其VPN篇。


二、配置环境

2.1. 安装环境
    [root@CentOS ~]# uname -r ;ifconfig |grep -A1 'eth'
    2.6.9-42.EL
    eth0       Link encap:Ethernet HWaddr 00:0E:1F:50:E2:8C
                inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0
    --
    eth1       Link encap:Ethernet HWaddr 00:14:85:93:33:97
                inet6 addr: fe80::214:85ff:fe93:3397/64 Scope:Link
    # 内核及加载模块为系统默认,未经任何编译。


2.2. 软件包
    ppp-2.4.2-6.4.RHEL4
    # The ppp package contains the PPP (Point-to-Point Protocol) daemon and
    documentation for PPP support. The PPP protocol provides a method for transmitting
    datagrams over serial point-to-point links. PPP is usually used to dial in to an ISP
    (Internet Service Provider) or other organization over a modem and phone line.
    本软件包用于包含 PPP 协议的守护进程和文档用于对 PPP 协议的支持。


    rp-pppoe-3.5-22
    # PPPoE (Point-to-Point Protocol over Ethernet) is a protocol used by many ADSL
    Internet Service Providers. This package contains the Roaring Penguin PPPoE client, a
    user-mode program that does not require any kernel modifications. It is fully compliant
    with RFC 2516,the official PPPoE specification.
    PPPoE 是一个基于以太网的点对点协议被许多 ISP 用于 ADSL 接入,在这个包中还包含一个 Roaring Penguin PPPoE 客户端。在客户端程序方式下不需做任何编译内核的操作。完全相容于官方的 PPPoE 标准-RFC2516。


    dkms-2.0.6-1.noarch.rpm
    # This package contains the framework for the Dynamic Kernel Module Support (DKMS)
    method for installing module RPMS as originally developed by the Dell Computer
    Corporation.
    Dell 公司开的一个动态模组支持包,用于将需要的模组在内核需要调用时动态加入。


    kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
    # This driver provides MPPE capability, necessary for implementing encryption for the
    PPTP protocol. This driver supports 2.4.x and 2.6.x kernels.
    本驱动使 kernel 2.4.x 与 2.6.x 下 PPTP 协议的支持 mppe 加密。
由于 kernel-2.6.9 内核默认并不支持 mppe – Microsoft point to point encryption (微软公司的点到点加密协议,windows 平台的客户端连接 VPN 服务器均使用此协议),因此需要在内核中加入 mppe 的支持。

2.3. 网络拓朴

局域网中的实验环境,PPPoE Server 安装有 2 块网卡,其中 eth0 的 IP 地址为192.168.1.10/24 连接至 ADSL modem,eth1 端口未指定 IP 地址,PPPoE 进程在 eth1 端口侦听;


三、配置过程
3.1. PPPoE 的验证过程
PPPoE 的验证过程包括 2 个阶段,Discovery 阶段和 PPP Session 阶段。
Discovery 阶段,包含 4 个步骤:
       Step 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 字节;
       Step 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 包。
       Step 3: PADR
PPPoE 客户端收到 PADO 包后,在 PADO 包中选择一个(可能有多个 PPPoE 服务器,通常选取最快的一个)发送主动发现请求包(PPPoEActive Discovery Request,PADR),以太头中的目的地址是所选取的 PADO 包的源以太头地址(即 PPPoE 服务器的 MAC 地址),PPPOE 头中的 CODE 为 0x19,SESSION_ID 值必须为 0,负载部分必须只包含一个 Service-Name 类型的 TAG 表示请求的服务类型,另外可以包含其他 TAG。
       Step 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。


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 包负责会话阶段的数据传输。


3.2. 配置思路
    step 1
    全局配置
    配置系统 IP 包文转发,网络接口地址配置,添加动态加载模块。相关配置文件:
    /etc/sysctl.conf                                # 启用 IP 报文转发
    /etc/sysconfig/network-scripts/ifcfg-eth0|eth1   # 接口地址
    /etc/modprobe.conf                            # 动态加载模块
      step 2
    配置 PPP Session 会话配置文件,/etc/ppp/options
      step 3
    配置客户账号和密钥,需修改配置文件
    /etc/ppp/pap-secrets#ppp 程序的 pap 认证密钥
    # PAP: password authentication protocol,密码认证协议


3.3. 修改配置文件
3.2.1. 全局配置文件
3.2.1.1. 系统内核网络参数

# 将“net.ipv4.ip_forwark”项值由“0”改为“1”
# 启用 IP 包转发

# 手动添加以上行,对于保证连接的稳定性有重要意义;
# 该参数通常用于使用拨号连接的情况,可以使系统动能够立即改变 ip 包的源地址为该 ip 地址,同时中断原 有的 tcp 对话而用新地址重新发出一个 syn 请求包,开始新的 tcp 对话。在使用 ip 欺骗时,该参数可以立即改变伪装地址为新的 ip 地址。


3.2.1.2. 网络接口地址

# 侦听 PPPoE 报文的网络接口无需配置 IP 地址

3.2.1.3. 添加动态加载模块

# 添加 ppp_mppe 模块,支持客户端 mppe 加密;
# 模块由 kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm 包生成;
# 允许内核动态调用 pppoe 模块,由 rp-pppoe 包生成;

3.2.2. PPP 会话配置文件 /etc/ppp/options

# 其中 plugin rp-pppoe.so 需要手动添加,见/usr/share/doc/ppp-2.4.2/README.pppoe
# ms-dns 为指派给客户端的 DNS 服务器地址,手动添加
# 如果指定的客户端地址与内网地址处于同一网段,则需要 proxyarp
# 如需将日志另存为文件,可在 options 添加 logfile /var/log/ppp/pppd.log
# 其它为默认参数,详尽可 man pppd

# PPPoe Discovery 参数,默认设置即可,不用修改
# 本例中使用 pap 认证方式

3.2.3. /etc/ppp/pap-secrets

   # 指定 PPPoE 客户端用户名和密码,
   # IP address 如果指定,则 PPPoE 客户端将固定得到这个 IP 地址;
   # 用户名必须要系统中存在,如不存在,将无法登陆
   如不对各配置文件参数不了解,可查看/usr/share/doc/ ppp-2.4.2 / 目录中的相关文件。
   3.2.4. 设置 pppd 程序的 SUID 属性
   由于 pap-secrets 文件为 root 用户可读写,在 PPPoE 客户端用户登陆时需验证pap-secrets 文件,由于其他用他用户没有访问权限,因此会造成登陆失败。


   解决办法:可以使用设置 pppd 进程的 SUID 属性,让 PPPoE 客户端登陆时具有读取pap-secrets 文件的权限。

   # 如上,chmod u+s /usr/sbin/pppd 指令也可


   3.4. 启动 PPPoE 服务

   # 一个启动 PPPoE Server 的 scripts,
   # 本在地址为 192.168.2.193,远端地址为 192.168.2.200,最大连接数为 64


四、服务测试
   4.1. 建立 PPPoE 拔号连接
      在 windows xp 系统通过设置-控制面板-网络连接,创建一个新连接;输入所建立的用户名和密码,建立一个 PPPoE 连接。
      PPPoE 端本地网卡无需设置 IP 地址,确认物理连接无误后,即可拔号连接。
   ipconfig /all ,PPP 连接情况

   4.2. PPPoE Server 端相关记录

   # 可以看出 PPP 连接成功,成功获取 IP 地址

   # 服务器端连接日志,可以清楚看到登陆、认证过程。
   4.3. 终端连接内网网关

   # 连接正常

   4.4. 测试 iptables 规则
          在本例拓朴结构中,PPPoE 服务器同时担任内网 PPPoE 终端连接至外网的网关,因此需要在防火墙中添加规则:


五、故障解决
5.1. 案例 1-在 2 层防火墙环境中,PPPoE 服务器接入的路由设置

   在这个案例中,局域网中 Route Server 服务器负责接入 internet,同时提供非认证用户和 PPPoE Server 的 eth0 的动态 IP 地址分配,PPPoE Server 负责其下通过交换机连接的 PPPoE 用户的认证和 IP 地址分配。
   在一些特别的网络环境中,这种需求是存在的。比喻说企业中只对于特定的用户需经过认证才能上网,其他用户却不需要认证;或是在酒店的客房区域,入住客人需通过PPPoE 认证,计费上网,而内部员工却不需要,等等。
      在这种环境中,PPPoE Client 通过 PPPoE Server 将数据包转发至 Route Server,PPPoE Server 同时提供 PPPoE Client 的 ARP Proxy,设置如下:
          step 1:
          确认 PPPoE Server 核心中 IP 包转发

          # 或是在/etc/sysctl.conf 中将 net.ipv4.ip_forward 值设置为“1”
          step 2
          将 PPPoE Server 远端 IP 配置为内网 IP 地址,并启用 ProxyARP

          # 如远端 IP 地址与 PPPoE Server 的 eth0 地址为同一网段

          # 在/etc/ppp/options 中添加 proxyarp,启用 ARP 代理,
          # 这样透过 PPPoE Server 的 eth0 与远端网关 192.168.2.11 通讯
          # 在日志中可以发现 pppd 使用 eth0 口用于 ARP Proxy。
          step 3
          将 PPPoE Server 的防火墙的 filter 表的 FORWARD 策略设置为 ACCEPT


    这样在 2 层防火墙环境中,PPPoE Client 的数据包经过 PPPoE Server 转发至网关,在 NAT Server 看来只是 PPPoE Server 的 eth0 口在与自己通讯。
原创粉丝点击