由于某些原因,AWS中国区并没有VPN服务。但是为了便于开发管理,我们仍然希望将办公室与AWS的VPC打通。经过一个周末的摸索与AWS的支持,成功实现了双向打通。

基础设施:

  • AWS中国区VPC,至少一个Public的Subnet;
  • 公司有固定IP,我们是中国联通的企业光纤;
  • 有一台支持ipsec的路由器,或者是一台闲置的PC安装Centos7(一个网卡就可以)。这里我们采用的是后者。

模拟环境说明:

  • AWS的VPC为:172.31.0.0/16;
  • 公司内部网络为:10.0.1.0/24;
  • 公司的公网IP为:145.111.111.111;
  • 后面说到的EC2的固定公网IP为:54.10.10.10,内网IP为:172.31.0.114;
  • 公司内部用于VPN的Centos的内网IP为:10.0.1.200。

前期步骤:

  • 在AWS的Public子网中启动一台EC2作为VPN用机。t2.micro的就可以;
  • 启动后分配一个固定的公网IP给这台EC2;
  • 右键点击这个EC2,“联网”->“更改源/目标。检查”,禁用;
  • 前往AWS的VPC控制面板,配置希望连接到您公司内部资源的子网对应的路由表,添加路由:10.0.1.0/24到上面提到的EC2。

AWS EC2配置:

sudo su -
yum upgrade

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.default.log_martians = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 2048
net.ipv4.neigh.default.gc_thresh3 = 4096

sysctl -p

yum -y install openswan

vi /etc/ipsec.conf
version 2.0
config setup
    nat_traversal=yes
    protostack=netkey
    oe=off

conn vpn
    type=tunnel
    authby=secret
    left=172.31.0.114
    leftid=54.10.10.10
    leftsubnet=172.31.0.0/16
    right=145.111.111.111
    rightsubnet=10.0.1.0/24
    rightid=145.111.111.111
    auto=start
    ike=aes128-sha1;modp1024
    ikelifetime=28800s
    phase2=esp
    Phase2alg=aes128-sha1;modp1024
    salifetime=3600s
    pfs=yes
    dpdaction=restart_by_peer
    dpddelay=10
    dpdtimeout=30
    keyingtries=%forever

vi  /etc/ipsec.d/vpn.secrets
145.111.111.111 54.10.10.10: PSK "keykeykey"

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE

service ipsec restart

内部Centos配置:

sudo su -
yum upgrade

vi /etc/sysconfig/selinux
SELINUX=disabled

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.default.log_martians = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

reboot

yum -y install openswan bind-utils lsof

vi /etc/ipsec.conf
version 2.0
config setup
    nat_traversal=yes
    protostack=netkey
    oe=off

conn vpn
    type=tunnel
    authby=secret
    left=10.0.1.200
    leftid=145.111.111.111
    leftsubnet=10.0.1.0/24
    leftnexthop=%defaultroute
    right=54.10.10.10
    rightsubnet=172.31.0.0/16
    rightid=54.10.10.10
    auto=start
    ike=aes128-sha1;modp1024
    ikelifetime=28800s
    phase2=esp
    Phase2alg=aes128-sha1;modp1024
    salifetime=3600s
    pfs=yes
    dpdaction=restart_by_peer
    dpddelay=10
    dpdtimeout=30
    keyingtries=%forever

vi /etc/ipsec.d/vpn.secrets
54.10.10.10 145.111.111.111: PSK "keykeykey"

iptables -t nat -A POSTROUTING -s 172.31.0.0/16 -o enp4s0 -m policy --dir out --pol ipsec -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.31.0.0/16 -o enp4s0 -j MASQUERADE

service ipsec restart

调试:

  • tail -n 500 -f /var/log/secure | grep pluto 可以通过命令查看日志;
  • 如果遇到问题可以尝试service ipsec stop两边的服务,之后一次重新打开;
  • ipsec verify 可以查看设置是否正确;
  • service ipsec status 可以查看服务状态;
  • ipsec whack –status | grep -i established 可以查看是否有建立连接;

使用:

  • 按照以上设置成功后应该已经建立了Site to Site VPN了。AWS那边由于直接设置了路由表,所以所有EC2应该都可以ping通所有10.0.1.0/24的IP了;
  • 公司内部这边需要在路由器里或者自己的开发机上增加静态路由,路由172.31.0.0/16到10.0.1.200。这样就可以从公司内部的电脑ping通所有172.31.0.0/16的IP了。