mirror of
https://github.com/hwdsl2/docker-ipsec-vpn-server.git
synced 2026-04-26 01:55:53 +03:00
[GH-ISSUE #217] 迁移DNS服务器后,导致客户端解析网页失败。 #203
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @SuperCatss on GitHub (Dec 3, 2020).
Original GitHub issue: https://github.com/hwdsl2/docker-ipsec-vpn-server/issues/217
环境:Docker
主机:Openwrt
作者你好,在相同环境的情况下,我已经平稳使用了接近半年了。
之前,我在env 文件中,指定了dns 服务器为Openwrt 的ip,由主机中的AdGuard Home 软件 提供dns 服务。
近期,我将AdGuard Home 由主机 移到了 Docker 中。
现在的网络拓扑情况如下:
主机 192.168.2.1
AdGuard Home docker 中 172.0.17.4
Ipsec-vpn-server docker 中 172.0.17.3
体现的情况是,通过手机链接后,能通过ip 访问家庭局域网 192.168.2.* 网段,访问网页一直提示找不到对应的ip地址。
已经在AdG 的dns 解析日志中查看,有正确解析域名。已经在Ipsec的容器中,通过nslookup,测试解析,也是正确的。
现在还不清楚,是什么原因导致了这个情况,希望作者能不吝赐教,指点一二。谢谢
贴出env 文件
----------------------------------------------------------分割线----------------------------------------------------------------------------
发现了一个情况,在dev 文件的DNS 配置节点,如果直接填写 AdG的docker ip,即 172.0.17.3 就没有任何问题了,有点不明所以,为什么会这样?
----------------------------------------------------------分割线----------------------------------------------------------------------------
因为发现直接填写AdG的docker ip ,能正常工作。所有又做了以下的尝试。因为考虑到重启会导致 ip 地址的变更,所以创建了一个docker网络,将Ipsec 和 AdG都加入到这个网络中,在Ipsec的Dns 配置中填写 AdG的容器名称。通过ping 测试与AdG的连通性测试通过。但是重启后发现,貌似Ipsec并不能正确解析到AdG的ip地址,查看日志提示如下
----------------------------------------------------------分割线----------------------------------------------------------------------------
又花了一点时间,测试了一下,发现有两种情况,
@hwdsl2 commented on GitHub (Dec 5, 2020):
@SuperCatss 你好!对于你的第一个问题,我的理解是当你把 AdGuard 从 Docker 主机移动到 Docker 容器中之后,它的 IP 变为比如 172.0.17.4。这时如果你在 DNS 参数填写主机的 IP (192.168.2.1),VPN 客户端不能连接到 AdGuard 上的 DNS 服务,因为 Docker 的网络隔离和默认网络转发设置 (IPTables 规则),它无法将请求由 ipsec-vpn-server 容器先转发到 192.168.2.1 然后再转发到 AdGuard 容器。如你所说,填写 AdGuard 容器的地址就避免了此问题。
对于你的第二个问题,我对 Docker 的 custom network 配置不太熟悉,没有测试过这类配置。如果容器的日志显示无法解析公共 IP,说明容器本身的 DNS 不工作。
另外,本镜像支持以主机或域名格式填写 VPN_DNS_SRV1 和 VPN_DNS_SRV2,会自动解析它们到 IP 地址。参见 [1] [2]。这可以避免某些有关容器 IP 地址重启后改变的问题。也就是说,你可以尝试在
env文件中指定比如VPN_DNS_SRV1=你的AdGuard容器名称。[1]
d4936ab[2] https://github.com/hwdsl2/docker-ipsec-vpn-server/pull/95
@SuperCatss commented on GitHub (Dec 7, 2020):
很高兴能得到你的回复,我今天进行了一下 对比测试,明确了 两个问题。
我分别在我的我的物理设备(openwrt ) 和 国外的 vpn上进行了测试。
两边的 docker启动脚本 相同。
第一:在docker 启动脚本中 指定已经存在的网络后,使用docker logs 查到的DNS服务器 ip,与 进入容器内部 使用nslookup ,查看的dns server ip 不一致。
第二:容器配置了两个网络后,即默认 的bridge(172.17.0.) 与 指定的网络(172.18.0.),挂在env 文件,dns1 配置为 172.17.0.3,dns配置为 ad(指定网络中,提供dns 的容器名称)。当我手动断开 bridge ,容器 并不能正确解析 dns2的ip地址。
另外 ,想问一下,在指定网络后,容器本身是如何获得 VPN_PUBLIC_IP ,在物理设备指定网络运行时,一直会提示
我并没有在dns 的服务器中,查看到 任何 关于这个 域名的解析请求。
但是在 VPS中,相同docker 启动脚本,却能运行。
@hwdsl2 commented on GitHub (Dec 7, 2020):
@SuperCatss 你所说的第一点,docker logs 查到的 DNS 服务器 IP,可能是说这一行:
该 DNS 服务器仅供 VPN 客户端使用(也就是说,当 VPN 客户端连接后,它会使用该 DNS 服务器发送请求)。你在进入容器内部使用 nslookup 看到的 DNS 服务器是容器本身的 DNS 服务器,和 VPN 客户端无关。所以这两个不一样,是正常的。
当容器启动时,
run.sh会尝试使用两种方式(见 [1],代码引用如下)检测你的服务器的公有 IP。首先向 resolver1.opendns.com 请求 myip.opendns.com 的 IP 地址。如果不成功,再尝试ipv4.icanhazip.com。这两个都是检测 IP 的常用方式。根据 Docker 文档来看 [2],当使用 custom network 时, Docker 会首先使用内部的 DNS 服务器。该错误表明在容器内部 DNS 不可用,可能是你的配置的问题。你可以进入容器然后用 nslookup 试一下,应该也不能成功解析。[1] https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/run.sh#L165
[2] https://docs.docker.com/config/containers/container-networking/#dns-services
@SuperCatss commented on GitHub (Dec 7, 2020):
谢谢指点,我Dokcer run 的 参数中添加了 dns 配置为8.8.8.8 ,现在容器正常启动。通过nslookup 测试解析。正常解析,但是客户端连接后,无法正常使用env,文件中配置的Dns 服务器 进行dns 解析。
@hedahong commented on GitHub (Jan 7, 2021):
我这出现了同样的问题,以前的版本没有这个问题(2020-10月),是不是最近有什么改动,我想拉取以前的镜像测试,发先找不到以前的镜像版本了。
我的部署脚本如下:
docker run
--name ipsec-vpn-server
--env-file /etc/docker-vpn.env
--restart=always
-p 500:500/udp
-p 4500:4500/udp
-d --privileged
-v /etc/docker-vpn.env:/etc/docker-vpn.env
hwdsl2/ipsec-vpn-server
然后
#修改docker0 172.12的网段
vim /etc/docker/daemon.json
{
"data-root": "/opt/docker",
"log-level": "warn",
"bip": "192.168.200.1/24"
}
vim /etc/docker-vpn.env
VPN_IPSEC_PSK=testVPN
VPN_USER=test
VPN_PASSWORD=test
然后启动报错如下:
stdout:
stdout: VPN credentials not set by user. Generating random PSK and password...
stdout:
stdout: Trying to auto discover IP of this server...
stderr: Error: Cannot detect this server's public IP. Define it in your 'env' file as 'VPN_PUBLIC_IP'.
stdout:
stdout: Retrieving previously generated VPN credentials...
stdout:
stdout: Trying to auto discover IP of this server...
stderr: Error: Cannot detect this server's public IP. Define it in your 'env' file as 'VPN_PUBLIC_IP'.
stdout:
stdout: Retrieving previously generated VPN credentials...
stdout:
stdout: Trying to auto discover IP of this server...
stderr: Error: Cannot detect this server's public IP. Define it in your 'env' file as 'VPN_PUBLIC_IP'.
stdout:
stdout: Retrieving previously generated VPN credentials...
stdout:
stdout: Trying to auto discover IP of this server...
stderr: Error: Cannot detect this server's public IP. Define it in your 'env' file as 'VPN_PUBLIC_IP'.
stdout:
stdout: Retrieving previously generated VPN credentials...
stdout:
stdout: Trying to auto discover IP of this server...
stderr: Error: Cannot detect this server's public IP. Define it in your 'env' file as 'VPN_PUBLIC_IP'.
stdout:
stdout: Retrieving previously generated VPN credentials...
stdout:
stdout: Trying to auto discover IP of this server...
stderr: Error: Cannot detect this server's public IP. Define it in your 'env' file as 'VPN_PUBLIC_IP'.
@hwdsl2 commented on GitHub (Jan 7, 2021):
@hedahong 你好!这个镜像在检测 Public IP 方面最近并无改动。你的日志中的错误说明从 Docker 容器内部很可能无法访问因特网。请检查是不是比如 Docker 版本升级的问题,或者 Docker 网络配置需要更改。
@zhongwei commented on GitHub (Oct 29, 2021):
我也遇到同样问题
Trying to auto discover IP of this server...
dig: couldn't get address for 'resolver1.opendns.com': failure