前言:
实验室的宽带是公网静态IP,上外网不需要拨号也不能拨号。 为了测试某款终端产品的拨号上网功能,调试时只能自己弄个pppoe-server了。
网上搜索了一下,解决方案有很多:RouterOS,Windows Server 2003上部署拨号服务软件,Linux pppoe-server等。有其他项目的同事以前搞过,给我发了一个模拟BAS,软件叫RASPPPOE啥的。
时间不等人,没有多的电脑设备,也倾向于使用linux,最后选来选去决定使用rp-pppoe来搭建一个PPPOE-Server
网上资料不是很多,国内的资料也总是抄来抄去或者不够详细,于是就有了这篇博客,希望能够帮助到后来人
-----------------------------------------------------
软件准备:
操作系统用的SuSELinux11
软件用的rp-pppoe,这个软件支持adsl拨号和pppoe-server,开源免费。
参考文档:
(1)Rehat上安装rp-pppoe:
这个文档不错,值得一读,很老的文章说明pppoe-server并不是什么高深的技术
http://www.quirxi.net/misc/howtos/Pppoe-Howto/Pppoe-Howto.html
(2)rp-pppoe自带的简单文档
再就是rp-pppoe doc目录下自带的简单的说明文档,至于配置项什么的在配置文件有些说明
(3)还有这个文档,网上贴的比较多
Linux 系统服务器配置文档—《PPPoE 篇》
具体操作:
一、安装
下载 rp-pppoe: http://www.roaringpenguin.com/products/pppoe
检查系统是否已安装PPPOE服务器: 网上介绍用rpm -q rp-pppoe,但下载下来的并不是一个rpm,用which pppoe-server直接看就可以了
检查linux内核版本:uname -r ,自带doc上介绍安装rp-pppoe需要内核2.2.9以上
rp-pppoe-3.11.tar.gz 下载后解压,解压后有README文件指导安装,可以快速安装或手动安装
我用的手动编译和安装
1) Unpack:
$ tar xzvf rp-pppoe-xxx.tar.gz
2) Change to source directory:
$ cd src
3) Configure:
$ ./configure
4) Compile:
$ make
4) Install (this step must be done as root)
# make install
----------------------------------------------------------
二、配置
/etc/ppp/目录下有很多配置文件,改这3个就可以了
(1)vi /etc/ppp/pppoe-server-options #可以先参考 pppoe-server-options-example
require-chap #使用chap验证协议,如果使用pap验证协议,则此行为 require-pap
login #使用系统的账号进行认证。 要求pppd的登录账号在系统和chap-secrets文件中均存在。
lcp-echo-interval 10
lcp-echo-failure 2
ms-dns 8.8.8.8 #分配给客户端的DNS
(2)添加身份验证账户
vi /etc/ppp/chap-secrets #如果使用pap验证,则修改/etc/ppp/pap-secrets
# client server secret IP addresses
username * password *
其中username和password分别是用户名和密码
如果pppoe-server-options中使用了login项,需要在linux上用useradd命令创建同名帐户
(3)vi /etc/ppp/options --- 是否要修改不确定,但改了下面这一项
local #这个是pppoe拨号协议的一个开关,options文件内有说明
三、启动pppoe服务器
用eth0提供拨号服务,eth0没有配置地址。eth1已经配置好地址,可以上公网
(1)检查网卡
ifconfig eth0 #如果网卡没有起来,可以用ifconfig eth0 up
确保这个网口正常,最好接上一个设备,用ethtool eth0命令查看是否连接
linux:~ # ethtool eth0
Link detected: yes
(2)提供pppoe-server的网卡上不能配IP地址
用ifconfig eth0 查看
(3)在网卡上启用pppoe-server服务
pppoe-server -I eth0 -L 192.168.1.1 -R 192.168.1.2 -N 10
-I eth0 指定pppoe服务器在那个网卡接口监听连接请求
-L 192.168.1.1 指定pppoe服务器的ip地址。(注意:此IP地址不是网卡的IP地址,而是PPPOE服务器的虚拟IP)
-R 192.168.1.2 pppoe服务器分配给客户端的IP地址,从192.168.1.2开始,递增
-N 10 指定最多可以连接pppoe服务器的客户端数量
-k: 使用内核模块
-L: 设置服务端IP地址
-R: 设置客户端启示IP地址
-x: 每个MAC地址能发起的session(这个似乎在新版本中才有)
-C:设置链接主机名字,默认是主机名
-S: 设置服务名
-I:设置需要监听的端口
-N: 设置最大客户端链接数,默认是64
启动pppoe-server后检查进程是否存在:ps -ef | grep -i pppoe
关闭pppoe所有服务(包括server服务): killall pppoe-server
pppoe-server的日志输出在/var/log/messages,这个日志是SuSELinux操作系统的日志
终端设备拨号成功后,用ifconfig命令可以在SuSELinux看到这样一个连接
其中inet addr:192.168.1.1是pppoe-server的ip, P-t-P:192.168.1.2是终端拨号成功获取到的ip
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.1.1 P-t-P:192.168.1.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:34888 errors:0 dropped:0 overruns:0 frame:0
TX packets:69929 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:2013508 (1.9 Mb) TX bytes:90514273 (86.3 Mb)
四、使拨号的终端也能够上公网
拨号服务器有2块网卡:eth0用于PPPOE Server,eth1能上外网
为了使拨号的终端能上外网,还需要如下配置:
(1)开启IP转发,这样eth0的包才会被允许转发到eth1
# echo "1" > /proc/sys/net/ipv4/ip_forward
(2)将eth1出向包的源地址进行修改
如果eth1是静态地址:
# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 172.20.7.251
将输出到eth1的出向包的源地址修改为172.20.7.251,172.20.7.251是eth1的静态地址。
命令解释: -A POSTROUTING -o eth1是匹配(match)到网络包, -j 是指定nat时的具体动作。就是对match到的包做指定动作。
如果eth1是动态获取的地址:
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
将源地址修改为eth1实际获取到的地址,又称ip欺骗
配置后,查看iptables配置
linux:~ # iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- anywhere anywhere to:172.20.7.251
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
如果要全清除iptables规则,使用iptables -t nat -F
五、补充问题
1.pppoe认证失败
PAP的用户名称(pap验证的ID、密码),不是任意的,必须与server系统的一个用户名、密码一致。
CHAP的用户名称是任意的,没有限制的。
在源代码里面有个doc目录:
F) Internal hosts can't see the Internet
Do you have masquerading set up? I can't help you in great detail, but
see the IPCHAINS-HOWTO and the IP-Masquerade mini-HOWTO.
如果拨号成功的终端还是不能上网,需要同时对eth0和eth1抓包进行分析。比如抓到的网络包分别是cur_eth0.cap和cur_eth1.cap
第一步,查看发送给eth0的消息,有没有转发到eth1上。正常情况,同一个消息应该在cur_eth0.cap和cur_eth1.cap都存在。
第二步,查看终端发出来的消息有没有被SNAT,需要重点分析下cur_eth1.cap了