专栏首页云+技术搭建 PPPOE 拨号上网

搭建 PPPOE 拨号上网

PPPoE是point-to-point protocol over ethernet的简称,可以使以太网主机通过一个简单的桥接设备连到一个远端的接入集中器上。通过pppoe协议,远端接入设备能够实现对每个接入用户的控制和计费。rp-PPP0E是一个集成了拨号客户端和服务端的解决方案。 下载地址:http://www.roaringpenguin.com/products/pppoe

编译、安装的步骤: rp-pppoe-3.10.tar.gz 在 /opt 目录下。

tar -zxvf rp-pppoe-3.10.tar.gz cd rp-pppoe-3.10/src ./configure make make install

修改配置文件: cd /etc/ppp

vim pppoe.conf 修改下面几个值,其他的不要动 ETH=eth0 USER=rp-pppoe LINUX_PLUGIN=/etc/ppp/plugins/rp-pppoe.so

vim pppoe-server-options 下面是全部内容 require-pap

require-chap

login

lcp-echo-interval 10

lcp-echo-failure 2

logfile /var/log/pppoe.log

ms-dns 218.108.248.200

ms-dns 8.8.4.4

defaultroute

vim chap-secrets rp-pppoe  *  rp-pppoe  *

以上表示用户名和密码都是rp-pppoe

vim options local

运行程序: (用户模式) /usr/sbin/pppoe-server -I eth0 -L 10.0.0.1 -R 10.0.0.2 -N 64

-I 指定局域网网卡 -L 指定pppoeserver的IP地址 -R 为客户分配的起始IP地址 -N 指定分配给客服端IP地址的个数 -k 使用内核模式

现在就可以用pppoe客户端来连接我们已经运行的pppoeserver了,用户名和密码为上面设置的 rp-pppoe和rp-pppoe,认证方式为CHAP 但是客户端连接上去后不能上网,因为服务器那边没有进行数据包的转发。 虚拟机添加了2块网卡,eth0和eth1,eth0是静态IP,eth1为DHCP方式获取IP。

需要修改下配置脚本

cd/etc/sysconfig/network-scripts vim ifcfg-eth0

#Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] DEVICE=lan IPADDR=192.168.61.120 NETMASK=255.255.255.0 GATEWAY=192.168.61.1 DNS1=61.139.2.69 DNS2=192.168.61.1 HWADDR=00:0c:29:6b:71:d6 ONBOOT=yes BOOTPROTO=static USERCTL=no IPV6INIT=yes NM_CONTROLLED=yes TYPE=Ethernet

vimifcfg-eth1

TYPE="Ethernet" HWADDR=00:0C:29:6B:71:E0 BOOTPROTO=dhcp DEVICE=wan ONBOOT=yes

开启数据包转发

echo"1">>/proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

好了,现在客户端这边就可以上网了。

下面是 etherPeek 抓包的截图,pppoe发现阶段已经省去,只是TCP3次握手和4次挥手的抓包。 10.0.0.10是pppoe客户端的IP,192.168.61.206是linux下eth1的IP,每次局域网网关收到eth0上的数据,然后把源IP改成eth1的IP,目的IP不变, 广域网网卡收到远端服务器返回的数据,就把目的IP修改成内网主机pppoe的IP。

TCP3次握手

4次挥手

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hive应用:选取分隔符 原

    在使用hive的时候,分隔符是必不可少的,当学习的时候使用的都是常规分隔符,比如:逗号“,”、竖线“|”等,这些键盘上都可以直接输入的字符,但是这些字符只要是键...

    云飞扬
  • Eclipse 使用fatjar打包jar文档

    发现eclipse打包jar无法连带打包第三方lib,于是选择安装插件fatjar,现在说明fatjar安装过程: 1、安装方法:    1)下载安装:...

    Java学习123
  • Java Chaincode学习交易系统中Hyperledger Fabric帐户钱包模型

    这是Hyperledger Fabric Java Chaincode的教程。还有Go和NodeJS Chaincodes,我们将来可能会讨论它们。此外,我采用...

    笔阁
  • 工具-常用软件汇总

    putty PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。

    秋日芒草
  • Spring Bean的装配(非XML文件方式)

    Spring自动扫描默认没有开启,所以我们需要配置开启组件扫描。当然可以通过XML文件配置,但新Spring支持Java配置。

    SuperHeroes
  • IDEA相关资料整理

    https://github.com/judasn/IntelliJ-IDEA-Tutorial/

    小小明童鞋
  • Git代码防丢指南

    我们在日常使用Git的过程中经常会发生一些意外情况,如果处理不当,则可能会出现代码丢失的假象。本文将针对IDEA&Git日常开发中的一些场景,为你层层拨开迷雾,...

    joymufeng
  • Lombok使用

    Lombok是一个简单的Java库,该工具可以通过注解自动地提供一些方法,简化开发。比如编写POJO时需要为每个属性提供getter()方法和setter()方...

    SuperHeroes
  • 为什么程序员下班后只关显示器从不关电脑?

    对程序员来说,关机不仅意味着第二天需要开一堆软件浪费时间,更重要的是工作思路也随之断了,第二天重回昨天的思路也挺费劲的。

    华章科技
  • 基于HTML5 的互联网+地铁行业

    近几年,互联网与交通运输的融合,改变了交易模式,影响着运输组织和经营方式,改变了运输主体的市场结构、模糊了运营与非营运的界限,也更好的实现了交通资源的集约共享,...

    HT_hightopo

扫码关注云+社区

领取腾讯云代金券