Jun
11
[原]Linux 下部署PPTP VPN -- 服务端
有朋友让协助在VPS上部署PPTP VPN服务,刚好另有项目需要连接到远端的PPTP服务器上,那干脆整理一下吧。本文分两部分,第一部分是Linux做服务端及Windows做客户端,第二部分是Linux做客户端。
一、简介
什么是PPTP
PPTP:点对点隧道协议(Point to Point Tunneling Protocol)
点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术。通过该协议,远程用户能够通过 Microsoft Windows NT 工作站、Windows 95 和 Windows 98 操作系统以及其它装有点对点协议的系统安全访问公司网络,并能拨号连入本地 ISP,通过 Internet 安全链接到公司网络。
PPTP 可以用于在 IP 网络上建立 PPP 会话隧道。在这种配置下,PPTP 隧道和 PPP 会话运行在两个相同的机器上,呼叫方充当 PNS。PPTP 使用客户机-服务器结构来分离当前网络访问服务器具备的一些功能并支持虚拟专用网络。PPTP 作为一个呼叫控制和管理协议,它允许服务器控制来自 PSTN 或 ISDN 的拨入电路交换呼叫访问并初始化外部电路交换连接。
PPTP 只能通过 PAC 和 PNS 来实施,其它系统没有必要知道 PPTP。拨号网络可与 PAC 相连接而无需知道 PPTP。标准的 PPP 客户机软件可继续在隧道 PPP 链接上操作。
PPTP 使用 GRE 的扩展版本来传输用户 PPP 包。这些增强允许为在 PAC 和 PNS 之间传输用户数据的隧道提供低层拥塞控制和流控制。这种机制允许高效使用隧道可用带宽并且避免了不必要的重发和缓冲区溢出。PPTP 没有规定特定的算法用于低层控制,但它确实定义了一些通信参数来支持这样的算法工作。
PPTP对比OpenVPN来说,优点在与比较简单,而且Windows系统、iPAD、Android 等设备自带客户端,不需额外安装,很多硬件VPN设备也提供相同的协议支持。
二、系统架构
三、准备工作
在Linux环境下,服务端和客户端都需安装额外的软件包。通常标准的类RedHat系统所提供的核心是没问题的,但在某些VPS环境,特别是OpenVZ中,是不会提供支持的。所以,在工作前,我们需要确认当前环境的状态。
1.确认内核是否支持
确认是否支持PPP协议:
报该信息,则说明内核是提供PPP协议支持的。可确认以下权限是否正确:
否则,请手动删除后,重新建立:
确认支持tun设备:
报此信息则可用。否则,以上两条任一没有通过都是不行的。若是VPS,你可以连接供应商协助。若是自己安装的服务器,请参考附录中的帮助信息。
确定内核是否支持mppe:
若报“FATAL: Module ppp_mppe not found.”,则说明不支持MPPE加密。(后面配置时会用到)
2.确认PPP版本
PPP版本需要在2.4.2以上:
检查PPP是否支持MPPE:
以上命令输出为“0”则表示不支持,输出为“30”或更大的数字则支持。
四、安装及配置服务端
1.安装服务端
官网:http://poptop.sourceforge.net/
rpm 包方式安装:
本地下载:
2.配置IP池
在/etc/pptpd.conf 加入以下设定,用于配置客户端可用IP:
3.配置PPTPD选项
编辑/etc/ppp/options.pptpd,加入:
※ 注意
如果上面的准备工作中,您的机器是支持MPPE加密的,请保持下面的配置信息:
否则,请把其用“#”号注释掉。
4.配置登录用户名和密码
编辑/etc/ppp/chap-secrets,按下面的格式输入:
其中,第一列为登陆用户名,第二列为PPP服务名,第三列为登陆密码,第四列为允许客户端访问IP范围。
5.配置内核参数,允许IP转发
把/etc/sysctl.conf中的net.ipv4.ip_forward修改为1:
然后执行sysctl -p激活。
6.路由NAT转发
最后这一步是可选的。如果您希望拨号到VPN后,所有流量都将转由经过VPN发送(翻墙),那就需要把VPN客户端的数据流通过iptables的NAT转发出去:
6.保存配置
保存iptables配置:
启动服务:
设置为开机启动:
五、配置Windows客户端
Windows 系统自带PPTP客户端,打开“控制面板”——“网络和Internet”——“网络和共享中心”。在“更改网络设置”部分,点击“设置新的连接或网络”,在弹出窗口中,选择“连接到工作区”:
选择“否,创建新连接”:
选择“使用我的Internet连接(VPN):
输入VPN服务器地址信息,给个易记的名称,并把“现在不连接;仅进行设置以便稍后连接”的选项选中:
接着,上面设置的用户名和密码:
创建完成。
但为了加快连接速度,已经设定一些安全认证,需要对上述创建的连接进行配置。从Win7右下角的网络连接图标上,选择对应的连接,然后点击鼠标右键,选择“属性”:
在弹出框中,选择“安全”页,把“VPN类型”调整为“点对点隧道协议(PPTP)”。
若在上面进行服务器配置时,不支持MPPE的,则需把“数据加密”调整为“可选加密(没有加密也可以连接)”(如上图)。否则,拨号时可能会出现734错误。
还有一点需要留意的,默认情况下,Windows是把VPN远端设置为默认网关的,也就是说,连接VPN后,所有的流量都将通过VPN传输(翻墙就是这样)。但如果你的情况不同,仅需连接VPN访问特定的服务器,不需修改网关的。那么,请在上面的“属性”弹出框中,选择“网络”,然后点击“Internet 协议版本4(TCP/IPv4)”,点击“属性”:
在弹出框中选择“高级”,在下一个弹出框中,可看到“在远程网络上使用默认网关”的选项:
在此,根据您的实际情况来选择吧。一切完成后,即可开始进行VPN连接。
连接状态:
路由状态:
六、注意事项
1.PPTP默认使用1723 TCP端口,需要保证防火墙可通过;
2.如果客户端在iptables 防火墙后面,需要保证可运行GRE数据包通过;
否则,连接时会报806错误:
基于TCP的双向特性,GRE包必须是双向允许。iptables 上可加载ip_nat_pptp模块使iptables支持PPTP穿透。
或把其加入/etc/sysconfig/iptables-config文件的IPTABLES_MODULES配置中
一些老版本,例如DC Server 5.0的2.6.9核心是没有提供这模块的,有升级补丁。但更好的办法是升级到2.6.18以上核心,并确保在编译核心时,把该模块给选上。
2.6.18核心的ip_nat_pptp模块所在kernel配置位置:
Symbol: IP_NF_PPTP [=m] │
│ Prompt: PPTP protocol support │
│ Defined at net/ipv4/netfilter/Kconfig:169 │
│ Depends on: NET && INET && NETFILTER && IP_NF_CONNTRACK │
│ Location: │
│ -> Networking │
│ -> Networking support (NET [=y]) │
│ -> Networking options │
│ -> Network packet filtering (replaces ipchains) (NETFILTER [=y]) │
│ -> IP: Netfilter Configuration │
│ -> Connection tracking (required for masq/NAT) (IP_NF_CONNTRACK [=m │
│ │
│ │
│ Symbol: IP_NF_NAT_PPTP [=m]
3. 部分网站无法访问的问题
在实际使用中,发现有些网站,例如:www.z.cn 等无法访问,或者只能打开网页标题而无法看到实际内容。
经排查,问题原因是MTU的值有问题,可能太大,也可能太小了。
这可以在客户端连接服务器后,在服务端查看网卡的对应值获得当前的MTU大小。
若要修改,可以修改/etc/ppp/options.pptpd ,在里面加入设定值,例如:
在我的CentOS 6.5 环境中,是需要设大的。
然后,断开当前连接,重新拨号即可。
也可以修改/etc/ppp/ip-up 脚本,在exit 0 的上面增加一行命令:
同样可以达到修改的目的。
实际的大小,可以根据网络的环境设置,通常为1496或1356。
参考:
PPTPD默认MTU太大引起一些网站上不了的问题
用WindowsXP拨入pptpd搭建的VPNServer后传输大包有问题
※ 2014-01-06 更新MTU 问题
一、简介
什么是PPTP
PPTP:点对点隧道协议(Point to Point Tunneling Protocol)
点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术。通过该协议,远程用户能够通过 Microsoft Windows NT 工作站、Windows 95 和 Windows 98 操作系统以及其它装有点对点协议的系统安全访问公司网络,并能拨号连入本地 ISP,通过 Internet 安全链接到公司网络。
PPTP 可以用于在 IP 网络上建立 PPP 会话隧道。在这种配置下,PPTP 隧道和 PPP 会话运行在两个相同的机器上,呼叫方充当 PNS。PPTP 使用客户机-服务器结构来分离当前网络访问服务器具备的一些功能并支持虚拟专用网络。PPTP 作为一个呼叫控制和管理协议,它允许服务器控制来自 PSTN 或 ISDN 的拨入电路交换呼叫访问并初始化外部电路交换连接。
PPTP 只能通过 PAC 和 PNS 来实施,其它系统没有必要知道 PPTP。拨号网络可与 PAC 相连接而无需知道 PPTP。标准的 PPP 客户机软件可继续在隧道 PPP 链接上操作。
PPTP 使用 GRE 的扩展版本来传输用户 PPP 包。这些增强允许为在 PAC 和 PNS 之间传输用户数据的隧道提供低层拥塞控制和流控制。这种机制允许高效使用隧道可用带宽并且避免了不必要的重发和缓冲区溢出。PPTP 没有规定特定的算法用于低层控制,但它确实定义了一些通信参数来支持这样的算法工作。
PPTP对比OpenVPN来说,优点在与比较简单,而且Windows系统、iPAD、Android 等设备自带客户端,不需额外安装,很多硬件VPN设备也提供相同的协议支持。
二、系统架构
引用
服务器:
操作系统:红旗 Asianux 3.0 SP3 for x86_64
IP:124.248.205.115 (虚拟的外网IP)
客户端:
操作系统:红旗 Asianux 3.0 SP3 for x86_64 或 Windows 7
IP:192.168.228.220
操作系统:红旗 Asianux 3.0 SP3 for x86_64
IP:124.248.205.115 (虚拟的外网IP)
客户端:
操作系统:红旗 Asianux 3.0 SP3 for x86_64 或 Windows 7
IP:192.168.228.220
三、准备工作
在Linux环境下,服务端和客户端都需安装额外的软件包。通常标准的类RedHat系统所提供的核心是没问题的,但在某些VPS环境,特别是OpenVZ中,是不会提供支持的。所以,在工作前,我们需要确认当前环境的状态。
1.确认内核是否支持
确认是否支持PPP协议:
引用
# cat /dev/ppp
cat: /dev/ppp: No such device or address(没有那个设备或地址)
cat: /dev/ppp: No such device or address(没有那个设备或地址)
报该信息,则说明内核是提供PPP协议支持的。可确认以下权限是否正确:
引用
# ll /dev/ppp
crw------- 1 root root 108, 0 Jun 3 18:30 /dev/ppp
crw------- 1 root root 108, 0 Jun 3 18:30 /dev/ppp
否则,请手动删除后,重新建立:
# rm /dev/ppp
# mknod /dev/ppp c 108 0
# mknod /dev/ppp c 108 0
确认支持tun设备:
引用
# cat /dev/net/tun
cat: /dev/net/tun: File descriptor in bad state(文件描述符处于错误状态)
cat: /dev/net/tun: File descriptor in bad state(文件描述符处于错误状态)
报此信息则可用。否则,以上两条任一没有通过都是不行的。若是VPS,你可以连接供应商协助。若是自己安装的服务器,请参考附录中的帮助信息。
确定内核是否支持mppe:
引用
# modprobe ppp-compress-18 && echo 'mppe support'
mppe support
mppe support
若报“FATAL: Module ppp_mppe not found.”,则说明不支持MPPE加密。(后面配置时会用到)
2.确认PPP版本
PPP版本需要在2.4.2以上:
引用
# rpm -qa|grep ppp
ppp-2.4.4-2AXS3
ppp-2.4.4-2AXS3
检查PPP是否支持MPPE:
引用
# strings '/usr/sbin/pppd' |grep -i mppe | wc -l
42
42
以上命令输出为“0”则表示不支持,输出为“30”或更大的数字则支持。
四、安装及配置服务端
1.安装服务端
官网:http://poptop.sourceforge.net/
rpm 包方式安装:
# rpm -ivh http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.i386.rpm(32位系统)
# rpm -ivh http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.x86_64.rpm(64位系统)
# rpm -ivh http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.x86_64.rpm(64位系统)
本地下载:
下载文件
2.配置IP池
在/etc/pptpd.conf 加入以下设定,用于配置客户端可用IP:
引用
localip 192.168.0.1 #服务端IP,不需在网卡上设定的,仅供VPN客户端连接
remoteip 192.168.0.200-238,192.168.0.250 #客户端IP池
remoteip 192.168.0.200-238,192.168.0.250 #客户端IP池
3.配置PPTPD选项
编辑/etc/ppp/options.pptpd,加入:
引用
ms-dns 8.8.8.8 #Google的DNS服务器地址
ms-dns 8.8.4.4
ms-dns 8.8.4.4
※ 注意
如果上面的准备工作中,您的机器是支持MPPE加密的,请保持下面的配置信息:
引用
require-mppe-128
否则,请把其用“#”号注释掉。
4.配置登录用户名和密码
编辑/etc/ppp/chap-secrets,按下面的格式输入:
引用
# Secrets for authentication using CHAP
# client server secret IP addresses
linuxfly.org pptpd redflag *
# client server secret IP addresses
linuxfly.org pptpd redflag *
其中,第一列为登陆用户名,第二列为PPP服务名,第三列为登陆密码,第四列为允许客户端访问IP范围。
5.配置内核参数,允许IP转发
把/etc/sysctl.conf中的net.ipv4.ip_forward修改为1:
引用
# vi /etc/sysctl.conf |grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward = 1
然后执行sysctl -p激活。
6.路由NAT转发
最后这一步是可选的。如果您希望拨号到VPN后,所有流量都将转由经过VPN发送(翻墙),那就需要把VPN客户端的数据流通过iptables的NAT转发出去:
# iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -j SNAT --to-source 124.248.205.115
6.保存配置
保存iptables配置:
# service iptables save
启动服务:
# service iptables restart
# service pptpd start
# service pptpd start
设置为开机启动:
# chkconfig --level 35 iptables on
# chkconfig --level 35 pptpd on
# chkconfig --level 35 pptpd on
五、配置Windows客户端
Windows 系统自带PPTP客户端,打开“控制面板”——“网络和Internet”——“网络和共享中心”。在“更改网络设置”部分,点击“设置新的连接或网络”,在弹出窗口中,选择“连接到工作区”:
选择“否,创建新连接”:
选择“使用我的Internet连接(VPN):
输入VPN服务器地址信息,给个易记的名称,并把“现在不连接;仅进行设置以便稍后连接”的选项选中:
接着,上面设置的用户名和密码:
创建完成。
但为了加快连接速度,已经设定一些安全认证,需要对上述创建的连接进行配置。从Win7右下角的网络连接图标上,选择对应的连接,然后点击鼠标右键,选择“属性”:
在弹出框中,选择“安全”页,把“VPN类型”调整为“点对点隧道协议(PPTP)”。
若在上面进行服务器配置时,不支持MPPE的,则需把“数据加密”调整为“可选加密(没有加密也可以连接)”(如上图)。否则,拨号时可能会出现734错误。
还有一点需要留意的,默认情况下,Windows是把VPN远端设置为默认网关的,也就是说,连接VPN后,所有的流量都将通过VPN传输(翻墙就是这样)。但如果你的情况不同,仅需连接VPN访问特定的服务器,不需修改网关的。那么,请在上面的“属性”弹出框中,选择“网络”,然后点击“Internet 协议版本4(TCP/IPv4)”,点击“属性”:
在弹出框中选择“高级”,在下一个弹出框中,可看到“在远程网络上使用默认网关”的选项:
在此,根据您的实际情况来选择吧。一切完成后,即可开始进行VPN连接。
连接状态:
路由状态:
六、注意事项
1.PPTP默认使用1723 TCP端口,需要保证防火墙可通过;
2.如果客户端在iptables 防火墙后面,需要保证可运行GRE数据包通过;
否则,连接时会报806错误:
基于TCP的双向特性,GRE包必须是双向允许。iptables 上可加载ip_nat_pptp模块使iptables支持PPTP穿透。
# modprobe ip_nat_pptp
或把其加入/etc/sysconfig/iptables-config文件的IPTABLES_MODULES配置中
引用
IPTABLES_MODULES="ip_nat_pptp ip_nat_tftp"
一些老版本,例如DC Server 5.0的2.6.9核心是没有提供这模块的,有升级补丁。但更好的办法是升级到2.6.18以上核心,并确保在编译核心时,把该模块给选上。
2.6.18核心的ip_nat_pptp模块所在kernel配置位置:
Symbol: IP_NF_PPTP [=m] │
│ Prompt: PPTP protocol support │
│ Defined at net/ipv4/netfilter/Kconfig:169 │
│ Depends on: NET && INET && NETFILTER && IP_NF_CONNTRACK │
│ Location: │
│ -> Networking │
│ -> Networking support (NET [=y]) │
│ -> Networking options │
│ -> Network packet filtering (replaces ipchains) (NETFILTER [=y]) │
│ -> IP: Netfilter Configuration │
│ -> Connection tracking (required for masq/NAT) (IP_NF_CONNTRACK [=m │
│ │
│ │
│ Symbol: IP_NF_NAT_PPTP [=m]
3. 部分网站无法访问的问题
在实际使用中,发现有些网站,例如:www.z.cn 等无法访问,或者只能打开网页标题而无法看到实际内容。
经排查,问题原因是MTU的值有问题,可能太大,也可能太小了。
这可以在客户端连接服务器后,在服务端查看网卡的对应值获得当前的MTU大小。
若要修改,可以修改/etc/ppp/options.pptpd ,在里面加入设定值,例如:
引用
mtu 1496
在我的CentOS 6.5 环境中,是需要设大的。
然后,断开当前连接,重新拨号即可。
也可以修改/etc/ppp/ip-up 脚本,在exit 0 的上面增加一行命令:
引用
ifconfig $1 mtu 1496
同样可以达到修改的目的。
实际的大小,可以根据网络的环境设置,通常为1496或1356。
参考:
PPTPD默认MTU太大引起一些网站上不了的问题
用WindowsXP拨入pptpd搭建的VPNServer后传输大包有问题
※ 2014-01-06 更新MTU 问题
Asiaidc.net
2016/06/30 17:37
非常详细的教程,学习了!
嗨嗨
2014/07/17 09:57
很详细 谢谢。有个问题:vpn经常断开,提示:链接没有成功,重新连接被挂起.
linuxing 回复于 2014/07/25 23:21
网络不稳定。
分页: 1/1 1