建立 AWS 到 IDC 的VPN

由于我们的很多运维工具都部署在自己的 IDC 里面,比如 Puppet、YUM 源、NTP 服务器、Nginx 日志分析工具 等,如果不打通 AWS 到 IDC 的内网,这些工具都要在 AWS 搭建一份,太麻烦,so do it .

一开始我想使用 AWS 的「VPN连接」服务(文档在 这里 )来做,但是要求 IDC 端是 cisco 路由器等硬件设备,我们 IDC 没有这些设备,所以只能找机器来做了。

 

1.机器是 Centos6,改一下脚本,在两台机器上执行。

#!/bin/bash
#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 &>/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 peer $R_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 机器 内网的接口上,如图:

S488C0Q)5W$QUW0@E[E`SNY

另外要注意的是,增加路由表之后,在 ec2 机器上 用 route -n 是看不到增加的路由的,但是确实已经生效;当 ec2 机器重启之后,此时用 route -n 可以看到增加的路由。

 

理论上说,完成上面的步骤之后,VPN 就已经 OK 了,但是这里是 AWS,不是自己的网络架构,所以我又遇到了坑。。。。

上面说了要把两方的机器的 net.ipv4.ip_forward 打开,但是在 ec2 机器上打开之后,还需要关闭 ec2 的 「源/目标检查」,如图:

bbbb

源/目标检查 的解释如下:

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.

最后放张图,看下成果。。。。

aaaa

 

构建机房运维基础架构(十一): 搭建NAT服务

本文档介绍如何在一台服务器做NAT转发,以外网网卡是em1 ,源IP段10.0.0.0/16 为例。


1.开启forward ,并加入开机启动

# sysctl -w net.ipv4.ip_forward=1
# echo “sysctl -w net.ipv4.ip_forward=1” >> /etc/rc.d/rc.local

2.增加外网IP。

外网出口可以有多个IP,先增加这些IP (不配置的話NAT不生效)。

来个例子脚本( 执行而且把这段脚本写入/etc/rc.d/rc.local ):

ip_prefix=“121.14.25”
ip_min=131
ip_max=158
netmask=“255.255.255.224”

n=0
for i in `seq $ip_min $ip_max`
do
    /sbin/ifconfig em1:$n ${ip_prefix}.$i netmask $netmask up
    ((n++))
done

3.用iptables 增加nat 转发

类似:

# iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -o em1 -j SNAT –to-source 121.14.25.17-121.14.25.22
# iptables-save > /etc/sysconfig/iptables

如果不指定出口IP,可以用:

# iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -o em1 -j MASQUERADE

另外两点:

  1. 最好要两台NAT机器(接入一台交换机),起一个VIP指向这两台机器,并且在接入交换机上打开 源IP、源端口、目的IP、目的端口 的哈希功能(在等价路由基础上),这其实是实现了流量的负载均衡和高可用(具体咨询搞网络的同学)。

  2. 最好有安全策略,不要让所以机器都可以通过NAT访问外网,这个功能自己去调研方案啦。