用树莓派做VPN路由网关

2021-04-14 14:09:44 浏览数 (1)

目标是将树莓派做成VPN路由网关,即本身是一个VPN的Client(VPN的客户端),同时可以转发网络请求。这样只要连上家里的WIFI就可以无缝访问公司网络和其它网络。

实际情况我用的是PPTP协议,当然你可以用其它各种协议来实现。

啥是PPTP协议哦.

点对点隧道协议(PPTP)是建立在PPP(Point to Point)点对点协议上的VPN隧道技术。

PPTP 的工作模型:

PPTP client首先同PPTP server建立一条TCP连接, 然后在该TCP连接上实现PPTP链接控制,之后的链路控制协议和数据包都通过IP协议上的GRE承载,建立的TCP连接只用于PPTP链路控制。实际传输过程也是讲数据包以PPP协议格式封装, 然后在IP协议上传输PPP封装的数据。

PPTP的作用: 当远程用户要访问公司专用网时,可采用PPTP网络接入方式,用户先拨号到PPTP Server建立PPP连接,PPTP Client和Server之间建立TCP连接,然后通过PPTP协商建立一条用户到服务器的隧道,然后通过PPP协议的NCP协商,为用户分配一个网段内IP,用户可以使用分配到的IP进行局域网(实际上只是逻辑上的局域网, 有可能地理位置跨越很大)内的通信。从而为远程接入虚拟专用网提供一条在公共网络上创建安全连接的途径。

PPTP协议是点对点隧道协议,其将控制包与数据包分开,控制包采用TCP控制。PPTP使用TCP协议,适合在没有防火墙限制的网络中使用。

NAS:: Network Access Server, 网络访问服务器。 PAC: PPTP Access Concentrator, PPTP网络集中器。隶属于一个或多个PSTN或ISDN线路的能够允许你个PPP和处理PPP协议的设备。PAC仅需执行TCP/IP传输业务到一个或者多个PNS上,也能够为非IP协议开辟隧道。 PNS: PPTP Network Server,PPTP网络服务器

PPTP允许采用Client-Server模型分解现存的网络访问服务器(NAS)的功能。这里我们先看下传统的NAS有那些功能 1) 到PTSN、ISDN的固有物理接口和外部modem、终端适配器的控制 2) 作为PPP的LCP会话的终端 3) 参与PPP认证协议 4) 对PPP多链路协议进行通道汇聚和绑定管理 5) 作为各种PPP网络控制协议(NCP)的逻辑终端 6) NAS接口之间的多协议路由和桥 PPTP协议将以上NAS的功能分给了PAC和PNS。PAC负责1和2, 有可能还需要负责3;PNS负责4、5、6, 有可能还要负责3.

PPTP协议仅有PAC和PNS执行, 其他任何系统都无需知道PPTP。拨号网络可以在不知道PPTP的情况下连接到了一个PAC。

PPTP帧

PPTP报文分为两种 PPTP控制报文:用于创建、维护、终止PPTP连接 PPTP数据报文:用来传送PPP数据包,PPP数据包封装在GRE(通用路由封装)里进行传送

1 PPTP控制报文

前面我们提到要建立PPTP隧道需要先建立TCP连接,由此出现了下面PPTP报文的封包

2. PPTP数据报文

对于数据报文, PPTP Server和PPTP Client都使用到了两个IP地址。一个是公网IP地址,用于连接Internet;另一个是通过PPTP拨号分配的内网IP。(PPTP Server可能是手动配置的私网地址,PPTP Client的私网地址是从PPTPServer上获取到的)

PPTP协议概述

PPTP有两个并行的组成部分: 1. PPTP链路控制: 基于TCP的PAC-PNS对操作的控制连接 2. PPTP数据传输:一个在相同的PAC-PNS对之间的IP隧道操作。该操作用来传送封装好的PPP包的GRE(Generic Routing Encapsulation,即通用路由封装协议),为PAC-PNS对之间的用户提供服务。

链接控制

在PAC和PNS之间的PPP隧道建立之前, 它们之间必须建立控制连接。

控制层的主要功能包括: 1. 彼此交换基本信息; 2. 负责创建、维护、删除Session; 3. 负责创建、维护、删除Tunnel; 4. 更新通信参数;(Set-Link-Info) 5. 维护控制层自身的连接状态。(Echo-Request、Echo-Reply)

控制连接是标准的TCP会话, PPTP呼叫控制和管理信息就可以通过TCP传送。 控制层连接是基于TCP建立的,PPTP Server监听TCP1723端口,等待Client的连接请求。

其中需要注意的是控制层自身的状态维护。PPTP连接双方在一段时间内(60秒)如果没有收到任何控制层信息,就会发Echo-Request查询控制层连接状态,接收方会应答Echo-Reply。如果发送方在60秒内还没有收到应答就会断开控制层连接。 控制层本身不负责传输有效载荷。

PPTP链接的建立可以分为以下几个阶段: 1. TCP连接的建立阶段 2. PPTP控制层连接的建立阶段 3. PPP会话阶段(包括LCP协商、身份认证、NCP协商等) 4. PPTP隧道中数据包的交互(这是实际通信流量、通信的packages是经过GRE封装过的PPP包) 5. PPTP链接的维护 6. PPTP链接的终止 1-3阶段在报文中的表现如下图:

1. 建立TCP连接

  • a)Client端向PPTP Server的1723端口发TCP SYN包,请求建立TCP连接;
  • b)PPTP Server接受TCP连接请求,回SYN ACK;
  • c)PPTP Client 回复ACK报文,完成三次握手。(我看到一些文章上说PPTP协议建立TCP连接时,三次握手只执行了前面两次,第三次没有单独发送ACK报文,而是带着有效载荷,不晓得是否真的可能如此,但从我抓到的报文来看,三次握手是有完成的。 数据报如下图黑色的报文(报文序号39、40、41)。

PPTP ClientPPTP ClientPPTP ServerPPTP ServerTCP SYN (dst_port=1723)TCP ACK SYN (dst_port=1723)TCP ACK

2. 建立PPTP控制层连接

  • a)PPTP Client发送Start Control Connection Request. 控制链接发起请求,用于初始化PPTP Client 和Server之间的Tunnel,开始Tunnel的建立过程。
  • b)PPTP Server回Start Control Connection Reply。 控制链接响应,表示接受了对端的连接请求,Tunnel的建立过程可以继续。
  • c)PPTP Client发Outgoing Call Request; 创建隧道,选择一个用以从客户端到服务器发送数据的PPTP隧道进行标识作用的调用ID
  • d)PPTP Server回Outgoing Call Reply。 隧道创建成功应答。选择一个用以从服务器到客户端发送数据的PPTP隧道进行标识作用的调用ID
  • e) PPTP Client 发送一条Set-Link-Info 指定PPP协商选项。

到此为止,PPTP的控制层连接就已经建立起来了。

PPTP ClientPPTP ClientPPTP ServerPPTP ServerStart Control Connection RequestStart Control Connection ReplyOutgoing Call RequestOutgoing Call ReplySet-Link-Info

3. PPTP控制链接终止

1). PPTP Client发送一条Set-Link-Info,以指定PPP协商选项。 2). PPTP Client发送一条LCP Terminate-Request消息来终止PPP连接。 3). PPTP Server发送一条Set-Link-Info,以指定PPP协商选项。 4). PPTP Server发送LCP Terminate-Reply,从而终止PPP连接。 5). PPTP Client发送一条PPTP Clear-Call-Request,以请求呼叫终止。 6). PPTP Server发送一条PPTP Call-Disconnected-Notify,通知呼叫将要终止。 7). PPTP Client发送一条PPTP Stop-Control-Connection-Request终止连接。 8). PPTP Server发送一条PPTP Stop-Control-Connection-Reply进行响应。

PPTP ClientPPTP ClientPPTP ServerPPTP ServerSet-Link-InfoLCP Terminate-RequestSet-Link-InfoLCP Terminate-ReplyClear-Call-RequestCall-Disconnected-NotifyPPTP Stop-Control-Connection-RequestPPTP Stop-Control-Connection-Reply

至此TCP链接终止

数据传输( 隧道 Tunnel)

控制层是不提供有效载荷的, 应用层的数据是通过隧道进行传输的。 PPTP隧道建立后,就可以在客户机与服务器之间传送PPP数据包,PPP数据包是封装在GRE(通用路由封装)包中的,GRE包是在IP层上传送的。

**什么是隧道Tunnel:**RFC对Tunnel的定义是“A tunnel is defined by a PNS-PAC pair”, 即一个PNS-PAC对就是一个tunnel。

PPTP数据的传输 关键点其实就是 数据报文的封包与解包。我们先看下一个在PPTP中传输的数据报文

数据的发送——封包过程

在发送端,要把一个数据包发出去,需要首先把packet发到VPN的虚拟网卡,虚拟网卡把它变成GRE frame,然后发往IP层再次进行路由。数据包这次会被发往物理网络,并最终抵达PPTP Server端。

封包的关键在网络层和链路层。 1. **PPP帧的封装:**IP层从传输层接收到数据包后,传输给链路层的VPN虚拟网卡,添加PPP报头,封装成PPP帧。 2. GRE报文的封装:经过VPN网卡封装后的数据包重新交回网络层,由网络层的GRE协议添加GRE报头,形成GRE报文 3. IP再封装: GRE报文交给同属于网络层的IP协议,进行IP头在封装,二次添加IP首部,形成新的IP数据报 在经过二次IP封装的IP数据报就传给链路层的Ethernet处理程序进行正常传输,经网卡传输到因特网。

数据的接收——解包过程

在接收端,从物理网卡上收到frame之后交给IP层,IP对其解包之后转发给VPN虚拟网卡,虚拟网卡再解包把它变成普通IP packet再次发往IP层,这次IP层知道是VPN对端发来的数据,直接交给TCP/UDP并最终抵达应用层。 PPTP隧道 数据的接收过程与发送过程刚好相反。


以上是PPTP的解释,下面回归正题
组网

拓扑如下,也可以再买USB2RJ11和WIFI天线将树莓派变成一个完整的WIFI路由,我这个拓扑是考虑到TP-Link路由可以做备用的网关。


再插,什么是USB2RJ11:

USB接口

脚1:电源。USB设备供电端口( 5V)。

脚2:接入南桥,传输数据。

脚3:传输数据。但两个引脚各有不同,是传输信息的高地位不同。

脚4:接电源地线。构成电路。

USB线

红线:电源正极(接线上的标识为: 5V或VCC)

白线:负电压数据线(标识为:Data-或USB Port -)

绿线:正电压数据线(标识为:Data 或USB Port )

黑线:接地(标识为:GROUND或GND)

RJ11和RJ45

RJ11接口和RJ45接口很类似,但只有4根针脚(RJ45为8根)。在计算机系统中,RJ11主要用来联接modem调制解调器。

RJ释义,在通用综合布线标准里,没有单独提及‘RJ11’的论述,所有的连接器件必须是8针。因此RJ11和RJ45的协同工作和兼容性还没有成文。

RJ这个名称代表已注册的插孔(Registered Jack),是来源于贝尔系统的USOC (Universal Service Ordering Codes,通用服务分类代码) 代码。USOC 是一系列已注册的插孔及其接线方式,是由贝尔系统开发的,用于将用户的设备连接到公共网络。FCC 规定控制着这一目的的应用。FCC (联邦通信委员会)代表美国政府发布了一个文档规定了RJ11。

RJ11是用于西部电子公司(Western ElectricCo)开发的接插件的通用名称。其外形定义为6针的连接器件。原名为WExW, 这里的x表示‘活性’,触点或者打线针。例如, WE6W 有全部6个触点,编号1到6, WE4W 界面只使用4针最外面的两个触点(1和6) 不用,WE2W 只使用中间两针。对于RJ11,信息来源是矛盾的,它可以是2或者4芯的6针接插件。更加混淆的是,RJ11并不仅是用于代表6针接插件,它还指4针的版本。

RJ45 和RJ11区别。不同的标准,不同的尺寸 (RJ11有6P6C6P4C4P4C4P2C,其中C代表水晶头的金针数;RJ45有8P8C)

由于两者的尺寸不同(RJ11为4或6针,RJ45为8针连接器件),显然RJ45插头不能插入RJ11插孔。反过来却在物理上是可行的(RJ11插头比RJ45插孔小), 由此让人误以为两者应该或者能够协同工作。实际上不是这样。强烈建议不要将RJ11插头用于RJ45插孔。

因为RJ11不是国际标准化的,其尺寸,插入力度,插入角度等等没有统一依照国际标准接插件设计要求,因此不能确保能够具有互操作性。它们甚至引起两者的破坏。由于RJ11插头比RJ45插孔小,插头两边的塑料部分将会损坏插入的插孔的金属针。

Raspberry Pi安装基本环境
  • 先装Debian,安装方法可以参考这里。
  • 默认只有vi和nano,可以装个vim或emacs。
  • 装PPTP Client: sudo apt-get install pptp-linux
  • 为系统配置静态IP,实际情况里我使用192.168.1.69做网关静态IP.
配置PPTP连接
  • 配置以太网口可用时自动连接PPTP服务器:sudo vi /etc/network/if-up.d/vpn,键入以下内容(< >里的内容按实际情况填写) #! /bin/bash /usr/sbin/pptpsetup --create <名字(随便起)> --server <服务器地址> --username <用户名> --password <密码> --encrypt --start
  • 配置PPTP链接断开后自动重连,执行以下命令 sudo cp /etc/network/if-up.d/vpn /etc/ppp/if-down.d/vpn
  • 修改路由表,将PPTP服务器作为下一跳的网关,即默认使用PPTP连接发送所有流量(如果你有这个需求)。在PPTP连接成功后进行修改:sudo vi /etc/ppp/ip-up.d/vpn,键入以下内容 #! /bin/sh /sbin/route add default dev $PPP_IFACE
  • 由于家里使用的PPPoE上网,加上PPTP协议封装,链路实际可用的MTU减小。我的PPTP服务器使用的MTU是1300,当内网中其它终端以树莓派为网关时并不知道网关的下一跳链路的MTU小于1500,终端也不会在DHCP过程中主动配置MTU值,1500大小的包转发到PPTP链路中会被丢弃,造成无法上网的现象。解决方法是配置TCP MSS值,使系统遇到大于MSS值的包时先拆包再转发: sudo iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1268
配置网关相关功能
  • 修改/etc/sysctl.conf,使树莓派可以转发ipv4的流量 net.ipv4.ip_forward=1
  • 使sysctl.conf的修改马上生效 sudo sysctl -p
  • 配置iptables,使系统强制转发所有流量 sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
其它配置
  • 保存iptables的信息,用于之后快速恢复当前配置 sudo iptables-save > /etc/iptables.rules
  • 当以太网端口可用时,恢复iptables配置,sudo vi /etc/network/if-up.d/iptables,键入以下内容: #! /bin/sh iptables-restore < /etc/iptables.rules
  • 如果你使用了PPTP服务器作为网关转发所有流量,你很可能需要配置路由表,使某些ip是例外,不走PPTP链路的。这种脚本网上很多,一般分ip-pre-up和ip-down两个脚本分别用于添加、删除路由表记录。将ip-pre-up放到/etc/network/if-up.d/下;ip-down放到/etc/network/if-down.d/下
  • 确保上面的所有钩子脚本都有执行权限: sudo chmod x /etc/network/if-up.d/* /etc/network/if-down.d/* /etc/ppp/ip-up.d/* /etc/ppp/ip-down.d/*
配置DHCP
  • 配置DHCP服务器信息,网关填上树莓派的静态ip,我是在TP-Link上配置DHCP信息的
结束语

以上就是VPN路由的所有配置,现在你可以iPhone、iPad、 Android、电脑、PSVita、3DS、PS3、XBOX360等等连上你的TP-Link,即可无缝使用VPN链路,树莓派也会像一般的路由器一样稳定工作。

所有终端因为DHCP的配置将流量发向树莓派,树莓派按路由表的配置选择使用PPTP链路。

要配置的地方比较多,中间有一步出了问题都可能使树莓派无法稳定工作,需要你熟悉计算机网络,Linux网络配置。

代码语言:javascript复制
参考来源
https://blog.csdn.net/ever_peng/article/details/80221234
https://shumeipai.nxez.com/2013/10/26/raspberry-pi-make-a-vpn-gateway-router.html

关注,转发,嘻嘻

0 人点赞