跨机房的网络通信

这个实现方式有很多种,有条件的可以走光纤专线;没钱的,开 VPN,其中关于 VPN 的实现方式有很多种,这里使用 OpenVPN。由于没有二层的需求,就不考虑使用 TAP(server-bridge) ,这里使用 TUN(server) 设备。
这里,我们把 client/gw 分别部署在 A、B 两 IDC GW 上,即 SNAT 的出口上。

各种复杂情况的组合无外乎下面两种情况的组合叠加:
1. Including multiple machines on the server side when using a routed VPN (dev tun)
这个模式就是我们最普遍使用的模式,科学上网以及一般内网的登录都是使用的该模式

2. Including multiple machines on the client side when using a routed VPN (dev tun) **
这个是让 server 访问 client 后面的机器,需要 client-config-dir 指令来维护路由

这里有个文档,涉及就是上面两种情况的结合,不过是通过普通的家用路由实现的,思路非常的好。而下面,我们会通过更 "纯正" 的方式实现上面的情景。

我们这里有 A、B 两个机房:
A(server): eth0(public), eth1(192.168.1.0/24)
B(client): eth0(public), eth1(10.18.10.0/24)

双方的 vpn 地址在 192.168.4.0/24 里面。

对于 A 的 server.conf 来说,最重要的就是下面几句话:
$ cat /etc/openvpn/server.conf
push "route 192.168.1.0 255.255.255.0"
client-config-dir       /etc/openvpn/ccd

$ cat /etc/openvpn/ccd/B
iroute 10.18.10.0 255.255.255.0

接着就是在 GW 上做 SNAT:
-A INPUT -s 192.168.4.0/24 -j ACCEPT
-A POSTROUTING -s 192.168.4.0/24 -o eth1 -j MASQUERADE

增加到 10.18.10.0/24 的 路由:
# route add -net 10.18.10.0/24 netmask 255.255.255.0 gw tun0

对于 B 来说,client.conf 跟正常的一样,没什么需要特别注意的,接着就是在 netfilter 上添加 SNAT:
-A INPUT -s 192.168.4.0/24 -j ACCEPT
-A POSTROUTING -s 192.168.4.0/24 -o eth1 -j MASQUERADE

最后要注意的是,双方同时开启 ip_forward。理清楚了,就这么简单。