此前介绍了VPC网络下阿里云服务器如何配置Snat让整个VPC网络都通过一个EIP访问公网,今天介绍一下如何通过GRE隧道将两个VPC网络的私网打通。
测试环境如下:
2个VPC(VPC1,VPC2)代表两个完全隔离的物理网络
每个VPC网络交换机,路由器,公网IP各一个,ECS2台,一台作为VPC网络的网关,一台作为局域网内部的服务器。
VPC1: {EIP:112.74.32.191 GW:172.16.1.1 VPC1-Client: 172.16.1.2}
VPC2: {EIP:112.74.32.161 GW:172.16.2.1 VPC2-Client: 172.16.2.2}
拓扑如下:
VPC1-GW操作
加载gre模块
1 |
[root@VPC1-GW ~] # modprobe ip_gre |
2 |
[root@VPC1-GW ~] # lsmod |grep gre |
3 |
ip_gre 9575 0 |
4 |
ip_tunnel 12597 1 ip_gre |
创建隧道tun1
1 |
[root@VPC1-GW ~] # ip tunnel add tun1 mode gre remote 112.74.32.161 local 172.16.1.1 |
激活隧道tun1
1 |
[root@VPC1-GW ~] # ip link set tun1 up |
为隧道配置互联地址
1 |
[root@VPC1-GW ~] # ip addr add 192.168.2.1 peer 192.168.2.2 dev tun1 |
将访问VPC2网络的数据都丢到tun1接口
1 |
[root@VPC1-GW ~] # route add -net 172.16.2.0/24 dev tun1 |
#VPC2-GW配置和VPC1一样,只是链路反过来,按照实际情况修改一下。
1 |
[root@VPC2-GW ~] # modprobe ip_gre |
2 |
[root@VPC2-GW ~] # lsmod |grep gre |
3 |
ip_gre 9575 0 |
4 |
ip_tunnel 12597 1 ip_gre |
5 |
[root@VPC2-GW ~] # ip tunnel add tun1 mode gre remote 112.74.32.191 local 172.16.2.1 |
6 |
[root@VPC2-GW ~] # ip link set tun1 up |
7 |
[root@VPC2-GW ~] # ip addr add 192.168.2.2 peer 192.168.2.1 dev tun1 |
8 |
[root@VPC2-GW ~] # route add -net 172.16.1.0/24 dev tun1 |
查看隧道,属于激活状态
从VPC2网络测试VPC1的GW,已经可以联通,从VPC1测试VPC2的GW也可以联通了
1 |
[root@VPC2-GW ~] # nc -zv 172.16.1.1 22 |
2 |
Connection to 172.16.1.1 22 port [tcp/ ssh ] succeeded! |
3 |
[root@VPC1-GW ~] # nc -vz 172.16.2.1 22 |
4 |
Connection to 172.16.2.1 22 port [tcp/ ssh ] succeeded! |
至此,两个VPC网络的网关都已经能互通了,但是测试两个VPC网络的其他服务器,目前依然不能互通,如下:
这是因为路由还不通,这里以VPC2的client访问VPC1的client为例:
登陆VPC2的控制台为VPC2路由器配置默认路由,指向配置了EIP的VPC2-GW(可参考此前的SNAT教程),
登陆VPC2-GW,开启IP转发,并配置SNAT,让VPC1client的数据包转换为GRE隧道可以通讯的192.168.2.2这个IP:
1 |
[root@VPC2-GW ~] # echo 1 > /proc/sys/net/ipv4/ip_forward |
2 |
[root@VPC2-GW ~] # iptables -t nat -I POSTROUTING -s 172.16.2.0/24 -d 172.16.1.0/25 -j SNAT --to 192.168.2.2 |
这时,VPC2-client的数据包已经可以到达VPC1-GW了(VPC2-client->VPC2路由->VPC2-G->GRE->VPC1-GW),但是依然Ping不通,抓包看一下:
源地址是VPC1的互联地址,目标地址是172.16.1.2,这个路径显然是不通的,需要VPC1-GW将这个数据包转换为VPC1网络的地址:
1 |
[root@VPC2-GW ~] # echo 1 > /proc/sys/net/ipv4/ip_forward |
2 |
[root@VPC1-GW ~] # iptables -t nat -I POSTROUTING -j SNAT --to 172.16.1.1 |
配置完毕后,VPC1->VPC2反向也做同样的配置。
至此再做测试,VPC1和VPC2的网络就完全互通了: