开云 开云体育平台开云 开云体育平台开云 开云体育平台A组织提供网络接入服务,但是要收费,速度还很慢,而同时内网中有一台能够不付费就连接的服务器,并且该服务器可以自由访问外网,于是当我们有这台服务器的权限的时候,就可以通过这样的架构来访问外网:
另一方面,手机电脑等均有移动需求,并会不定期关机/睡眠,不可能长期保持与服务器的连接,所以连接的 endpoint 选在了路由器。而路由器上仅支持 PPTP/L2TP(由于懒惰不想刷openwrt),其中 L2TP 又比 PPTP 慢,因此最终决定的技术方案是在路由器和服务器之间建立 PPTP 连接。
eth0 接入的是交换机-服务器的链路,路由器访问服务器走的也是这条路。eth1 接入的是服务器-外网的链路,因此我们要做的是从 eth0 接受 pptp 连接,然后转发到 eth1。
根据这篇回答,我们先ssh进入服务器,sudo -i 切换到 root,然后:
注:本条以及下文中所有指令执行出错/失败时,先不要急着问问题,先检查一下自己是不是在 root 下执行的,大部分在非 root 用户下执行都会失败,需要 sudo -i 切换到 root 才行。
因为 pptp 本质上是一种 vpn 协议,也就是说他会假装所有连接的客户端在某一个内部网络下,只是这个功能往往被用作隧道连接罢了,但是实质上 vpn 和 proxy/tunnel 是不一样的。这个在此不过多展开。
总之就是,pptp服务端此时就像一台路由器,这里配置中的 192.168.0.1 就像路由器的 ip(或者说网关 ip ,虽然这两者实际上可能不同),192.168.0.234-238,192.168.0.245 就像路由器的dhcp服务器使用的ip池。(这是安装好之后直接取消注释的,读者可以根据自身情况自行调整)
另外要注意到的是,因为之后会需要配置ip转发表来进行转发,所以这里配置的网段(192.168.0.0/24)不能和 eth0、eth1 的网段冲突,不然的话转发可能会出错。
第三步则是要配置用户的认证。pptp由于出现的很早,对安全这一块并没有考虑的很周到,密码文件都是直接明文存储的,好处就是我们配置起来也相当方便。执行:
保存好之后还需要运行 sysctl -p 来使修改生效(当然重启一下服务器也行)。
这只是启用了转发,还没有配置 ip 转发表。这里有一个坑就是我服务器上的 ubuntu 出厂不自带 iptables 命令,导致之前配置之后都没有起作用,又不知道哪里出错,折腾了很久。因此读者最好在配置之前自己测试一下有没有 iptables 命令,没有的话用 apt install iptables 安装即可。
在配置转发表的过程中,教程选用了先在命令行中配置,然后用 iptables-persistant 包来使得设置在重启之后仍然保留。我这里则提供另一种方案:
mknod这行是在安装pptpd的时候就自动加上去的,不需要手动添加,重点在后面这行。
-s 的意思是 source,即转发的源来自的地址。由于我们的服务器上还有一个 eth0 网口,而我们不希望把从那里来的包也都转发到 eth1 上了,所以我们需要指定 -s 为 192.168.0.0/24。
-o 的意思是 output,即转发的目标网口,之前也说过服务器上通向公网的口是 eth1 而不是 eth0,所以这里也要相应的做出更改。
最后,配置路由器连接服务器,不需要特殊的配置,根据自己的路由器gui直接添加并连接即可,这里就不放图了。
当路由器成功连接到服务器上时,可以看到 ifconfig 中有一个新的 ppp0:开云 开云体育官网开云 开云体育官网开云 开云体育官网