pptpd搭建虚拟个人网

2,006 阅读6分钟

最近需要让移动的小车进行通信,小车采用USB转4G模块和外部进行通信,相当于车体携带一个移动的热点。我需要让这些小车之间可以相互通信以实现多车协同的目的,每个小车携带一个移动热点也就是一个局域网,其实也就是实现不同局域网内的主机相互通信。这样搭建一个虚拟个人网就可以实现我们的需求。网络拓扑图如下:

本文章采用pptpd进行搭建虚拟个人网

硬件配置

  • 阿里云vps
  • 操作系统:ubuntu18.04

服务端详细步骤

接下来的操作都是在服务器端,也就是阿里云vps上操作的,远程连接是root用户所以每条指令之前我都没有输入sudo

1. 卸载pptpd和iptables

apt-get autoremove pptpd
apt-get purge pptpd
apt-get autoremove iptables*
apt-get purge iptables*

2. 验证内核是否加载了MPPE模块

内核的MPPE模块用于支持Microsoft Point-to-Point Encryption。Windows自带的VPN客户端就是使用这种加密方式,主流的Linux Desktop也都有MPPE支持。其实到了我们这个内核版本,默认就已经加载了MPPE,只需要使用下面命令验证一下,显示MPPE is ok即可:

modprobe ppp-compress-18 && echo MPPE is ok

3. 安装pptpd和iptables

我们搭建的虚拟个人网是基于pptpd的,所以需要安装这个服务;iptables是常用的防火墙软件,一会用它来设置路由转发规则。

apt-get install -y pptpd iptables

4. 配置pptpd

修改这个配置是搭建虚拟个人网的关键,服务搭建的成功与否和这个配置有很大的关系,接下来我会详细详讲解配置的修改。

4.1 修改dns设置

vim /etc/ppp/pptpd-options

找到ms-dns,去掉它前面的注释,修改这一行的ip。设置dns,国外可以设置谷歌的dns:8.8.8.8;国内的可以设置阿里云的dns:223.5.5.5 该文件去掉注释后内容如下:

name pptpd ## 服务名,可以修改成你喜欢的名字,但是没啥事就别改了。
refuse-pap # refuse或者require开头的都是加密方式,默认就行了
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 223.5.5.5 #阿里云,这个文件中只有ms-dns需要修改,改成相应的dns服务器 
ms-dns 223.6.6.6
ms-dns 202.96.209.133 #上海浦东
ms-dns 114.114.114.114 #中国电信
proxyarp
nodefaultroute
lock
nobsdcomp
novj
novjccomp
nologfd

4.2 编辑pptpd.conf文件,设置localip和remoteip

vim /etc/pptpd.conf

取消localip 192.168.0.1remoteip 192.168.0.234-238,192.168.0.245这两行的注释。

  • localip表示给服务器分配的ip地址,这是一个内网ip我们搭建的虚拟个人网络就是一个局域网所以分配的是内网ip,当然也可以修改成别的。
  • remoteip分配给那些连接服务器的客户端的ip地址,要和服务器的ip(192.168.0.1)处于同一个网段。
  • 这个网络不要和客户端自身的ip网段发生冲突;比如我的客户端自身网段是192.168.50.x/24,我搭建的局域网分配的网段就是配置文件中默认的192.168.0.x/24网段;他们没有冲突。
  • 192.168.0.234-238,192.168.0.245表示可分配给客户端的ip是192.168.0.234~192.168.0.238和192.168.0.245;如果需要接入的设备过多,可以适当调整范围。

这个文件去掉注释后的内容如下:

option /etc/ppp/pptpd-options   # 4.1中修改就是这个文件,这里读取4.1修改的文件的配置
logwtmp                         # 表示使用WTMP日志
localip 192.168.0.1             # pptpd服务启动后,云服务器会给自己分配一个IP就是这个
remoteip 192.168.0.234-238,192.168.0.245 # 给那些连接到服务器的客户机分配的ip地址范围

4.3 设置pptpd账号和密码

vim /etc/ppp/chap-secrets

在这个文件加入一行内容,分别是用户名服务名,密码,可以连接的ip范围

zzy pptpd 123456 *

我在文件中填入的内容如上,用户名:zzy,服务名:pptpd,这个服务名就和4.1中/etc/ppp/pptpd-options的name后面的值一样;密码:123456;*表示接受任意范围的ip来连接。它们之间用空格隔开 看一下该文件中内容:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
zzy pptpd 123456 *

5. 开启内核ip转发

vim /etc/sysctl.conf

net.ipv4.ip_forward=1这一行前面的#去掉。然后执行以下命令即可立即生效。

sysctl -p

我的服务器中/etc/sysctl.conf内容如下:

vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time = 120

# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.ip_forward=1
# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 =1

kernel.sysrq = 1
#net.ipv4.ip_forward = 1

6. 设置数据转发规则

6.1 iptables建立NAT

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

这里面的ip地址要和4.2 /etc/pptpd.conf设置的相符合;网卡etho要和服务器的一样,通过ifconfig查看

6.2 iptables设置MTU,防止包过大

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

同样这个ip设置和6.1中的相同,包大小设置为1200。

7. 启动服务端

/etc/init.d/pptpd restart

如下图说明服务启动成功.

详细查看查看一个服务的运行状态。可以看到服务正在处于监听状态,默认监听1723端口,所以防火墙的tcp1723端口要打开,我这里用的是阿里云的服务器,可以直接在网页端操作服务器的防火墙,将这个端口打开即可。

netstat -anpt | grep :1723

客户端详细步骤

现在服务端已经配置完成,并且服务已经开启了。接下来需要配置客户端来连接服务端这样一个虚拟内网就完成了。

ubuntu桌面版

系统设置 ==》 网络 ==》左下角的加号 ==》接口选择VPN,点击创建 ==》

点到点隧道协议(PPTP) ==》 新建 ==》

  • 连接名称:随意起一个
  • 网关:服务器的公网ip,我这里是101.200.127.148
  • 用户名:在4.3 /etc/ppp/chap-secrets中设置的,这里设置的是zzy
  • 密码:也是在4.3 /etc/ppp/chap-secrets中设置的,这里设置的是123456;注意密码这一栏先点击那个问号,然后选择Store the password only for this user或者Store the password for all users都可以,我这里选择当前用户。

==> 高级 ==》 身份认证选中MSCHAPMSCHAPv2;同时选中使用点到点加密(MPPE)(P)(这个很关键,否则客户端可能连接失败)。

保存以后连接VPN即可。使用ifconfig查看ip,含有ppp0且ip也在我们为其分配的区间内,说明已经连接成功了。

win10版

windows连接就十分简单了。
打开网络和internet设置 ==》 VPN ==》 添加VPN连接,设置如下:

保存然后连接即可。使用ipconfig查看windows下的ip地址,vpn连接就是ppp网卡,下图表示客户端已经连接成功了。

测试

按照上面的操作分别连接了一台windows的pc和一台ubuntu的pc到服务器,我们使用netstat -anpt | grep :1723查看服务器显示有几台设备连接。如下图显示有两台设备连接上,和我们的预期相同。

其中ubuntu的pc机ip是192.168.0.234;win10的pc机的ip是192.168.0.235;见上图,且他们之间可以相互ping通,不同局域网之间的pc机通信完成。(ping操作的图就不贴了,我已经测试过了可以通信)

主要参考