Docker隐射的端口外网不能访问
大约 3 分钟
问题
比如现在有一台公网服务器,公网ip是111.111.111.111,内网ip是:10.1.1.1 。在这台服务器上面跑了两个服务:
mysql
非docker方式,暴露的端口是3306,绑定的ip是0.0.0.0
nacos
docker方式,映射到宿主机的端口有8848和9848。连接的mysql地址是:111.111.111.111:3306/nacos
现在发现的问题有:
- nacos总起不来,总提示
No DataSource set
,但在本地却能连接 111.111.111.111:3306/nacos,并能读写数据 - 后面把nacos的mysql连接地址改10.1.1.1:3306/nacos后,nacos能启动成功了,但外网访问不了nacos的控制台
这台服务器之前两个服务都能正常在公网访问,突然有一天发现不行了
查看防火墙端口设置:
8848端口也开了的,在服务器上执行telnet 127.0.0.1 8848
也是通的,但执行telnet 111.111.111.111 8848
就不通
网上各种乱搜,发现了始作俑者:ip_forward
解决过程
通过是否开启了路由转发 cat /proc/sys/net/ipv4/ip_forward
输出0表示没有开启,1表示开启了。此时输出的是0
为0,表示禁用了路由转发,也就是说禁止了本机网卡之间的通信。
禁用后,在docker容器内部也就无法访问公网
也就是解释了为什么nacos的mysql地址设置为111.111.111.111:3306/nacos的时候启动不了
设置为1
不能直接vim /proc/sys/net/ipv4/ip_forward 来修改.
正确姿势:
vim /etc/sysctl.conf
找到net.ipv4.ip_forward,将其值修改为1. 或者在文末追加这个配置
net.ipv4.ip_forward = 1
使其生效
sysctl -p
到此可以验证下在docker容器内部能否访问外网,我这里是重启了docker
至此,上面的服务都能正常访问了
溯源
之前这两个服务一直都是好的,为啥“突然”就不行了。
回忆下来估计是中途按照了BBR,并重启了一次服务器,基本可以确定和这个有关系。
系统推荐
- MAT工具
- 常见问题
- synchronized原理深度剖析
- MySQL杂项
- 各种网关性能测试
- Spring框架源码关键点
- JDK命令行工具
- 提取Docker镜像中的文件
- 正则表达式匹配第几个符号问题
- Markdown软件比对
- MySQL数据迁移到PGSQL
- intro
- 随机毒鸡汤:如果做不成金子,那我就要做一块最硬的石头,谁说我不行我就砸谁。