使用 IPSec 连接带有 chnroutes 的隧道网络配置小记
标题似乎不是很易懂,于是解释下先。
位于大陆的服务器 A 和位于海外的服务器 B,A 与 B 之间使用隧道互联成内网,服务器 A 配置 chnroutes 以在必要的时候通过海外服务器访问网络,并在服务器 A 上配置 IPSec 服务器,从而使终端用户能够在任何网络环境下安全接入内网。大致描述如下:
需要加速海外访问时:终端用户 <- IPSec VPN -> 服务器 A <- 隧道 -> 服务器 B <-> 互联网
需要访问大陆网域时:终端用户 <- IPSec VPN -> 服务器 A <-> 互联网
此场景适用于互联网公司为员工提供快速、安全、便捷的工作网络环境,对于个人用户来说负担较大,不建议使用。
配置隧道
最简单的方案在服务器 A 和 B 上配置 GRE 隧道即可,步骤简单不再赘述。需要注意的是为了能让客户端的内网地址能够访问到隧道的对端,也就是服务器 B 端,服务器 B 上配置隧道时 peer
的参数应当是包含服务器 A 和 VPN 客户端 IP 的 IP 段,例如 ip addr add 10.7.0.1 peer 10.7.0.2/24 dev gre0
隧道打通后,服务器 A 的路由配置为:
- 到服务器 B 的公网 IP 路由经服务器 A 的公网网关出站
- 默认出口路由为隧道对端
- 注意设置内网之间的路由
- chnroutes 配置到大陆的流量经由服务器 A 的公网网关出站
配置 IPSec
安装 strongswan
1 |
修改 /etc/ipsec.conf
1 | config setup |
修改 /etc/ipsec.secrets
1 | : PSK "Your pre-shared key" # 预共享密钥,注意修改引号内部分 |
配置 iptables 转发
1 | # iptables -t nat -A POSTROUTING -o <公网网卡> -s <VPN 网段> -j SNAT --to-source <公网地址> |
在本例中,iptables 的命令为
1 | iptables -t nat -A POSTROUTING -o eth0 -s 10.7.0.64/26 -j SNAT --to-source xxx.xxx.xxx.xxx |
DNS 加速优化
既然是服务器中转分流,那么需要在服务器上进行 DNS 解析方可获得最佳效果。
安装 dnsmasq 和 git
1 |
修改 /etc/dnsmasq.conf
部分:
1 | server=8.8.8.8 # 默认上游服务器通过隧道交由 Google DNS 解析以获得最佳海外站点效果 |
获取 dnsmasq-china-list,将其中的配置文件软连接到 /etc/dnsmasq.d
下即可使用 114DNS 直接解析大部分需要加速的国内站点。
屏蔽公网对本机 DNS 服务的直接访问:
1 | # iptables -A INPUT -p udp -d <服务器 A 公网 IP> --dport 53 -j DROP |
修改 /etc/strongswan.conf
在 charon { ... }
块内添加:
1 | dns1 = 10.7.0.2 # 此处可填服务器 A 上除公网 IP 和 localhost 之外的任意可绑定 IP 地址,例如隧道的本地端地址 |
测试
一切就绪后重启 strongswan 服务:
1 |
客户端的 IPSec VPN 配置:
- 服务器地址为服务器 A 的公网地址
- 用户名、密码、预共享密钥为服务器 A 中配置文件中的值
连接上之后在客户端 ping 任意公网 IP、服务器 A 和服务器 B 的隧道端 IP 应该都是通的。至此,客户端连接 IPSec VPN 后所有流量都会加密经由服务器 A 中转,在必要时会经由海外服务器 B 转发,保证了访问工作必需站点的速度和在任何公共网络环境下的数据安全。