同一个域名如何实现在家里走内网在外面走公网连接群晖

2024-01-30 10:06:13 +08:00
 itskingname

背景

我的 NAS 有公网 IP ,通过群晖的 DDNS 绑定了域名:xxx.com:13180

使用手机流量或者在外面访问域名一切正常。但是回到家以后,当我连上了家里的 wifi ,无论是直接使用外网 IP 还是使用域名,均无法访问 NAS ,必须使用 192.168 内网 IP 或者换成流量才能访问 NAS 。

需求

使用这个域名,无论在外网还是内网均能访问群晖。

设备

我没有旁路由器,只有联通送的光猫+送的路由器,没有其他网络设备。

请问我应该怎么设置,才能实现这个需求?

20044 次点击
所在节点    NAS
129 条回复
dasf53adf
2024-01-30 15:08:02 +08:00
NAT 回源,NAT 回环,NAT 回流,找这三个关键词有选项就打开。如果没有就需要在做 IP 映射的网关上配置 SNAT 解决。不需要 DNS 服务器,太麻烦了。。。
dasf53adf
2024-01-30 15:10:35 +08:00
@Jack927 这是一个经典的 TCP 连接问题,甚至有专门的名词,NAT 回流,NAT 回环,NAT 回源。。。 用不到 DNS 的。做 SNAT 就可以。(源:服务器网段,目标:服务器局域网地址,转换为:网关地址)
mohumohu
2024-01-30 15:13:12 +08:00
DNS 明明就是最优解,哪里奇怪了,DHCP 可以设置下发什么 DNS ,DNS 在你那个 NAS 也是 24 小时跑,不是已经满足了需求了吗?很多大企业也一直是这么干的,内部域名有专用的解析,建议 OP 补一下 DNS 知识。
itskingname
2024-01-30 15:15:41 +08:00
@Jack927 #78 你可能看漏了。解析域名经过 DNS 不奇怪。奇怪的是 DNS 服务器运行在我即将需要访问的这个机器上。

要访问这个机器我需要解析它的域名,而如果要解析它的域名我就需要先访问它。但是我都能访问它了,我还解析域名干嘛?
Jack927
2024-01-30 15:16:08 +08:00
@dasf53adf #82 从 OP 的情况来看,我认为群晖上直接 docker 点一下自建 dns 是最简单的方案了。 你说的这个诚然是高高级,底层上更直接。但是明显 OP 本人没有 OPENWRT ,一般的路由器也不具备这个功能。
itskingname
2024-01-30 15:16:57 +08:00
@mohumohu 要访问这个机器我需要解析它的域名,而如果要解析它的域名我就需要先访问它。但是我都能访问它了,我还解析域名干嘛?
ahjsrhj
2024-01-30 15:18:28 +08:00
DNS 对你来说就是最优解啊,你是不是理解错了
LinuShen
2024-01-30 15:18:34 +08:00
群晖不是有图形化的 DNS 服务器么,设置好转发器,然后 NAS 域名单独解析即可
Jack927
2024-01-30 15:18:38 +08:00
@itskingname #84 不奇怪。域名正常必然要解析成 ip 的不对吗? 没自建 dns 的情况下,全部使用运营商下发的。自建之后多了自己的 dns 服务,有何好奇怪的?
itskingname
2024-01-30 15:24:08 +08:00
@ahjsrhj

但凡我有一个树莓派或者家里有另一个机器能 24 小时运行,在上面部署一个 DNS 服务器,那确实是最优解。
@Jack927

现在奇怪的点在于,我需要使用 NAS 的内网 IP 来连 NAS 上面的 DNS 服务器,而连这个 DNS 服务器的目的就是把域名解析成这个 NAS 的内网 IP 。我知道功能上完全没问题。就是逻辑上很奇怪。因为我一开始就已经有这个内网 IP 了。
ASmartPig
2024-01-30 15:30:23 +08:00
用的小米路由器,可以在路由器上自定义 hosts ,把主机的 DNS 都指向网关,内网就解析的内网地址,外网出去之后走外网解析
itskingname
2024-01-30 15:31:04 +08:00
@ASmartPig 我回去看看联通送的路由器有没有这个功能
beyondstars
2024-01-30 15:33:39 +08:00
没有做环境复现和抓包,下列是我的猜测,仅供参考:

假设有下列环境:

- 外网主机 ext: 203.0.113.101
- 光猫 gateway:WAN IP: 198.51.100.101 ,LAN IP: 192.168.1.1
- 你的内网手机 phone:LAN IP: 192.168.1.101
- 你的内网 srv: Web Server: LAN IP: 192.168.1.102

光猫配置的 DNAT: 198.51.100.101:28080 -> 192.168.1.102:80

从外网主机 ext 连接内网 srv:

1. ext 发出封包给有公网 IP 的光猫 gateway:

IP[SRC=203.0.113.101(ext), DST=198.51.100.101(gateway)] TCP[SPORT=53103(random), DPORT=28080]

2. gateway 收到封包,做 DNAT 修改目的 IP 地址和目的端口,然后发给 srv:

IP[SRC=203.0.113.101(ext), DST=192.168.1.102(srv)] TCP[SPORT=53103, DPORT=80]

3. srv 收到封包,然后回复:

IP[SRC=192.168.1.102(srv), DST=203.0.113.101(ext)] TCP[SPORT=80, DPORT=53103]

4. srv 发出的 reply packet 首先到达 gateway ,gateway 默认对 LAN-to-WAN 流量做 SNAT ,因为这个封包的地址匹配一条之前配置的端口转发规则,所以 SPORT 也会改回去:

IP[SRC=198.51.100.101(gateway), DST=203.0.113.101(ext)] TCP[SPORT=28080, DPORT=53103]

5. 外网主机 ext 收到 reply packet, 在它看来这就好像是 gateway 的 28080 端口直接发给它的,根本感觉不到内网 srv 的存在。

从内网主机 phone 通过公网 IP 198.51.100.101 和映射端口 28080 连接内网 srv:

1. phone 发出封包给 gateway:

IP[SRC=192.168.1.101(phone), DST=198.51.100.101(gateway)] TCP[SPORT=48131(random), DPORT=28080]

2. gateway 收到封包,修改目的地址,然后发给 srv:

IP[SRC=192.168.1.101(phone), DST=192.168.1.102(srv)] TCP[SPORT=48131, DPORT=80]

3. srv 收到封包,然后回复:

IP[SRC=192.168.1.102(srv), DST=192.168.1.101(phone)] TCP[SPORT=80, DPORT=48131]

4. 根据 srv 的路由规则,这个封包不需交给 gateway 转发,可以直接通过以太网发给 phone, srv 对 phone 的 IP 地址做 ARP 解析,然后构造以太帧交给网卡.

5. phone 收到这个封包,TCP session 由一个四元组 ( SRC_IP, DST_IP, SRC_PORT, DST_PORT )确定,由于 sender 和最初的 DST 198.51.100.101 (gateway) 不一致,所以 phone 的 os 不认为这是之前那个 TCP session 的 reply ,所以丢弃封包。

解决方法其一,配置光猫(网关设备)的 hairpin NAT ,什么是 hairpin NAT: https://help.mikrotik.com/docs/display/ROS/NAT#NAT-HairpinNAT

hairpin NAT 正确配置之后,在以上的第二步 (gateway to srv) 的过程中,封包的 SRC IP 也会被修改,那么 srv 的 reply 封包的 DST IP 就会变成 gateway 的,而不是最初的 real sender, 再由 gateway 发给 real sender.
Jack927
2024-01-30 15:40:53 +08:00
@itskingname #90 不, 你没有。你如果内网使用 ip 访问,那就不会有你提出的问题了。 内网即然使用域名访问,那么域名的记录权威的解析是你的 ddns 的外网 ip ,你需要自己的 dns 重写为内网的 ip 。 必然要 dns 的,自己群晖上搞个有问题么?
如果你接受不了自己 dns 重写的这个结果,更高级和底层的方案就是也有不少人在说的 NAT 回环了
lxxself
2024-01-30 15:46:55 +08:00
@flyinghigherair #29 +1 直接就 clash 配置规则上外网和 ss 回家
Puteulanus
2024-01-30 15:48:24 +08:00
如果你的路由器支持直接改 hosts (影响 dnsmasq 解析记录),那你直接改 hosts 让域名生效;

如果你的路由器不支持改 hosts ,但支持改 DNS 服务器,那通过修改 DNS 服务器指向 NAS ,再在 NAS 上的 DNS 服务器里修改记录

如果你一定要奇怪为什么要走第二个这个绕一圈——那可不就是因为你路由器不支持,你又不换路由器嘛(狗头)


而且你的问题其实是在内网让一个域名返回特定的 IP ,至于这个 IP 刚好和内网 DNS 服务器是一个 IP ,这事可以看成是一个巧合
mohumohu
2024-01-30 15:51:02 +08:00
@itskingname 但是我都能访问它了,我还解析域名干嘛?
那你问你自己啊,你用 IP 又不是不能访问。
再说了群晖跑个 docker 用的 IP 完全可以不一样。
makedir002
2024-01-30 15:59:31 +08:00
@itskingname 按照你这说的,这有啥奇怪的,明显就不懂非常基础的网络知识。ip 和域名都没理清楚。
waringid
2024-01-30 16:01:32 +08:00
1 、连接 WIFI 后无法正常访问的情况应该是 WIFI 网络的外网解析问题吧,试试公共的 DNS 例如 119.29.29.29 或是 223.5.5.5
2 、如果步骤 1 无法解决问题,通过容器配置 ph-hole 让后在增加对应域名的本地解析也可以解决
wclebb
2024-01-30 16:24:06 +08:00
楼上回答太多了,不知道有没有跟我回答雷同,直接写我自己的;

我自己也遇到这个问题。
主要是绕路,不走内网(一段时间被这个问题困扰了很长时间)

重定向 Synology.me ,简单粗暴。
Surge 等代理软件,当识别到某 Wi-Fi 时,自动启动模块或配置文件,把域名重定向内网。
Surge Ponte 代理内网,简单粗暴解决部分问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1012671

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX