一台安装了Debian GNU/Linux 50的VPS。
当然理论上所有可以安装pptpd包的nix系统都可以作为主机,教程中安装方式是基于Debian的apt-get命令,其他发行版请自行对照使用。
这台VPS的物理位置是Fremont, CA。
物理位置作为这个应用本身并不重要,在这里提出只是多此一举。
安装服务器端软件
# apt-get install pptpd
Debian的包管理是所有发行版里最好的,所以这条命令打完就安装完毕了我们的pptp服务器端程序。
配置IP地址范围
编辑/etc/pptpdconf,在最后添加如下地址:
localip 19216801remoteip 1921680234-238,1921680245
这两句设置了当外部计算机通过pptp联接到后所能拿到的ip地址范围和服务器的ip地址设置。
增加一个用户
编辑/etc/ppp/chap-secrets,在下面增加类似的条目:
username pptpd password
上面内容很好理解,最后那个星号是说允许从任何IP地址联接,如果你想单独设定IP地址也可以。
重启pptpd服务
# /etc/initd/pptpd restar
理论上到这里一个就已经搭建完毕了。无论你用的是Windows还是OSX,或者是iPhone OS,都可以通过建立一个pptp链接来联入这个。不过你并不能通过这个来上Internet,因为所有的数据都作用于那台pptpd的服务器上,而不会传入拨入的计算机设备上。要上Internet还需要这么干:
dns解析支持
编辑:/etc/ppp/options,在里面找一下“ms-dns”项目:
ms-dns 20867222222 ms-dns 20867220220
我填写的是OpenDNS的地址,当然你也可以填写电信的DNS。
允许转发
编辑/etc/sysctlconf,看一下netipv4ip_forward参数是不是1。
netipv4ip_forward=1
最后的最后,运行一下这条命令来打开iptables的转发支持:
/sbin/iptables -t nat -A POSTROUTING -s 19216800/24 -o eth0 -j MASQUERADE
注意:来自@LEMONed的消息,只有Xen的VPS可以搭建pptp,OpenVZ的不行。
引用来自@LEMONed的话:
因为openvz下只有venet0,没有eth0,而绝大多数的vps都是openvz的,然后绝大多数的openvz vps都没有masqurade,只能搭建open并且要自签证书什么的,根本不能用pptpd。我为了给iphone搭个曾经把这个研究透彻了必须xp系统? 那比较麻烦,最好是win2003。xp安装iis 链接:>
我们知道,数据链路层协议运行在物理层之上,网络层之下。而底层的物理层,只能提供简单的bit流的物理信道,功能非常原始,如果直接使用物理层进行通讯,肯定是非常不方便的,所以数据链路层会在底层物理层提供的功能基础之上,提供一些增值服务,方便上面的网络层使用。所以可能认为数据链路层是对物理层功能的增强。如果您想用尽量少的词来记住数据链路层,那就是: “帧和介质访问控制” 。典型的数据链路层功能包括:
为了使传输中发生差错后只将有错的有限数据进行重发,同时,也为了上层使用起来更加方便,数据链路层将比特流组合成以帧为单位传送。每个帧除了要传送的数据外,还包括校验码,以使接收方能发现传输中的差错。帧的组织结构必须设计成使接收方能够 明确地从物理层收到的比特流中对其进行识别,也即能从比特流中区分出帧的起始与终止,这就所谓的报文成帧问题。
当链路两端的节点要进行通信前,必须
数据链路层的可靠性,包括两个子问题,第一个是差错控制,第二个是流量控制。
PPP协议是一个数据链路层协议,所以它会解决标准数据链路层协议的所有问题,包括
除此之外,PPP协议还提供了很多其他的附加功能,正是因为这些功能的提供,使得PPP协议称为一个使用非常广泛的链路层协议。
PPP协议为串行链路上传输的数据报定义了一种封装方法,它基于高层数据链路控制(HDLC)标准。
即使使用所有的帧头字段,PPP协议帧也只需要8个字节就可以形成封装。如果在低速链路上或者带宽需要付费的情况下,PPP协议允许只使用最基本的字段,将帧头的开销压缩到2或4个字节的长度,这就是所谓的PPP帧头压缩。
PPP协议有两个重要部分组成:LCP和NCP,LCP就是其中用来进行链路层的通道建立、管理与维护的部分。
一次完整的PPP会话过程包括四个阶段: 链路建立阶段、确定链路质量阶段、网络层控制协议阶段和链路终止阶段。
LCP会进行一些链路层参数的协商,只有通过LCP协商之后,才会启动后续的认证和网络层参数协商过程
一次LCP协商过程如下:
至此,LCP两个状态完成,可以向下一个阶段Network Layer Protocol或者Autiontication跃迁
在Link Establishment阶段,P2P双方至少发一个Config-Request报文,该报文中包含了发送方对于所有的配置参数的期望值。
PPP相对其他协议的一个非常重要的功能特性是其内置了安全认证机制,这也是该协议在用户接入侧被广泛使用的一个重要原因。安全认证过程内置在协议规程中,并且在链路建立起来之前被执行。很好的保证了接入链路的安全性。
验证过程在PPP协议中为可选项。在连接建立后进行连接者身份验证的目的是为了防止有人在未经授权的情况下成功连接,从而导致泄密。PPP协议支持两种验证协议:
这两种验证机制共同的特点就是简单,比较适合于在低速率链路中应用。但简单的协议通常都有其他方面的不足,最突出的便是安全性较差。一方面,口令验证协议的用户名/口令以明文传送,很容易被窃取;另一方面,如果一次验证没有通过,PAP并不能阻止对端不断地发送验证信息,因此容易遭到强制攻击。
挑战握手协议的优点在于密钥不在网络中传送,不会被窃听。由于使用三次握手的方法,发起连接的一方如果没有收到“挑战信息”就不能进行验证,因此在某种程度上挑战握手协议不容易被强制攻击。但是,CHAP中的密钥必须以明文形式存在,不允许被加密,安全性无法得到保障。密钥的保管和分发也是CHAP的一个难点,在大型网络中通常需要专门的服务器来管理密钥。
在完成安全认证后,PPP还支持上层网络层协议一些参数的协商,这也是PPP非常有特点的一个设计。不同的上层网络层协议,可能会有不同的协商内容。PPP协议为上层网络层参数协商定义了一套标准的规程,同时又支持多种不同的上层协议进行协商。设计的可扩展性非常好。
NCP协议主要包括IPCP、IPXCP等,但我们在实际当中最常遇见的也只有IPCP协议
IPCP控制协议主要是负责完成IP网络层协议通信所需配置参数的选项协商,负责建立,使能和中止IP模块。IPCP在运行的过程当中,主要是完成点对点通信设备的两端动态的协商IP地址。IPCP包在PPP没有达到网络层协议阶段以前不能进行交换,如果有IPCP包在到达此阶段前到达会被抛弃。
IPCP到底需要协商一些什么参数呢?最重要的是下面两项:
IPCP控制协议协商有两种方式:静态和动态:
PPP内置了的链路质量检测机制, PPP 通过定义链路质量报告包 (Link-Quality-Report Packet)和它的详细处理过程,为链路质量监控详细说明了监控机制。 PPP 没有具体说明链路质量监控策略――如何断定链路质量或者当链路不充分时该怎么 做。这个被留做一个实现决策,并且在链路的各端可能是有差别的。用各种各样的方法去实 现这一决策是被允许甚至鼓励的。链路质量监控机制说明书保证了使用不同策略的两个实现 可以实现通信和进行内部 *** 作。
Magic-Number: 魔数字段用于辅助检测链路自环。这是在链路建立过程中比较重要的一个参数,这个参数是在Config-Request里面被协商的,主要的作用是防止环路,如果在双方不协商魔术字的情况下,某些LCP的数据报文需要使用魔术字时,那么只能是将魔术字的内容填充为全0;反之,则填充为配置参数选项协商后的结果
魔术字在目前所有的设备当中都是需要进行协商的,它被放在Config-Request的配置选项参数中进行发送,而且需要由自身的通信设备独立产生,协议为了避免双方可能产生同样的魔术字,从而导致通信出现不必要的麻烦,因此要求由设备采用一些随机方法产生一个独一无二的魔术字。一般来说魔术字的选择会采用设备的系列号、网络硬件地址或时钟。双方产生相同魔术字的可能性不能说是没有的,但应尽量避免,通常这种情况是发产在相同厂商的设备进行互连时,因为一个厂商所生产的设备产生魔术字的方法是一样的。
我们知道魔术字产生的作用是用来帮助检测链路是否存在环路,当接收端B收到一个Config-Request报文时,会将此报文与上一次所接收到(应该是上一次发送出)的Config-Request进行比较,如果两个报文中所含的魔术字不一致的话,表明链路不存在环路。但如果一致的话,接收端B认为链路可能存在环路,但不一定存在环路,还需进一步确认。此时接收端B将发送一个Config-Nak报文,并在该报文中携带一个重新产生的魔术字,而且此时在未接收到任何Config-Request或Config-Nak报文之前,接收端B也不会发送任何的Config-Request报文。这时我们假设可能会有以下两种情况发生:
但在实际应用中根据不同设备实现PPP协议的方法,我们在链路环路检测时可采用两种方法。第一种机制就是如上面所述的,这个过程不断地重复,最终可能会给LCP状态机发一个Down事件,这时可能会使LCP的状态机又回到初始化阶段,又开始新一轮的协商。当然对于某些设备还会采用第二种机制,就是不产生任何事件去影响当前LCP的状态机,而是停留在请求发送状态。但这时认为链路有环路的一端设备需要不断的向链路上发送Echo-Request报文来检测链路环路是否被解除,当接收端收到Echo-Reply报文时,就认为链路环路被解除,从而就可能进行后续的PPP的过程。
PPP在LCP和NCP协商期间,都可以对各自的报文或报文头协商是否需要启用压缩机制。比如PPP头的压缩,或者IP报文的压缩等。
PPP是一个不可靠的二层协议,PPP并不提供关于流量控制,差错控制等可靠性机制,他把这些问题留给上层协议去解决。
其实这是很明智的做法,OSI七层模型中,各个层次都有相应的差错控制协议,比如二层链路层的等停协议或滑动窗口协议,到了传输层(如TCP),又有自己的可靠性协议。这样反反复复的各个层面都在做同样的事情,浪费了资源,并且带来了额外的复杂度。
PPP将可靠性问题留给上层去解决,自己则将更多的精力集中在上层没有解决的问题域上。最终取得了更好的效果。(PPP协议的广泛使用就是一个这种效果的一个很好的证明)
> PPP(Point to Point Protocol)协议 即点对点协议 是标准的Internet协议 我们可以利用ppp拨号连接到Internet 也可通过建立拨号服务器 提供ppp拨入服务 例如 有些机构有多个外地部门 在本地已连通Internet 而外地部门有拨号到中心机房连上Internet的需求 则要求中心机房有一台拨号服务器能提供ppp接入服务 而用目前比较流行的Linux *** 作系统来做 则显得轻松有余 本文以RedHat Linux为基础 详细讨论如何安装配置ppp拨号服务器 一 软件及网络环境 Redhat 内核 pppd 局域网 Linux 服务器IP设为 服务器名称为jsred 分配给拨号用户的固定IP为 主机名为admin 二 服务器端的安装 )安装pppd 在Linux服务器上查看有没有安装pppd 缺省安装是在/usr/ in/子目录下 如果存在 再查看系统内核有没有提供对ppp的模块支持 如没有 可以进到/usr/src/liunx 子目录 用make menuconfig或make config 对内核进行配置 在PPP支持选项上 选上模块标志 然后重新编译内核 用如下命令 make dep; make clean; make zlilo; rdev R /vmlinuz )安装调制解调器 在物理线路正确连接后打开Modem的电源 运行mini来测试Modem是否已经正确安装 输入mini s 命令设置Modem相关参数 首先查看缺省串行口 缺省为 /dev/modem 根据你所用的串行口将之改为/dev/ttyS 或/dev/ttyS 其次设置通信速率 如果mini 与Modem连接成功 进入会话状态 输入ATS = 如果紧接着在下一行出现OK 且Modem 的AA灯亮起 modem进入自动应答状态 表明mini与Modem通讯正常 Modem可以正常工作了 否则修改串口设置 重复上述步骤 也可用当地的ISP的电话号码拨号 看能否正确连接 一般是先有拨号音 然后是嘈杂声 再就是握手 表示接通 出现登录提示画面 可证明Modem已正确安装 如果遇到Modem能接通 网卡不能工作或网卡能工作而Modem接不通 则要查看是否由于Moem与网卡或其它设备中断冲突引起的 一般检测串行口所占用的中断号 输入 # cat /proc/interrupts 命令查看当前串口占用的中断号 例 : timer : keyboard : serial 可以看到当前串口占用的中断是 也可以用setserial 命令来给串口设置地址和中断号(IRQ) 例如 # / in/setserial/dev/ttys irq 赋给串口一( )中断值为 或 #/ in/setserial/dev/ttys auto_irq 赋给串口任意一个空闲中断号 )创建登录终端 在Unix中 将设备看成是一个特殊文件来进行访问控制 通过特殊文件可以访问特定的设备 Linux也不例外 Linux的标准虚拟终端有mingetty agetty等 本文介绍用mgetty 作为ppp客户登录进来的虚终端 你可以通过网上搜索得到该软件 Redhat 自带RPM包 mgetty i rpm 安装命令为 rpm ivh mgetty i rpm 安装完成后在/ in子目录下有二进制文件mgetty 然后进到/etc子目录 在inittab文件之后加上一句 s : :respawn:/ in/mgetty D s ttyS 保存 用init q命令重启进程 用ps aux命令可看到类似于 S : / in/mgetty D s ttyS 表明该终端已准备好 可以接受用户的拨入请求了 )创建或修改PPP相关配置文件 基于对拨号安全性的考虑 pppd默认要求进行主客户机的身份自验证 即对等验证 除非使用root用户帐号拨号或服务器没有连上Internet 因此为了使pppd能正常工作 需要在服务器端设置相应的主客户机验证信息 )编辑/etc/ppp/options文件 在其中加入 detach crtscts netmask asyncmap proxyarp 其中 Asyncmap 表示 在对远程机进行串行联接时 连接可能将ASCII控制码( )用于特殊的用途 所以 这些代码不能作为数据包的一部分进行传送 这就要告诉pppd 不要直接用这些控制码 而用特殊的两字符的转义序列来代替它们 Asyncmap 表示不需要对任何控制码进行转义处理 基于TCP/IP协议的以太网 并不直接利用IP地址 而是利用网卡MAC地址来传送数据包 Proxyarp告诉它在远程主机的Arp表中增加一项 列出本地机的地址和远程机的网卡MAC地址 Netmask可以根据具体子网划分 修改为相应的子网掩码值 )创建/etc/ppp/yS 或/etc/ppp/yS 文件 对相应端口进行设置 在该文件中加入一行 jsred:admin或 : 在/etc/hosts文件中为拨入进来的客户机登记一项 admin )编辑/etc/ppp/pap secrets文件 由于拨号采用PAP验证时 需在该文件中设置相应主客户机信息及PAP验证密码 在该文件中设置如下 admin jsred 第一项为客户机名称或IP 第二项为拨号服务器名称或IP 第三项为PAP密码 由于我们使用标准的password文件来进行身份验证 因而将这里的密码置空 第四项为动态分配给客户机的IP地址 )建立pcguest拨号用户帐号 创建登录Shell 用户通过电话拨号进来 以什么样的身份和权限进入网络呢?这就要为拨入用户建立相应的帐号和登录Shell 如 # adduser pcguest 在选择其Shell时 不要选/bin/bash 而是填入/etc/ppp/ppplogin ppplogin为拨入用户的登录Shell文件 相当于Novell网用户的登录脚本 它为拨号用户初始化登录环境 脚本如下 #! /bin/sh /usr/ in/pppd auth chap +pap login : 第一行表示脚本的其余部分用/bin/sh去解释该脚本 第二行的 +pap login 表示客户端和服务器端采用PAP的验证方式但使用/etc/password文件的内容 用 分隔的两项(IP地址)列出ppp拨号服务器和分配给客户机的IP地址 将该文件置为可执行模式 chmod ppplogin pppd默认只能由root用户执行 为了使普通用户能够执行pppd 需要运行命令 #chmod u+s /usr/ in/pppd 最后别忘了在/etc/shells文件中加进一句话 /etc/ppp/ppplogin 然后存盘退出 )启用Linux的IP转发功能 为客户机通过拨号服务器上Internet铺平道路 Redhat 默认是屏蔽IP转发的功能 为启用IP转发功能 修改文件/etc/nf将 net ipv ip_forward = 改为net ipv ip_forward= 保存退出 重启Linux服务器 服务器端设置工作完成 三 客户端的安装 在Windows 客户机上 安装拨号网络 新建一连接项 选中该连接项 单击鼠标右键d出菜单 单击 属性 打开 服务器 标签的 TCP/IP配置 对话窗口 在 指定IP地址 栏 填入拨号服务器分配给远端客户的IP地址 如 在 主控名称服务器地址 栏中输入Internet上有效的DNS服务器的IP地址 如果该Linux服务器能提供DNS服务 也可填入Linux服务器的IP地址 保存退出 双击连接项 进入拨号状态 当终端窗口中出现登录提示 输入pcguest用户名及相应密码 再点击 继续 按钮 则一个稳定 快速的PPP连接就建立了 四 测试 测试用户有没有拨进服务器 可以在Linux服务器的控制台终端输入 # who root ttyp Apr : pcguest ttyS Apr : 上面的pcguest即为通过ttyS 终端登录的ppp客户 或输入命令 # ifconfig 你会发现除了以太网卡eth 本地环路lo外 还多一个ppp 项 表明客户已成功拨入 打开客户端的浏览器 如Netscape或IE 看能否正常访问Internet站点 lishixinzhi/Article/program/Oracle/201311/18391
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)