前言
我有一个朋友, 他在Dev 和 Test 服务器用Docker 搭建了Redis 供项目使用, 然后今天Test 环境的Redis 端口访问不通了, 在服务上可以正常连接, 真是离了个大齐, 让我们试试排查排查问题;
正文
端口检测 lsof
已确认在本地用 telnet ip 6381
访问不通, 那就上服务上看看端口情况
Dev
Test
Dev环境同时映射到Ipv6和Ipv4端口, Test环境仅映射到Ipv6, 那基本上就可以断定是环境问题了
容器状态 docker ps
既然端口映射有问题, 就先看下容器的状态
Dev
Test
可以看到Dev同时映射了Ipv6和Ipv4, Test只映射了Ipv4, 这就能解释上面的情况了, 他说他搭建命令是一样的, emmm那就是环境问题, 看看Docker版本
Docker版本 docker -v
果然Test 版本是 Docker version 1.13.1, Dev 版本是Docker version 20.10.8, 这就能讲通为何同样的搭建命令但映射的不同;
但这又产生了一个新问题, 之前是这样是可以访问的, Ipv6 是可以兼容访问Ipv4的, Ipv4不能访问ipv6; 会不会是Ipv4的转发出了问题!
数据包转发 net.ipv4.ip_forward
当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能;
执行 /sbin/sysctl net.ipv4.ip_forward 查看:
net.ipv4.ip_forward = 0
果然没开, 那就把这个转发打开
临时修改 net.ipv4.ip_forward
可以用 sysctl -w net.ipv4.ip_forward=1
或者 echo 1 > /proc/sys/net/ipv4/ip_forward
重启Redis 容器 docker restart redis, 可以访问通了!
那就把这个配置永久生效
永久修改 net.ipv4.ip_forward
用vim
修改文件/etc/sysctl.conf
:
net.ipv4.ip_forward = 1
保存后调用 sysctl -p
生效, ok问题解决;