Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] 开启ufw防火墙后所有容器域名解析失效 #4984

Closed
mia0x75 opened this issue May 11, 2024 · 6 comments
Closed

[BUG] 开启ufw防火墙后所有容器域名解析失效 #4984

mia0x75 opened this issue May 11, 2024 · 6 comments
Assignees

Comments

@mia0x75
Copy link

mia0x75 commented May 11, 2024

联系方式

No response

1Panel 版本

1.10.6

问题描述

ping 外网可以,ping 域名不通,试了几个都是一样。面板上安装了 smartdns 供局域网域名解析使用,其他物理机解析正常,关闭 ufw 也没有用,在 /etc/docker/daemon.json 中加入 dns 指向宿主机,重启 docker 服务也不行,这个是什么问题呢?

重现步骤

如上所述,因为宿主有分配 IPv6 所有想把主机端口(主要是那些映射到容器的端口)的访问来源限制到局域网内部,然后就悲剧了。

期待的正确结果

No response

相关日志输出

No response

附加信息

No response

@MiderWong
Copy link

MiderWong commented May 12, 2024

类似问题场景

我之前在CentOS上遇到过ipv4 彻底无法连接外网 ,那个问题是因为安装Docker先创建容器后安装并启动防火墙 导致的 防火墙没有开放Dockerbridge网络

当前场景

你提到了可以ping外网,只是域名无法解析,因为我没有使用ipv6,所以不确定是否是同一个问题。

尝试解决

可以尝试使用以下命令 (不确保好用!不确保好用!不确保好用!我很少使用Ubuntu系列,下面的命令只是根据之前的解决思路结合网上查的ufw用法得出的步骤) :

# 开放 docker0网络的外网访问
sudo ufw allow out on docker0
# 关闭 ufw
sudo ufw disable
# 启动ufw 使规则生效
sudo ufw enable

后续跟进

如果根据上述命令解决问题之后就可以确定是同一个问题,顺便可以提一个新的BUG: 先创建容器后安装并启动防火墙会导致bridge无法访问外网

@mia0x75
Copy link
Author

mia0x75 commented May 12, 2024

感谢回复,的确是先Docker后ufw,又找了一个机器试了下先ufw后Docker,目前看起来正常。你上面提到的命令执行后没有效果,要是在容器中手工添加nameserver到/etc/resolv.conf是可以用域名访问的。

在新机器搞ufw又有点问题

新机器上折腾宿主53/udp转发到5353/udp,5353/udp映射到容器的53/udp
开始的时候

dig @localhost -p 53 www.x.com
dig @127.0.0.1 -p 53 www.x.com

都不行,但是 dig @HOS_IP -p 53 www.x.com可以

报错是:

;; communications error to ::1#53: connection refused
;; communications error to 127.0.0.1#53: connection refused

换成5353就没有问题,估计是端口转发的问题

dig @10.0.0.137 -p 5353 www.x.com
dig @localhost -p 5353 www.x.com

继续折腾想把上面两个拒绝连接解决,不幸的是又把ufw折腾坏了 :(

ufw 转发,不知道对不对

sudo ufw route allow proto udp from any to any port 53 port 5353

@MiderWong
Copy link

嗯,那说明是bridge转发出了问题,可以执行iptables -t nat -S看看端口转发情况:
端口转发

@MiderWong
Copy link

MiderWong commented May 12, 2024

你使用上面的操作方法可行了吗?如果不可行的话可以试试如下步骤:

  • ①、安装1P面板
  • ②、安装防火墙并开启防火墙
  • ③、安装应用(这个时候创建的容器bridge可以访问外网)
  • ④、在应用/网站对应的容器上编辑特定端口转发(不使用命令,直接使用1P面板操作容器暴露端口的逻辑)
  • 1)、如果使用下图中的①暴露所有端口 , (不过,不能修改指定特定端口,而且要确保宿主机port没有被占用)
  • 2)、如果使用下图中的②暴露指定端口,前面填127.0.0.1:xxxx,比如说设置127.0.0.1:5443:53,就把宿主机的5443端口转发至该容器的53端口,要注意的是,宿主机的的5443端口也不能被占用
    image

@wan92hen
Copy link
Contributor

一般这种情况,可以试一下重启 docker 服务,docker 服务会自动去处理相关防火墙规则。

@mia0x75
Copy link
Author

mia0x75 commented May 13, 2024

不经重启docker了,还在daemon.json中增加了dns设置,也还是不行。

不过按照 @MiderWong 的做法,把容器的端口映射,宿主一侧改成 0.0.0.0:port 可以避免 IPv6 端口问题。

花了 2 个小时重装了机器,先装 ufw,不过这个也同样不行。

假设这台机器是 IP-a,是局域网中的 dns 服务器,感觉跟之前测试那个 IP-b 不同之处是,IP-a 重装的时候 IP-a 上还没有 dns 服务器,不像 IP-b 机器测试时,dns 可以访问 IP-a。

dns 服务器是 1Panel-dev/appstore#1385 这个 PR 里面的,应该没有问题吧。

目前每个容器增加 nameserver,先凑合用吧。

@1Panel-dev 1Panel-dev locked and limited conversation to collaborators May 13, 2024
@wanghe-fit2cloud wanghe-fit2cloud converted this issue into discussion #5006 May 13, 2024

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Projects
None yet
Development

No branches or pull requests

4 participants