Linux 通过 pptp 连接 VPN 网络

pptp是Linux的下的VPN软件,其中pptpclient可以连接到到VPN网络。

一、环境检测

$ file /dev/ppp
/dev/ppp: character special

系统支持ppp,如果不支持ppp,可能需要重新编译内核了。

二、安装pptpclient

因为是连接网络,所以只需安装pptp客户端即可。
Debian/Ubuntu下
aptitude install pptpclient

ArchLinux下
pacman -S pptpclient

三、配置账号

修改文件/etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client	server	secret			IP addresses
miao * password *

添加了一个名为miao的用户,密码为password

四、手动连接到VPN

1. 通过pptp命令连接到VPN

$ pptp 服务器IP或域名  noauth require-mppe-128 name miao nodetach mtu 1416
Using interface ppp0
Connect: ppp0 <--> /dev/pts/3
CHAP authentication succeeded
MPPE 128-bit stateless compression enabled
Cannot determine ethernet address for proxy ARP
local  IP address 192.168.92.11
remote IP address 192.168.92.1

成功连接至VPN
pptp命令格式为:pptp 服务器IP或域名 [pptp选项] [pppd选项]
上面命的的pppd所用的参数为

noauth 不进行自验证
require-mppe-128 支持mppe-128加密
name miao 登录的用户名为miao 相应的密码存在/etc/ppp/chap-secrets
nodetach 不作为daemon运行,便于调式
mtu 1416 避免错误
anon warn[decaps_gre:pptp_gre.c:331]: short read (-1): Message too long

2. 查看成ppp0状态

$ ifconfig ppp0
ppp0      Link encap:Point-to-Point Protocol  
          inet addr:192.168.92.11  P-t-P:192.168.92.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1412  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:62 (62.0 b)  TX bytes:68 (68.0 b)

3. 修改dns

因为远程的VPN服务器无法连接当地的域名服务器,从而无法解析域名。可以修改成google的8.8.8.8
修改 /etc/resolv.conf 为

nameserver 127.0.0.1
nameserver 8.8.8.8

4. 配置route

查看当前route状态

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
a.b.c.d         192.168.1.1     255.255.255.255 UGH   0      0        0 eth0
192.168.92.1    0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

其中a.b.c.d为系统添加的vpn服务器的IP。
当前的访问仍然是通过gateway 192.168.1.1,为了让所有请求通过ppp0,需要修改route

修改default的interface为ppp0,即所有的请求通过ppp0

$ route del default; route add default dev ppp0
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.92.1    0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0

如果要恢复route,执行

$ route del default dev ppp0; route add default gw 192.168.1.1 dev eth0

五、更完善配置

通过pon,poff可以使上面手动配置建立配置文件,便于管理
pon
pon 名称
将调用 /etc/ppp/peers/名称

1. 配置peers

新建配置文件
/etc/ppp/peers/vpn

pty "pptp 服务器ip --nolaunchpppd --loglevel 0"
noauth 
require-mppe-128 
name miao 
mtu 1416

参数和命令行的几乎一样,只是多了pty,少了nodetach
–loglevel 0是为了避免日志中出现大量的reorded packet信息,眼不见为清。
对于大量reroded packet我尚无解决方法,加入 –nobuffer 也无作用

2. 配置触发

配置路由触发:
当vpn连接成功或断开时需要配置route
连接 /etc/ppp/ip-up.d/01-vpn.sh

#!/bin/sh

if [ "$IFNAME" = "ppp0" ]; then
  echo "nameserver 127.0.0.1
nameserver 8.8.8.8" > /etc/resolv.conf
  route del default dev eth0
  route add default dev ppp0
fi

断开 /etc/peer/ip-down.d/01-vpn.sh

#!/bin/sh

if [ "$IFNAME" = "ppp0" ]; then
  echo "nameserver 127.0.0.1
nameserver 116.228.111.18" > /etc/resolv.conf
  route del default dev ppp0
  route add default gw 192.168.1.1 dev eth0
fi

其中的 nameserver 116.228.111.18 因地区的不同而不同。

两个脚本的必需有执行权限。

chmod +x 01-vpn.sh

3. 完成

连接vpn

pon vpn

断开连接

poff vpn

六、相关帮助

log文件: /var/log/messages.log
man pppd
man pptp

共3条Pingback
共16条评论
  1. steelhorn @ 2011-06-22 16:58:42 回复

    你好 我装了pptp以后 我发现vpn连接上来的用户都无法解析域名 我用的是8.8.8.8的这个解析 请问这个可能是什么情况导致的?

    • JiangMiao @ 2011-06-22 22:38:50

      可能有2种情况:
      1、因为本地域名服务器,但对于VPN来说不可访问。
      2、使用的是局域网的DNS服务器IP,而对VPN来说该IP无效。
      解决方法,除了使用开放的DNS服务器,也可以通过route,使得对于DNS服务器,直接通过以太网接口(一般是eth0)访问。而非ppp。

  2. pptp @ 2011-07-23 21:58:09 回复

    博主你好 我按照你的方法与连接参数成功连接了vpn,之前用了好多方法都没成功,你这篇博文真是帮了大忙了,真是太感谢你了。嘿嘿。

    • JiangMiao @ 2011-07-24 01:38:39

      客气了 :)

  3. shakhand @ 2011-11-21 21:31:20 回复

    按照博主的步骤,可以成功建立vpn连接,但是在设置路由和dns的时候仍然正常上网,
    诡异的是ping 网站的时候都可以ping通,但是仍然不能用浏览器上网,不知何故。
    这是我建立vpn的信息
    Connect: ppp0 /dev/pts/1
    CHAP authentication succeeded
    Cannot determine ethernet address for proxy ARP
    local IP address 10.9.0.48
    remote IP address 10.9.0.1

    是不是设置路由没有设对呢?

    • JiangMiao @ 2012-03-30 16:05:17

      可以试试dig或nslookup域名,看能否正确解析。

  4. nicholasjiajia @ 2012-03-28 16:16:17 回复

    兄弟!绝对技术贴!!!找了好久,就你这儿成功了,很专业也细致!!!!膜拜!

    • JiangMiao @ 2012-03-30 01:35:32

      :D,成功就好。

  5. qhappy @ 2012-10-17 16:14:01 回复

    成功的 过来 报道一下.

  6. 米建 @ 2012-11-10 00:25:22 回复

    使用你的方法能够连接VPN,但如果route del default; route add default dev ppp0后并无法连接网络了,因为我的网关192.168.4.1网关被删除了,这里是不是还要注意什么地方?

  7. ghewqqq @ 2012-12-23 18:51:08 回复

    我的情况跟你一样。删除之前的默认路由后 就上不了网了。不知道你解决没有!

    • JiangMiao @ 2012-12-24 04:16:50

      route -n 的输出是?

  8. geeker @ 2013-01-28 09:27:28 回复

    我运行pptp的时候出现:
    /usr/sbin/pppd: The remote system is required to authenticate itself
    /usr/sbin/pppd: but I couldn’t find any suitable secret (password) for it to use to do so.
    /usr/sbin/pppd: (None of the available passwords would let it use an IP address.)
    因为我的vpn需要验证,所以去掉noauth选项。请问如果是这种情况应该怎么配置?

  9. 周豪 @ 2015-11-15 20:36:18 回复

    正在连linux下面的l2tp,发现这篇技术贴。先行道谢。但是route那边搞不明白,默认网关gateway168.192.1.1好像被替代了,请问是什么原理,因为感觉从物理上局域网路由器还是必须通过路由器的网关转发啊,就算是公网直接连接的,那个网关应该在物理上还是不变的啊?能指点下吗?想了解这方面的原理

  10. 周豪 @ 2015-11-15 20:38:32 回复

    感觉网关gateway 168.192.1.1为什么能删掉呢,最近vpn网络上的资料也是这里卡住了,实在搞不懂是怎么一回事 资料链接 https://wiki.archlinux.org/index.php/L2TP/IPsec_VPN_client_setup 谢谢指点

  11. 小杨 @ 2017-10-31 16:16:28 回复

    pptp 服务器IP或域名 noauth require-mppe-128 name 登录的用户名 nodetach mtu 1416
    你好博主 我的运行完上面的命令后 还是提示如下,我是一步步按照你的配置要求来做的,不知道为什么就不行,能否指点一下,找了好几天的方法了,感觉就你这个可行一点,可是我还是配不成功。能否加个Q 谢谢了

    Using interface ppp0
    Connect: ppp0 /dev/pts/2
    No CHAP secret found for authenticating us to JXNC4
    MS-CHAP authentication failed: bad username or password
    CHAP authentication failed
    Connection terminated.

发表评论

电子邮件地址不会被公开。 必填项已用*标注