Jun
12
[原]Linux 下部署PPTP VPN -- 客户端
继续昨天的话题,Linux作为PPTP的服务端和Windows作为PPTP的客户端已顺利实施。接下来要做的,就是把Linux作为客户端了。工作也不复杂,主要麻烦在需要手动修改路由表。
一、客户端环境
与Windows不同,Linux客户端连接成功后,不会使用远端的网关,需要手动进行路由表的配置工作。
为方便后续的说明,特把客户端的信息描述一下:
连接前的路由表信息为:
二、下载及安装客户端
大多Linux发行版都没带PPTP客户端,或只提供图形界面的配置工具。所以,第一步要做的,就是下载软件包。
官网:http://pptpclient.sourceforge.net/
本地下载(含rpm包):
执行:
(rpm包安装更简单,直接rpm -ivh即可)
配置:
这命令的意思的,以用户名linuxfly.org、密码redflag,创建一个叫vpn的连接。encrypt是支持加密,start是创建后马上连接。
※ 注意:pptpsetup脚本会自动检查核心和PPP是否支持MPPE加密,若不支持会报错。
相关问题,请查看:[原]Linux 下部署PPTP VPN -- 服务端一文的描述,以及[原]解决PPTP中Module ppp_mppe not found的问题 一文的解决办法。
如果您创建的PPTP服务器不支持MPPE加密,不要使用encrypt选项,否则,启动连接时也会报错:
三、配置文件
pptpsetup是一个脚本,提供了方便的配置方式。若要手动修改相关的信息,可修改下面的文件。
连接配置:
用户名和密码:
四、连接VPN
启动连接:
状态:
日志:
五、配置路由表
连接成功后,通过route命令可查看路由表信息:
可见,只添加了一条访问192.168.0.1 IP的路由信息。
1.访问特定网段
假设你想让登陆VPN服务器的客户端互相访问,那么,你需要在客户端上加入192.168.0.0网段,即:
这里,192.168.0.201是另一台客户端,同样,若希望访问网段也需要加入类似的路由信息。
2.全部流量都通过VPN
如果您想连接VPN后,全部流量都通过VPN出去(翻墙),就像Windows 那样。那么按上面的步骤可能会遇到一些问题。因为,Linux的默认网关只能是一个,所以,这需要分两种情况。
a)没有默认网关
这时,你只需设置一个默认路由即可,例如:
b)已有默认网关
但更多情况下,默认网关都是存在的。例如,在这里的局域网内部已经设置了默认网关为192.168.228.153,例如:
若像上面那样添加一条路由是不行的,需要先让访问VPN服务端的流量可通过,然后才能转发其他的数据包。
更新后的路由表:
访问路径:
当然,关闭连接时,也是需要恢复默认网关的:
六、附录
1.正确关闭连接
※ 注意:启动连接很简单,但停止不能使用ifconfig pp0 down,否则只是禁用了ppp0网卡,后台连接还是存在的。当然,可以杀进程来断开连接。不过,ppp工具包提供了更好用的脚本。但需要您进行一些额外的工作:
然后使用下面的命令启动和关闭连接即可:
2.图形配置
图形我就不细说了,服务器版本没带配置工具,桌面环境配置很简单,可参考:
linux通过pptpconfig连接vpn服务器(CentOS)
在 Linux 2.6+ 作業系統中設定直通車連線(Ubuntu)
一、客户端环境
与Windows不同,Linux客户端连接成功后,不会使用远端的网关,需要手动进行路由表的配置工作。
为方便后续的说明,特把客户端的信息描述一下:
引用
操作系统:红旗 Asianux SP3 3.0
IP:192.168.228.135
默认网关:192.18.228.153
IP:192.168.228.135
默认网关:192.18.228.153
连接前的路由表信息为:
引用
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.228.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.228.153 0.0.0.0 UG 0 0 0 eth0
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.228.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.228.153 0.0.0.0 UG 0 0 0 eth0
二、下载及安装客户端
大多Linux发行版都没带PPTP客户端,或只提供图形界面的配置工具。所以,第一步要做的,就是下载软件包。
官网:http://pptpclient.sourceforge.net/
本地下载(含rpm包):
下载文件
执行:
# tar xzvf pptp-1.7.2.tar.gz
# cd pptp-1.7.2
# make
# make install
# cd pptp-1.7.2
# make
# make install
(rpm包安装更简单,直接rpm -ivh即可)
配置:
# pptpsetup --create vpn --server 124.248.205.115 --username linuxfly.org --password redflag --encrypt --start
这命令的意思的,以用户名linuxfly.org、密码redflag,创建一个叫vpn的连接。encrypt是支持加密,start是创建后马上连接。
※ 注意:pptpsetup脚本会自动检查核心和PPP是否支持MPPE加密,若不支持会报错。
引用
FATAL: Module ppp_mppe not found.
/usr/sbin/pptpsetup: couldn't find MPPE support in kernel.
或
/usr/sbin/pptpsetup: couldn't find MPPE support in pppd.
/usr/sbin/pptpsetup: couldn't find MPPE support in kernel.
或
/usr/sbin/pptpsetup: couldn't find MPPE support in pppd.
相关问题,请查看:[原]Linux 下部署PPTP VPN -- 服务端一文的描述,以及[原]解决PPTP中Module ppp_mppe not found的问题 一文的解决办法。
如果您创建的PPTP服务器不支持MPPE加密,不要使用encrypt选项,否则,启动连接时也会报错:
引用
MPPE required but peer negotiation failed
三、配置文件
pptpsetup是一个脚本,提供了方便的配置方式。若要手动修改相关的信息,可修改下面的文件。
连接配置:
引用
# cat /etc/ppp/peers/vpn
# written by pptpsetup
pty "pptp 124.248.205.115 --nolaunchpppd"
lock
noauth
nobsdcomp
nodeflate
name linuxfly.org #登陆用户名
remotename vpn #VPN连接名称
ipparam vpn
require-mppe-128 #是否使用MPPE加密
# written by pptpsetup
pty "pptp 124.248.205.115 --nolaunchpppd"
lock
noauth
nobsdcomp
nodeflate
name linuxfly.org #登陆用户名
remotename vpn #VPN连接名称
ipparam vpn
require-mppe-128 #是否使用MPPE加密
用户名和密码:
引用
# cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
# added by pptpsetup for vpn
linuxfly.org vpn "redflag" *
# Secrets for authentication using CHAP
# client server secret IP addresses
# added by pptpsetup for vpn
linuxfly.org vpn "redflag" *
四、连接VPN
启动连接:
# /usr/sbin/pppd call vpn
状态:
引用
# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.0.200 P-t-P:192.168.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:60 (60.0 b) TX bytes:66 (66.0 b)
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.0.200 P-t-P:192.168.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:60 (60.0 b) TX bytes:66 (66.0 b)
日志:
引用
Jun 11 12:03:56 qktest pppd[9647]: pppd 2.4.4 started by root, uid 0
Jun 11 12:03:57 qktest pppd[9647]: Using interface ppp0
Jun 11 12:03:57 qktest pppd[9647]: Connect: ppp0 <--> /dev/pts/2
Jun 11 12:03:57 qktest pptp[9648]: anon log[main:pptp.c:314]: The synchronous pptp option is NOT activated
Jun 11 12:03:57 qktest pptp[9654]: anon log[ctrlp_rep:pptp_ctrl.c:251]: Sent control packet type is 1 'Start-Control-Connection-Request'
Jun 11 12:03:57 qktest pptp[9654]: anon log[ctrlp_disp:pptp_ctrl.c:739]: Received Start Control Connection Reply
Jun 11 12:03:57 qktest pptp[9654]: anon log[ctrlp_disp:pptp_ctrl.c:773]: Client connection established.
Jun 11 12:03:58 qktest pptp[9654]: anon log[ctrlp_rep:pptp_ctrl.c:251]: Sent control packet type is 7 'Outgoing-Call-Request'
Jun 11 12:03:58 qktest pptp[9654]: anon log[ctrlp_disp:pptp_ctrl.c:858]: Received Outgoing Call Reply.
Jun 11 12:03:58 qktest pptp[9654]: anon log[ctrlp_disp:pptp_ctrl.c:897]: Outgoing call established (call ID 0, peer's call ID 384).
Jun 11 12:04:01 qktest pppd[9647]: CHAP authentication succeeded
Jun 11 12:04:01 qktest pppd[9647]: local IP address 192.168.0.200
Jun 11 12:04:01 qktest pppd[9647]: remote IP address 192.168.0.1
Jun 11 12:03:57 qktest pppd[9647]: Using interface ppp0
Jun 11 12:03:57 qktest pppd[9647]: Connect: ppp0 <--> /dev/pts/2
Jun 11 12:03:57 qktest pptp[9648]: anon log[main:pptp.c:314]: The synchronous pptp option is NOT activated
Jun 11 12:03:57 qktest pptp[9654]: anon log[ctrlp_rep:pptp_ctrl.c:251]: Sent control packet type is 1 'Start-Control-Connection-Request'
Jun 11 12:03:57 qktest pptp[9654]: anon log[ctrlp_disp:pptp_ctrl.c:739]: Received Start Control Connection Reply
Jun 11 12:03:57 qktest pptp[9654]: anon log[ctrlp_disp:pptp_ctrl.c:773]: Client connection established.
Jun 11 12:03:58 qktest pptp[9654]: anon log[ctrlp_rep:pptp_ctrl.c:251]: Sent control packet type is 7 'Outgoing-Call-Request'
Jun 11 12:03:58 qktest pptp[9654]: anon log[ctrlp_disp:pptp_ctrl.c:858]: Received Outgoing Call Reply.
Jun 11 12:03:58 qktest pptp[9654]: anon log[ctrlp_disp:pptp_ctrl.c:897]: Outgoing call established (call ID 0, peer's call ID 384).
Jun 11 12:04:01 qktest pppd[9647]: CHAP authentication succeeded
Jun 11 12:04:01 qktest pppd[9647]: local IP address 192.168.0.200
Jun 11 12:04:01 qktest pppd[9647]: remote IP address 192.168.0.1
五、配置路由表
连接成功后,通过route命令可查看路由表信息:
引用
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
192.168.228.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.228.153 0.0.0.0 UG 0 0 0 eth0
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
192.168.228.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.228.153 0.0.0.0 UG 0 0 0 eth0
可见,只添加了一条访问192.168.0.1 IP的路由信息。
1.访问特定网段
假设你想让登陆VPN服务器的客户端互相访问,那么,你需要在客户端上加入192.168.0.0网段,即:
引用
# route add -net 192.168.0.0 netmask 255.255.255.0 dev ppp0
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.1 * 255.255.255.255 UH 0 0 0 ppp0
192.168.228.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 * 255.255.255.0 U 0 0 0 ppp0
default 192.168.228.153 0.0.0.0 UG 0 0 0 eth0
# ping 192.168.0.201 -c 3
PING 192.168.0.201 (192.168.0.201) 56(84) bytes of data.
64 bytes from 192.168.0.201: icmp_seq=1 ttl=127 time=90.1 ms
64 bytes from 192.168.0.201: icmp_seq=2 ttl=127 time=57.2 ms
64 bytes from 192.168.0.201: icmp_seq=3 ttl=127 time=61.9 ms
--- 192.168.0.201 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 57.299/69.794/90.144/14.515 ms
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.1 * 255.255.255.255 UH 0 0 0 ppp0
192.168.228.0 * 255.255.255.0 U 0 0 0 eth0
192.168.0.0 * 255.255.255.0 U 0 0 0 ppp0
default 192.168.228.153 0.0.0.0 UG 0 0 0 eth0
# ping 192.168.0.201 -c 3
PING 192.168.0.201 (192.168.0.201) 56(84) bytes of data.
64 bytes from 192.168.0.201: icmp_seq=1 ttl=127 time=90.1 ms
64 bytes from 192.168.0.201: icmp_seq=2 ttl=127 time=57.2 ms
64 bytes from 192.168.0.201: icmp_seq=3 ttl=127 time=61.9 ms
--- 192.168.0.201 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 57.299/69.794/90.144/14.515 ms
这里,192.168.0.201是另一台客户端,同样,若希望访问网段也需要加入类似的路由信息。
2.全部流量都通过VPN
如果您想连接VPN后,全部流量都通过VPN出去(翻墙),就像Windows 那样。那么按上面的步骤可能会遇到一些问题。因为,Linux的默认网关只能是一个,所以,这需要分两种情况。
a)没有默认网关
这时,你只需设置一个默认路由即可,例如:
# route add -net 0.0.0.0 dev ppp0
b)已有默认网关
但更多情况下,默认网关都是存在的。例如,在这里的局域网内部已经设置了默认网关为192.168.228.153,例如:
引用
# tracert www.163.com
traceroute to www.163.com (183.60.136.70), 30 hops max, 40 byte packets
1 192.168.228.153 (192.168.228.153) 0.634 ms 0.879 ms 0.879 ms
2 1.64.63.58.broad.gz.gd.dynamic.163data.com.cn (58.63.64.1) 16.410 ms 16.660 ms 17.150 ms
traceroute to www.163.com (183.60.136.70), 30 hops max, 40 byte packets
1 192.168.228.153 (192.168.228.153) 0.634 ms 0.879 ms 0.879 ms
2 1.64.63.58.broad.gz.gd.dynamic.163data.com.cn (58.63.64.1) 16.410 ms 16.660 ms 17.150 ms
若像上面那样添加一条路由是不行的,需要先让访问VPN服务端的流量可通过,然后才能转发其他的数据包。
# ip route replace 124.248.205.115 via 192.168.228.153 dev eth0 src 192.168.228.135
# ip route replace default dev ppp0
# ip route replace default dev ppp0
更新后的路由表:
引用
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
124.248.205.115 192.168.228.153 255.255.255.255 UGH 0 0 0 eth0
192.168.228.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
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
124.248.205.115 192.168.228.153 255.255.255.255 UGH 0 0 0 eth0
192.168.228.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
访问路径:
引用
# tracert www.163.com
traceroute to www.163.com (183.60.136.70), 30 hops max, 40 byte packets
1 192.168.0.1 (192.168.0.1) 33.461 ms 33.665 ms 33.872 ms
2 switch1.hongkong.exchange.gigelayer.com (124.248.205.188) 35.284 ms 35.558 ms 35.799 ms
3 in.core-rt-003.gi.gi0.3.sunnyvision.com (123.242.225.1) 36.502 ms 36.747 ms 40.479 ms
traceroute to www.163.com (183.60.136.70), 30 hops max, 40 byte packets
1 192.168.0.1 (192.168.0.1) 33.461 ms 33.665 ms 33.872 ms
2 switch1.hongkong.exchange.gigelayer.com (124.248.205.188) 35.284 ms 35.558 ms 35.799 ms
3 in.core-rt-003.gi.gi0.3.sunnyvision.com (123.242.225.1) 36.502 ms 36.747 ms 40.479 ms
当然,关闭连接时,也是需要恢复默认网关的:
# ip route del 124.248.205.115 via 192.168.228.153 dev eth0 src 192.168.228.135
# ip route add default via 192.168.228.153
# ip route add default via 192.168.228.153
六、附录
1.正确关闭连接
※ 注意:启动连接很简单,但停止不能使用ifconfig pp0 down,否则只是禁用了ppp0网卡,后台连接还是存在的。当然,可以杀进程来断开连接。不过,ppp工具包提供了更好用的脚本。但需要您进行一些额外的工作:
# cp /usr/share/doc/ppp-2.4.4/scripts/pon /usr/sbin/
# cp /usr/share/doc/ppp-2.4.4/scripts/poff /usr/sbin/
# chmod +x /usr/sbin/pon
# chmod +x /usr/sbin/poff
# cp /usr/share/doc/ppp-2.4.4/scripts/poff /usr/sbin/
# chmod +x /usr/sbin/pon
# chmod +x /usr/sbin/poff
然后使用下面的命令启动和关闭连接即可:
# pon vpn
# poff vpn
# poff vpn
2.图形配置
图形我就不细说了,服务器版本没带配置工具,桌面环境配置很简单,可参考:
linux通过pptpconfig连接vpn服务器(CentOS)
在 Linux 2.6+ 作業系統中設定直通車連線(Ubuntu)
# ip route replace 124.248.205.115 via 192.168.228.153 dev eth0 src 192.168.228.135
# ip route replace default dev ppp0
http://www.vixual.net/blog/archives/32