0x00 背景

需要打通阿里云VPC 网络与本地IDC机房的私有网络,遇到不少问题都没有找到解决方案,在看了不少strongswan的wiki文章后才解决,特此记录下。该网络拓扑伪参数如下:

ali_vpc_network(172.16.0.0/16) <--> ECS(IPSEC Gateway)<--> IDC Firewall(IPSEC Gateway)<--> Local Network(192.168.22.0/24,192.168.24.0/23)

## ECS Internal IP: 172.16.10.1 Elastic IP: 1.1.1.1
## IDC Firewall IP: 192.168.10.1 Public IP: 2.2.2.2

0x01 ECS 部署命令

安装strongswan

yum install epel-release -y
yum install strongswan -y
## 开启ipforward 修改 /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
### 应用配置
sysctl -p

配置 strongswan /etc/strongswan/ipsec.conf

# ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
        # strictcrlpolicy=yes
        # uniqueids = no
        charondebug="all"
        uniqueids=never
conn %default
        authby=psk
        type=tunnel
conn office_wire
    dpdaction=hold # 意外断开后尝试重连时长
    dpddelay=30s # 意外断开后超时时长,只对 IKEv1 起作用
    dpdtimeout=60s
    fragmentation=yes
    keyexchange=ikev1           #IPsec连接使用的IKE协议的版本
    left=172.16.10.1
    leftsubnet=172.16.0.0/16    #VPC的网段
    leftid=1.1.1.1              # Elastic IP
    right=2.2.2.2               # IDC public IP
    rightsubnet=192.168.22.0/24 #本地的网段
    auto=start
    ike=3des-md5-modp1024       #IPsec连接中IKE协议的加密算法-认证算法-DH分组
    ikelifetime=7200s          #IKE协议的SA生命周期
    esp=3des-sha1       #IPsec连接中IPsec协议的加密算法-认证算法-DH分组
    lifetime=7200s             #IPsec协议的SA生命周期
    type=tunnel
conn office_wireless
    also=office_wire
    rightsubnet=192.168.24.0/23 #本地的网段

配置strongswan的psk /etc/strongswan/ipsec.secrets

# ipsec.secrets - strongSwan IPsec secrets file
1.1.1.1 2.2.2.2 : PSK password_placeholder  #123456为IPsec连接的预共享密钥,本地IDC侧和VPN网关侧的预共享密钥需一致

启动strongswan

systemctl start strongswan
systemctl enable strongswan
### 查看连接状态

strongswan statusall
## 如果有sa 为up 则建立成功

## 这时候可以ping通
ping 192.168.22.x

如果还需要VPC 网络中 172.16.0.0/16 中的其他ECS也能访问本地IDC的机器,则需要在VPC网络中的路由表中配置 172.16.10.1 为下一跳路由。同时还要还安全组中开启允许local network 的 inbound访问。

0x02 IDC Firewall 配置

这步不多说了,主要的问题在于感兴趣流的配置。一般 访问外网是NAT出去,假设ACL 3010 应用于该NAT outbound,则需要在该3010 中deny所有到 aliyun vpc的流量,同时需要在ipsec policy 中对应的ACL,这里假设是3001中 permit 所有到aliyun vpc的流量。这样才会触发感兴趣流,才能成功建立ike sa & ipsec sa。

0x03 Troubleshooting

  1. 本地可以ping 通 ECS VPC Gateway,但是无法ping通其他机器
    1. 可能是ip_forward没开,或者iptables forward policy 为drop,最好改为accept
  2. 可以ping通,也可建立tcp连接,但是http服务访问不行,或者mysql访问卡住了。一般是mtu的问题
    1. 可以执行:iptables -t mangle -A FORWARD -o eth0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1360

    2. 或修改/etc/strongswan/strongswan.d/charon/kernel-netlink.conf 中的 mtu为 1360

    3. 重启strongswan

  3. strongswan无法和本地成功建立连接:
    1. 因为ECS 是在弹性公网IP下面,ifconfig 是看不到公网IP的,所以配置文件中的left要使用private IP
  4. strongswan无法建立设置的多个private network cidr
    1. 这个应该是strongswan的一个bug,在配置文件中使用also参数建立多个private network
  5. 在Linux上怎么查看已建立的Ipsec policy?
    1. ip xfrm policy show