联通云无法访问自己ip的问题现象和总结

现象 无法访问虚拟机自己的校园网IP

联通云因为是云架构,自己有一套自己的内网IP,可以额外绑定一个校园网IP。
对于虚拟主机自己,如果观察ifconfig返回的网卡结果,可以发现,虚拟主机自己只知道自己的内网IP,是不清楚自己的校园网IP的。
ifconfig的结果
图上是ifconfig的结果,其中红圈为联通云内网ip

校园网ip
上图可以看到我这台虚拟机主机的校园网IP

展示问题复现方式

1
2
3
4
5
6
7
8
9
#启动一个最小化的http服务
docker run -d -p 80:80 nginx:alpine
#如果顺利会展示nginx的welcome界面
curl -m 3 192.168.165.86
#这里因为配置了一个-m 3,3s之内无结果会报一个访问错误
curl -m 3 192.168.165.86
curl: (28) Connection timed out after 3001 milliseconds
#这里因为使用了联通云自己的内网IP,所以也能顺利的拿到nginx的welcome界面
curl -m 3 172.28.1.61

根因归属:我没有那么懂网络,如果按照我个人理解,这一层NAT转换应该联通云来做。

什么场景会触发这个问题

如果因为是用了外部的服务注册与发现框架导致的,那么因为你拿到的ip是校园网ip,自己内部部署了两个以上的微服务,这两个微服务互相访问就会出现问题。
如果同一台机器内部署了多个应用,其中还绑定了不同的域名,就很容易出现这个问题。

解决方法

利用iptables来增加一层本机的NAT,先用下面的命令确认自己现在的转发情况
如果安装过docker会有一个docker的转发,剩下没特殊设置应该是空的

1
iptables -t nat -L OUTPUT

增加一条NAT路由规则

1
2
3
iptables -t nat -A OUTPUT -d 192.168.165.86 -j DNAT --to-destination 127.0.0.1
#再次确认是否成功添加
iptables -t nat -L OUTPUT

操作完之后,测试,应该就可以了

1
2
#这个命令现在会正常返回nginx首页了
curl -m 3 192.168.165.86

把上面的iptable的操作配置为开机自启动

1
2
3
4
5
6
#保存当前的iptable到配置中
iptables-save > /etc/sysconfig/iptables
#然后在系统的启动文件中,附加下面一行
echo "iptables-restore < /etc/sysconfig/iptables" | sudo tee -a /etc/rc.local > /dev/null
#没加过的话,加个可执行权限
chmod +x /etc/rc.local