关闭

OpenWrt搭建PPTP VPN服务器过程记录

标签: ubuntu路由器openwrtvpn
8985人阅读 评论(1) 收藏 举报

一个路由器的耗电要比一台电脑小的多,所以我经常把OpenWrt的路由器当成一台小的Linux嵌入式系统来用,最近在家里的路由器上搭建了一个PPTP服务器服务,这样我在外面可以轻松的连接到家里的路由器并控制家里的内网设备了。当然这个PPTP服务器的主要作用还是将多个SS节点进行负载均衡和高可用然后转换为VPN供外网使用,既方便了上网也没有被封IP的问题,下面简单介绍一下OpenWrt搭建PPTP服务的过程,本人确实感觉在OpenWrt搭建确实要比Ubuntu麻烦许多。

首先需要在路由器上安装pptpd服务,在OpenWrt官网就能下载到,但是安装这个ipk包需要两个依赖,mppe和gre,其中一个比较重要的依赖是Mppe的依赖,这个依赖的安装还需要依赖,而且依赖的依赖还需要依赖,大概能折腾4-5层的样子,安装了很多个ipk包才算把pptpd这个服务装上

装了下图的所有包


使用网件WNDR4300 CC 15.05.1的朋友可以到这里下载这些ipk :OpenWrt CC 15.05.1 WNDR4300 pptpd及其依赖包

装上pptpd以后就可以修改相应的配置文件了,基本套路和Ubuntu上的pptpd差不多,只不过暗藏了很多小坑

首先要修改总配置/etc/pptpd.conf文件,这里面主要修改的是服务端的虚拟IP地址和客户端的虚拟IP地址,注意这两个IP可以在同一个网段也可以在不同的网段,但是我极力推荐将他们放到同一个网段中,方便远程DNS解析,我的配置文件如下

#debug
option /etc/ppp/options.pptpd
speed 115200
stimeout 10
#localip & remoteip are not needed, ip management is done by pppd
ppp /usr/sbin/pppd
localip 192.168.0.1
remoteip 192.168.0.100-240
我配置的网段是192.168.0.x,如果这个与你网络环境冲突的话推荐你换个其他的网段

然后再修改用户名密码配置/etc/ppp/chap-secrets,这里有一个大坑,用户名吗密码中间的PROVIDER,在Ubuntu上填pptpd就好,但是在OpenWrt不能这样填了,因为这个项目要与/etc/ppp/pptpd-options中的name字段值一致才行,否则用户名密码不起作用

#USERNAME  PROVIDER  PASSWORD  IPADDRESS
alex       pptp-server  123456     *
alex1       pptp-server  123456     *
alex2       pptp-server  123456     *
alex3       pptp-server  123456     *
alex4       pptp-server  123456     *
alex5       pptp-server  123456     *
alex6       pptp-server  123456     *
alex7       pptp-server  123456     *
alex8       pptp-server  123456     *
alex9       pptp-server  123456     *
alex10       pptp-server  123456     *
下面就是配置最重要的一个文件/etc/ppp/pptpd-options,我的配置如下
#debug
#logfile /tmp/pptp-server.log
auth
name "pptp-server"
lcp-echo-failure 3
lcp-echo-interval 60
default-asyncmap
mtu 1482
mru 1482
nobsdcomp
nodeflate
#noproxyarp
#nomppc
mppe required,no40,no56,stateless
require-mschap-v2
refuse-chap
refuse-mschap
refuse-eap
refuse-pap
ms-dns 192.168.0.1
#plugin radius.so
#radius-config-file /etc/radius.conf
这里面的name字段的值就是chap-secrets中的PROVIDER,一定要保持一致,这个文件只需修改一处地方也是非常关键的一处地方,就是ms-dns字段。这个字段必须仔细填写,才能实现客户端远程解析DNS,也就是让客户端将DNS请求发送到VPN服务器,由服务器代理解析,否则配置不好的话客户端会自己向自己所在网络发送DNS请求,后果可想而知肯定被污染的很厉害。

举例说明:如果你ms-dns填写8.8.8.8或者114.114.114.114等公共DNS服务器,那么这样填的意义相当于一个家用路由器向接入的设备通告DNS服务器,客户端会根据通告的地址向8.8.8.8或者114发送DNS请求,此时路由器只是做一个转发的工作,不会代理客户端去请求。所以在VPN客户端上,如果你通告公共DNS,客户端发送的DNS请求不会经过VPN服务端,而是在客户端本地解决。我再Windows和Android设备上测试都是如此,也就是说通告公共DNS的话是无法做到VPN服务器远程解析的。

如果我VPN服务器所在内网有一台DNS服务器会怎么样呢?比如我的VPN服务器IP为192.168.1.81,而192.168.1.2是一台开放53端口的DNS服务器,那么我填写ms-dns 192.168.1.2行不行呢。我当时觉得也应该没什么问题,因为我客户端用浏览器访问192.168.1.2:80的时候可以打开192.168.1.2上的页面,说明我向192.168.1.2发送数据的话会发送到VPN服务端所在的内网。但事实结果却让人大跌眼镜,在一台外网Android设备上测试的时候发现,DNS请求超时了,然后自动向Android非VPN的通告DNS服务器发送请求,导致Android手机IP虽然是VPN的IP,但是上网速度异常缓慢,windows直接打不开网页。于是问题就在这,像Android这样的设备如果你通告一个内网的DNS服务器IP给它,Android手机会向手机所在的内网发送DNS请求,也就是DNS请求不发送到VPN服务器上去。而TCP的请求会发送到VPN上去,这就导致了虽然192.168.1.2上的80端口能访问通,但是DNS却超时的原因。

那么既不能通告公网地址,又不能通告内网地址,该怎么办才能实现DNS的远程解析呢。答案就是我前面提到的将VPN服务器的虚拟ip地址和客户端的虚拟ip地址放在同一个网段上,比如VPN服务端的ip为192.168.0.1,客户端ip为192.168.0.2-254,然后ms-dns填写192.168.0.1。如此一来,客户端终于可以把DNS请求发送到VPN服务端了,Android和Windows上测试均可用。然后我用pdnsd在服务端监听192.168.0.1:53端口,注意这里必须绑定192.168.0.1,然后客户端就可以收到服务端上由pdnsd解析的防污染DNS结果了。

部署pdnsd还有两个大坑,第一是pdnsd在配置文件里写绑定192.168.0.1然后在启动的时候启动失败,说不能绑定这个端口。然后用ifconfig检查一下发现没有任何一块网卡的地址是192.168.0.1,因为这个时候一个客户端还没接入呢,所以没有ppp0,1,2...等等虚拟网卡,也就不能监听192.168.0.1网段,这个时候必须有一台设备接入VPN制造一个ppp0网卡才行,接入几个客户端就会产生几块虚拟网卡,当然我们有一个客户端就够了,否则是无法开启一个监听192.168.0.1的服务程序的。



第二个大坑是dnsmasq,默认状态下dnsmasq监听的是0.0.0.0:53,理论上应该包含192.168.0.1网段,但实际上使用nslookup www.baidu.com 192.168.0.1会告诉你无法连接DNS服务器,也就是说dnsmasq压根就不监听192.168.0.1:53的请求,所以后来我才单独使用pdnsd的。而且dnsmasq不接受192.168.0.1:53的请求也就算了,它却还占着192.168.0.1:53这个端口,导致pdnsd无法启动,典型的占着茅坑不拉粑粑的行为。在Ubuntu上可以通过/etc/dnsmasq.conf指定dnsmasq的监听地址为其他地址,而在OpenWrt上同样的语句居然不管用。最后没办法只能kill掉dnsmasq服务让pdnsd上位。但是这样一来有非常大的缺陷就是dnsmasq管理的DHCP服务瘫痪了,导致路由器不能再做DHCP的IP分配了,别的设备也连不上路由器了。只能通过设置固定IP地址连接路由器。如果不想连不上路由器可以修改/etc/dnsmasq.conf将端口指定到5353或者别端口上再使用/etc/init.d/dnsmasq start 才恢复DHCP服务,而且路由器此时还没法解析DNS了,需要修改/etc/resolv.conf文件为公共的DNS而非127.0.0.1真是麻烦呀。

如果你最终开启了pdnsd在192.168.0.1:53,那么远程windows和Android设备就可以通过VPN服务端的代理来解析IP地址了,有效防止了DNS污染。


下面是windows客户端的截图,注意这里通告的DNS要是VPN服务端的地址


然后我想启动pptpd服务,发现又来一个坑,/etc/init.d/pptpd start 根本不管用,真是无奈,只能手动启动了,好在手动启动也一样能跑,命令如下

/usr/sbin/pptpd -c /etc/pptpd.conf

然后由于我们PPTP客户端的网段和上级路由器的网段不同,所以需要做NAT,这是搭建所有形式的VPN服务端都必不可少的一步,方法如下

iptables -t nat -I POSTROUTING -s 192.168.0.1/24 -o eth0 -j MASQUERADE

其中eth0是你可以连接外网网卡的名字。


然后通过netstat -nlp就能看见1723的tcp端口在监听了。不过你以为这样一个pptpd服务就搭建完成了么,当然在Ubuntu上确实是这样,而在OpenWrt上现在PPTP连接成功了但是没法上网,还需要做一个端口映射,也就是解除防火墙对请求OpenWrt的拦截(OpenWrt默认的防火墙比Ubuntu的防火墙严格的多),如下特别要注意黄线标注的地方,特别是Masquerading的那个勾一定要勾上,不然虽然咱们在上面做了NAT但是仍然不能访问公网(访问路由器是可以的)。如果你没有luci界面或者外网还是不能访问1723接口,可以去看看我之前写的一篇博客《Openwrt 端口映射的常见问题》。


到这里终于大功告成了,可以在外网的其他客户端上连接这个PPTP VPN访问内网了,如果你想知道如何将SS转为VPN使用实现科学上网的效果,可以去找找我之前写的博客《Socks5代理(SS/SSH)转国内PPTP VPN的方法》。

最后还发现很坑的一点,我使用花生壳绑在路由器上,虽然有公网地址,但是花生壳不是很稳定,经常与花生壳失联导致域名被解析到别的地方去,让这个VPN变得不稳。还有更坑的一点是作为一个家用的公网IP地址,运营商封了80,8080等端口,造成了很大的不方便。

你以为这些大坑到这里就结束了?我还发现更坑的是如果你的IP是电信的,那么移动就访问不了,联通和长城还可以,如果你的IP是移动的,那么电信联通都访问不了,只有移动自己可以访问,我在电信的网络想要访问两公里之外家里的路由器还需要挂国外的代理绕一圈才能访问的到,直连只有22端口能通,真实无语了。

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:431444次
    • 积分:5039
    • 等级:
    • 排名:第6160名
    • 原创:143篇
    • 转载:0篇
    • 译文:1篇
    • 评论:188条
    最新评论