pptp

pptp(point to point tunneling protocol) 使用的认证方式有如下四种:
pap(Password Authentication Protocol):使用明文传送用户名密码
chap(Challenge/Handshake Authentication Protocol):即 challenge/response 的方式
MSCHAP:MS 自家搞的一套玩意儿。
MS-CHAP-v2:升级版本

建议使用 MS-CHAP-v2

加密使用的是 MPPE(Microsoft’s Point-to-Point Encryption protocol,又是 MS 搞的一套),基于 RSA,基本没有安全性可言。那为什么还有那么多人用?方便,尤其对 MS 用户而言,点击几下就可以了。

pptp 使用的端口为 1723 ,不可修改端口。再加上使用 GRE(Generic Routing Encapsulation)协议来传输数据包使得 pptp 可以轻易被封锁。

tldp 上介绍 ppp 的文档

安装就不说了,下面贴配置,平台是 ubuntu 10.04.1 x86_64 server。

$ cat /etc/pptpd.conf

option /etc/ppp/pptpd-options
noipparam
logwtmp
localip 10.8.1.1
remoteip 10.8.1.200-250

$ cat /etc/ppp/pptpd-options

# 使用默认的 pptpd 就好了,如果要修改,需要修改 chap-secrets 中的 server 段
name pptpd
 
# 使用 MSCHAP-V2
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2

# 使用 MPPE 加密。如果 server 没有加密,在客户端的 Security 中,不要勾选 "Require data encryption(disconnect if none),否则会出现下面的错误
# 742:The remote computer does not support the required data encryption type.
require-mppe-128
 
# push 给客户端的 DNS
ms-dns 8.8.4.4
ms-dns 8.8.8.8
 
# 默认
proxyarp
nodefaultroute
 
# 开启 log,便于 troubleshooting
logfile /var/log/pptpd.log
debug
dump
 
# 默认
lock
 
# 关闭压缩
nobsdcomp

# 客户端如果没有任何流量, 1 小时服务器主动断开连接
idle 3600

$ cat /etc/ppp/options

asyncmap 0
auth
crtscts
lock
hide-password
modem
proxyarp
lcp-echo-interval 30
lcp-echo-failure 20
noipx

$ cat /etc/ppp/chap-secrets

fuckwfg xxxxxxx pptpd *

nat 转换:

$ sudo /sbin/iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 -j MASQUERADE

在客户端成功连接后,可以通过 ifconfig 或者 /proc/net/dev 查看目前的客户端数量。

网上有人说要加载 ppp-compress-18,由于这里是 linode 的 vps,内核都是经过 linode 编译的,所以我猜想 linode 直接将其编译进了内核而不是做为模块的方式存在的。

在使用客户端时,如果是要番羽墙的话,是要勾选下图所示的 “Use default gateway on remote network";否则只能连接远端服务器的局域网。

如果连接失败,查看日志信息:

$ tail -f /var/log/daemon.log
$ tail -f /var/log/messages

在实践过程中出现如下的错误:

Nov  6 17:00:23 jaseywang pppd[20382]: 115200#011#011# (from command line)
Nov  6 17:00:23 jaseywang pppd[20382]: lock#011#011# (from /etc/ppp/pptpd-options)
Nov  6 17:00:23 jaseywang pppd[20382]: crtscts#011#011# (from /etc/ppp/options)
Nov  6 17:00:23 jaseywang pppd[20382]: local#011#011# (from command line)
Nov  6 17:00:23 jaseywang pppd[20382]: asyncmap 0#011#011# (from /etc/ppp/options)
Nov  6 17:00:23 jaseywang pppd[20382]: lcp-echo-failure 4#011#011# (from /etc/ppp/options)
Nov  6 17:00:23 jaseywang pppd[20382]: lcp-echo-interval 30#011#011# (from /etc/ppp/options)
Nov  6 17:00:23 jaseywang pppd[20382]: hide-password#011#011# (from /etc/ppp/options)

错误提示说的很清楚,是由 lcp-echo-failure/lcp-echo-interval 造成的,加大目前的值即可。

使用过程中还出现如下的错误:

Nov  6 13:32:29 jaseywang pptpd[19695]: GRE: read(fd=6,buffer=611640,len=8196) from PTY failed: status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs
Nov  6 13:32:29 jaseywang pptpd[19695]: CTRL: PTY read or GRE write failed (pty,gre)=(6,7)

根据此文说述,在 pptpd.conf 中添加 noipparam,但在本机上并没有效果。

An EIO on read from the PTY is caused when pppd has failed and closed the PTY. pppd failed for some reason. pptpd does not report why pppd failed. pptpd not reporting why pppd failed is a bug, but it is not yet fixed.
    You should look at why pppd failed, which is most likely your fault, not a bug. pppd fails when it does not understand the options you entered, or when it could not negotiate with the peer. Running pppd manually against your options.pptpd file would find bad options. Adding "debug dump" to options.pptpd file will capture cause of negotiation failure.

据此基本可以判定是由于配置的错误或者客户端与服务端协商错误造成的。

这个是 log 错误信息,可供参考。