建立 AWS 到 IDC 的VPN
由于我们的很多运维工具都部署在自己的 IDC 里面,比如 Puppet、YUM 源、NTP 服务器、Nginx 日志分析工具 等,如果不打通 AWS 到 IDC 的内网,这些工具都要在 AWS 搭建一份,太麻烦,so do it .
一开始我想使用 AWS 的「VPN连接」服务(文档在 这里 )来做,但是要求 IDC 端是 cisco 路由器等硬件设备,我们 IDC 没有这些设备,所以只能找机器来做了。
1. 机器是 Centos6,改一下脚本,在两台机器上执行。
#!/bin/bash
[[ $EUID -ne 0 ]] && echo “You are not root. Abort.” && exit 1#L_PUBLIC=$(curl -s ip.cn | grep -Po ‘\d+\.\d+\.\d+\.\d+’)
L_PUBLIC=$L_PUBLIC
R_PUBLIC=$R_PUBLIC
L_PRIVATE=$L_PRIVATE
R_PRIVATE=$R_PRIVATE
TUNL=tunl-aws
TTL=255
echo “Loading kernel modules…”
modprobe -av ipip
echo “Setting up tunnel…”
ip tunnel del $TUNL 2> /dev/null || true # delete old tunnel first
ip tunnel add $TUNL mode ipip local $L_PUBLIC remote $R_PUBLIC ttl $TTL
ip link set $TUNL up
ip addr add $L_PRIVATE dev $TUNL
ip route add $R_PRIVATE dev $TUNL
echo “Testing tunnel: pinging from $L_PRIVATE to $R_PRIVATE …”
ping -c1 $R_PRIVATE
[[ $? = 0 ]] && echo “Tunnel is set up successfully.”
L_PUBLIC 是 本地机器公网IP,R_PUBLIC 是对方机器公网IP,L_PRIVATE 是 本地私有IP,R_PRIVATE 是对方私有IP,L_PRIVATE 和 R_PRIVATE 在一个网段(两个 PRIVATE IP 用于两端通信,因为是两个IP,所以划一个 /30 的网段就行了)。
要注意两点:
1). AWS 端机器的 L_PUBLIC 要写内网IP,而不是弹性IP(这点应该和 AWS 的网络结构有关),否则执行脚本之后也无法 ping 对方的 PRIVATE IP.
2). 两台机器 net.ipv4.ip_forward 要设置为 1 .
2. 配置好隧道之后,还要在 两台机器上添加路由,比如我在 IDC 机器上增加:
route add -net 172.30.0.0/16 gw 10.0.20.34
在 AWS 机器上增加:
route add -net 10.0.0.0/8 gw 10.0.20.33
172.30.0.0/16 是 AWS 的网段,10.0.0.0/8 是 IDC 的网段。
3. 需要在两端所有的机器上增加路由表,在 IDC 可以通过 Puppet 增加,更好的方式是通过 ospf 发布路由,还可以向公司的网络工程师帮忙。
在 AWS 可以修改 「VPC 的路由表」,增加一条到 IDC 网段的路由,我这里是把 10.0.0.0/8 网段的路由指向 AWS 机器 内网的接口上,如图:
另外要注意的是,增加路由表之后,在 ec2 机器上 用 route -n 是看不到增加的路由的,但是确实已经生效;当 ec2 机器重启之后,此时用 route -n 可以看到增加的路由。
理论上说,完成上面的步骤之后,VPN 就已经 OK 了,但是这里是 AWS,不是自己的网络架构,所以我又遇到了坑。。。。
上面说了要把两方的机器的 net.ipv4.ip_forward 打开,但是在 ec2 机器上打开之后,还需要关闭 ec2 的 「源/目标检查」,如图:
源/目标检查 的解释如下:
Changing the Source/Destination Checking of a Network Interface The Source/Destination Check attribute controls whether source/destination checking is enabled on the instance. Disabling this attribute enables an instance to handle network traffic that isn’t specifically destined for the instance. For example, instances running services such as network address translation, routing, or a firewall should set this value to disabled. The default value is enabled.
最后放张图,看下成果。。。。