Docker隐射的端口外网不能访问

作者 : 松哥资源 本文共1121个字,预计阅读时间需要3分钟 发布时间: 2023-11-22 共186人阅读




示例标题

问题

比如现在有一台公网服务器,公网ip是111.111.111.111,内网ip是:10.1.1.1 。在这台服务器上面跑了两个服务:

  1. mysql

    非docker方式,暴露的端口是3306,绑定的ip是0.0.0.0

  2. nacos

    docker方式,映射到宿主机的端口有8848和9848。连接的mysql地址是:111.111.111.111:3306/nacos

现在发现的问题有:

  1. nacos总起不来,总提示No DataSource set ,但在本地却能连接 111.111.111.111:3306/nacos,并能读写数据
  2. 后面把nacos的mysql连接地址改10.1.1.1:3306/nacos后,nacos能启动成功了,但外网访问不了nacos的控制台

这台服务器之前两个服务都能正常在公网访问,突然有一天发现不行了

查看防火墙端口设置:

Untitled

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,并重启了一次服务器,基本可以确定和这个有关系。



  • 随机毒鸡汤:喜欢就像乘法一样,只要一方为零,结果便为零。


文章来源于justsoso.fun: Docker隐射的端口外网不能访问





发表回复