背景
最近参与了一个微服务相关的项目,nacos注册中心在学校内网的服务器上,因此为了在本地调试的时候将服务注册上去,配置了spring.cloud.inetutils.preferred-networks
为内网ip的前缀。
然而开发过程中遇到了一个问题,在本地启动两个模块后,A模块的请求无法到达B模块,显示连接超时。经过排列组合后发现,A、B都在服务器上,A或B中有一个在服务器上,都可以正常调用。只有A和B两个模块都在本地时不能正常调用。
最终排查发现通过EasyConnect分配的内网ip不能访问到本机。
因为平时不在学校里,需要连接服务器时会使用EasyConnect进入内网进行开发。EasyConnect登录后会获取到一个内网ip。正常情况下通过本机的ip,如127.0.0.1, 192.168.1.100, 30.10.70.150 等等都可以访问到本机的服务,然而在本机访问EasyConnect给本机分配的内网ip就会没有路由,这就造成了,服务器通过我的内网ip可以访问到本地的服务,本机通过内网ip反而访问不到服务的问题。
解决方法
虽然花了很长时间也没搞明白其中的原理,但是想解决问题还是有办法的。
- ip重写
在macOS上通过pf将一个ip的访问redirect到另一个上。但是这个方法我看了看很麻烦,没有继续尝试。 - 给loopback interface增加一个alias
将虚拟内网ip直接添加到环回接口上,就可以通过这个ip访问到本机了。
如果需要清除sudo ifconfig lo0 alias 10.10.10.10
sudo ifconfig lo0 -alias 10.10.10.10