使用 IPSec 连接带有 chnroutes 的隧道

BRITE’S BLOG.人生在世,看得穿,又看得远者prevail everywhere.: 使用 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

# apt-get install strongswan

修改 /etc/ipsec.conf

config setup          charonstart=yes          nat_traversal=yes          uniqueids=never     conn ios          keyexchange=ikev1          authby=xauthpsk          xauth=server          left=%defaultroute          leftsubnet=0.0.0.0/0          leftfirewall=yes          right=%any          rightsubnet=10.7.0.64/26            rightsourceip=10.7.0.65/26            pfs=no          auto=add

修改 /etc/ipsec.secrets

: PSK "Your pre-shared key"     username : XAUTH "userP@ss" 

配置 iptables 转发

# iptables -t nat -A POSTROUTING -o <公网网卡> -s  -j SNAT --to-source <公网地址>

在本例中,iptables 的命令为

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

# apt-get install dnsmasq git

修改 /etc/dnsmasq.conf 部分:

server=8.8.8.8 # 默认上游服务器通过隧道交由 Google DNS 解析以获得最佳海外站点效果  conf-dir=/etc/dnsmasq.d  # 启用配置文件目录

屏蔽公网对本机 DNS 服务的直接访问:

修改 /etc/strongswan.conf 在 charon { ... } 块内添加:

测试

一切就绪后重启 strongswan 服务:

# service strongswan restart

客户端的 IPSec VPN 配置:

  • 服务器地址为服务器 A 的公网地址
  • 用户名、密码、预共享密钥为服务器 A 中配置文件中的值

连接上之后在客户端 ping 任意公网 IP、服务器 A 和服务器 B 的隧道端 IP 应该都是通的。至此,客户端连接 IPSec VPN 后所有流量都会加密经由服务器 A 中转,在必要时会经由海外服务器 B 转发,保证了访问工作必需站点的速度和在任何公共网络环境下的数据安全.