使用Openvpn组建服务器内网

(前排提醒,除非你有机器使用的是LXC/OpenVZ虚拟化,否则在 2022 年多数主机商的服务器已经使用KVM全虚拟化的情况下,你应该更偏向于考虑使用Wireguard/ZeroTier等类似方案代替OpenVPN来帮你完成这件事情。)

Updated @ Feb 15,2016 为Ubuntu准备了一键脚本来配置服务器/生成客户端配置文件,请戳这里

今年年初的时候显得极其特别以及非常无聊,剁了几个便宜货VPS,包括一个年付1.99刀独立IP的,还有四个NAT VPS(也就是和别人共享公网IP,自己只能用指定的20个端口的MINI VPS,但是带有至少/112 的IPV6地址)。比较蛋疼的是这几个NAT VPS给的端口都太高了,全部是10000+的端口,而且有两台NAT VPS是没有反向代理功能的(反向代理是服务商提供的功能,在设置好绑定的域名之后会把共享公网IP的80端口对应的请求转发到你服务器的80端口),部署其他的业务访问起来也很麻烦。鉴于那个1.99刀的服务器只有64M内存,也不太可能跑大一点的东西,所以就考虑把这些服务器干脆全部拉成一个内网,然后拿这64M的VPS作为反向代理提供服务。

拉内网和搭VPN差不多是一个意思,所以一开始计划在64M服务器搭PPTP Server,然后NAT VPS作为PPTP Client连过去,然而配置第一台服务器就出了麻烦,pptpsetup提示内核不支持mppe-128,然而OpenVZ虚拟化的VPS并不支持自己修改内核,所以意思就是PPTP在这里行不通没法玩。

那么L2TP Over IPSec ? 64M的VPS本身也是OpenVZ虚拟化,而且内核开启IPSec支持的商家寥寥无几,我试着用Softether的L2TP功能,但是连上去以后是做不到内网互通的(至少客户端和服务端是不行的,你在ifconfig连内网的IP都看不到),所以也只能作罢

所以最后选择用OpenVPN来配置内网环境,基于tun设备+证书认证,加上OpenVPN本身会在断线后自动尝试重连,因此可以避免一些麻烦。

先按照 Digital Ocean提供的服务端配置方法,在64M服务器上配置好服务端。

由于我们这次配置只是考虑内网互通,而不是作为VPN访问网外资源,因此UFW和NAT转发配置部分不是必须的,可以直接忽略。push route部分也是不必要做的,NAT VPS本身并不需要走64M的VPS才能访问互联网,不然的话内网连上来以后所有的流量全部走64M的VPS了,这对访问速度有一定的影响。

然后,生成CA和客户端证书,(比如生成client1.crt和client1.key)。将证书的文本inline到client的配置文件中,我这里使用的配置文件是直接从Softether生成的配置文件修改而来的,内容如下。


dev tun
proto udp
remote 服务器地址 端口
cipher AES-128-CBC
auth SHA1
resolv-retry infinite
nobind
persist-key
persist-tun
client
verb 3
#auth-user-pass pass.txt
comp-lzo

<ca>

—–BEGIN CERTIFICATE—–
<CA证书的公钥内容,也就是ca.crt>
—–END CERTIFICATE—–
</ca>

<cert>
—–BEGIN CERTIFICATE—–
<客户端证书的公钥内容,也就是client.crt>
—–END CERTIFICATE—–
</cert>

<key>
—–BEGIN PRIVATE KEY—–

《客户端证书的私钥内容,也就是client.key》

—–END PRIVATE KEY—–
</key>

把文件保存为 config.ovpn,丢到客户端,并在客户端运行  openvpn –config config.ovpn,正确配置的情况下,半分钟后客户端运行ifconfig应该能看到一个带有内网IP的tun设备,这表示已经连接成功。

tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:192.168.44.18 P-t-P:192.168.44.17 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:59 errors:0 dropped:0 overruns:0 frame:0
TX packets:69 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:4980 (4.9 KB) TX bytes:5412 (5.4 KB)

ping下服务器

PING 192.168.44.1 (192.168.44.1) 56(84) bytes of data.
64 bytes from 192.168.44.1: icmp_seq=1 ttl=64 time=68.0 ms
64 bytes from 192.168.44.1: icmp_seq=2 ttl=64 time=67.8 ms
64 bytes from 192.168.44.1: icmp_seq=3 ttl=64 time=68.1 ms
64 bytes from 192.168.44.1: icmp_seq=4 ttl=64 time=67.6 ms
64 bytes from 192.168.44.1: icmp_seq=5 ttl=64 time=68.0 ms
64 bytes from 192.168.44.1: icmp_seq=6 ttl=64 time=67.7 ms
64 bytes from 192.168.44.1: icmp_seq=7 ttl=64 time=67.9 ms
^C
— 192.168.44.1 ping statistics —
7 packets transmitted, 7 received, 0% packet loss, time 6006ms
rtt min/avg/max/mdev = 67.643/67.912/68.106/0.211 ms

服务器Ping客户端

PING 192.168.44.18 (192.168.44.18) 56(84) bytes of data.
64 bytes from 192.168.44.18: icmp_seq=1 ttl=64 time=67.7 ms
64 bytes from 192.168.44.18: icmp_seq=2 ttl=64 time=67.7 ms
64 bytes from 192.168.44.18: icmp_seq=3 ttl=64 time=67.9 ms
64 bytes from 192.168.44.18: icmp_seq=4 ttl=64 time=68.0 ms
64 bytes from 192.168.44.18: icmp_seq=5 ttl=64 time=67.7 ms
64 bytes from 192.168.44.18: icmp_seq=6 ttl=64 time=70.4 ms
64 bytes from 192.168.44.18: icmp_seq=7 ttl=64 time=67.8 ms
64 bytes from 192.168.44.18: icmp_seq=8 ttl=64 time=67.6 ms
^C
— 192.168.44.18 ping statistics —
8 packets transmitted, 8 received, 0% packet loss, time 7010ms
rtt min/avg/max/mdev = 67.619/68.144/70.480/0.910 ms

客户端ping客户端

root@nat:~# ping 192.168.44.14
PING 192.168.44.14 (192.168.44.14) 56(84) bytes of data.
64 bytes from 192.168.44.14: icmp_seq=1 ttl=64 time=140 ms
64 bytes from 192.168.44.14: icmp_seq=2 ttl=64 time=140 ms
64 bytes from 192.168.44.14: icmp_seq=3 ttl=64 time=140 ms
64 bytes from 192.168.44.14: icmp_seq=4 ttl=64 time=141 ms
64 bytes from 192.168.44.14: icmp_seq=5 ttl=64 time=140 ms
64 bytes from 192.168.44.14: icmp_seq=6 ttl=64 time=141 ms
64 bytes from 192.168.44.14: icmp_seq=7 ttl=64 time=140 ms
64 bytes from 192.168.44.14: icmp_seq=8 ttl=64 time=140 ms
^C
— 192.168.44.14 ping statistics —
8 packets transmitted, 8 received, 0% packet loss, time 7008ms
rtt min/avg/max/mdev = 140.628/140.910/141.689/0.494 ms

至此内网已经可以互通,剩下来的就是研究研究内网安全配置了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注