Ubuntu 下搭建 PPTP VPN

之前买的 VPN 服务快到期了,正好手上有东京的 VPS,趁机利用起来,整个过程这里记录一下

配置 PPTP

安装 pptpd,安装之前可以先 apt-get update 一下

1
sudo apt-get install pptpd

装好了之后修改配置文件

1
sudo vim /etc/pptpd.conf

取消以下两行注释:

1
2
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

分别是通过 VPN 连接后主机和客户端所使用的 IP,可以自行修改。注意这个IP在下面还会用的到

设置 dns:

1
sudo vim /etc/ppp/pptpd-options

找到 ms-dns,取消掉注释,改成 8.8.8.8, 8.8.4.4

设置账号:

1
sudo vim /etc/ppp/chap-secrets

添加一行,依次为:用户名,服务,密码,限制 ip

1
username pptpd password *

重启服务,查看状态,是否监听了 1723 端口:

1
2
3
sudo service pptpd restart
sudo service pptpd status
netstat -antp|grep 1723

设置 IP 转发

1
sudo vim /etc/sysctl.conf

取消掉 net.ipv4.ip_forward=1 这一行的注释,如果未来 ipv6 普及了,估计应该就是改 ipv6 了

然后执行

1
sudo sysctl -p

使修改后的文件配置立即生效

安装iptables,如果还没有安装的话:

1
sudo apt-get install iptables

然后开启NAT转发:

1
sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

192.168.0.0/24 是我们在上面设置的 IP 段,让这个段转发

注意 eth0 是你连接外网的那块网卡,不一定是 0 也有可能是 1 或者看你的机器哪块网卡连的外网了。这样就以NAT的方式请求外网的东西了。不知道你的机器哪块网卡连的外网的话 ifconfig 一下看看哪个网卡是外网IP就知道了

保存规则,使重启后规则不丢失,先用 su 命令进入 root 用户,然后:

1
iptables-save >/etc/iptables-rules

编辑网卡文件,加载网卡时自动加载规则(似乎可能导致 ec2 实例无法重启)

1
sudo vim /etc/network/interfaces

末尾加入:

1
pre-up iptables-restore </etc/iptables-rules

常见问题

1、PTY read or GRE write failed

查看日志/var/log/syslog,发现类似这样的错误:

1
2
3
4
GRE: read(fd=6,buffer=80504c0,len=8196) from PTY failed: status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs
CTRL: PTY read or GRE write failed (pty,gre)=(6,7)
CTRL: Reaping child PPP[13354]
CTRL: Client XXX.XXX.XXX.XXX control connection finished

打开 /etc/pptpd.conf,把 logwtmp 注释掉即可

2、pptpd 无法启动

运行 service pptpd status 查询服务状态时提示 pptpd is not running
再次 service pptpd start,查询状态依然提示 pptpd is not running

这个貌似是 ubuntu14.04 的一个 bug

打开/etc/init.d/pptpd,找到下面这行

1
status_of_proc "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?

在 status_of_proc 后面添加一个参数 -p

1
status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?

然后保存重启服务即可

3、经常掉线或网速非常慢

这个问题似乎和 MTU 默认大小有关,设置 MTU,防止包过大:

1
sudo iptables -A FORWARD -s 192.168.0.0/24 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j TCPMSS --set-mss 1200

然后记得保存:

1
sudo iptables-save >/etc/iptables-rules