目前IPv6越来越普及了,服务器内配置应用经常遇到一些ipv6的问题,最近我在服务器配置docker的nginx时候出现了ipv4端口不监听的状态,报错是WARNING: IPv4 forwarding is disabled. Networking will not work.,经过查找资料解决了这个问题。
1、问题现象:
(1)在服务器启动镜像容器
nahsoagoac@ebs-63574:~$ sudo docker run -d --name web -p 80:80 nginx:v1
完成后发现出现了一段报错(WARNING: IPv4 forwarding is disabled. Networking will not work.),
(2)netstat -nptl发现只监听了tcp6的80,也就是IPv6端口
(3)从外部tcping或者telnet 80均不通
2、问题解决:
核心关键:net.ipv4.ip_forward
该值需要设置为1,也就是允许ipv4路由转发,如果不设置就会导致docker的80端口无法请求,其他端口也是类似的情况。
回忆我近期对服务器做的操作,原来是之前在编写linux的安全加固shell脚本时候将net.ipv4.ip_forward设置为0了,所以就出现这个问题了。
(1)
root@ebs-63574:~# sysctl net.ipv4.ip_forward
如果返回0,则代表关闭了ip路由转发
(2)
root@ebs-63574:~# vi /etc/sysctl.conf
修改net.ipv4.ip_forward=1 ,如果没有该值则单独添加一行,保存
(3)
root@ebs-63574:~# sysctl -p
使配置生效,正常应该返回一行包含net.ipv4.ip_forward=1
上述修改后测试无需重启docker直接就生效了,不行的话也可尝试重启下docker容器再试试。
错觉:
此时输入netstat -nptl发现docker还是只监听了tcp6,之前认为是没有设置成功,所以耽搁了很久调整,比如尝试这样运行容器
nahsoagoac@ebs-63574:~$ sudo docker run -d –name web -p 0.0.0.0:80:80 nginx:v1
发现没有用,依然不会监听tcp4的80端口,这种情况时机上无需担心,可输入docker ps -a查看下端口映射
这个链接可能对理解这个端口转发有帮助:https://github.com/docker/docker/issues/2174
老哥牛逼,一下自己就解决了同样的问题