V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
itskingname
V2EX  ›  NAS

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

  •  
  •   itskingname · 118 天前 · 9898 次点击
    这是一个创建于 118 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

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

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

    需求

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

    设备

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

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

    第 1 条附言  ·  118 天前
    我知道可以在群晖上面搭建一个 DNS 服务器来解决问题,把群晖的内网 IP 作为 DNS 服务器设置到手机上。这样一来,连上家里 wifi 时,手机会先通过自定义的 DNS 服务器连上群晖解析出域名对应的内网 IP ,然后再连接。但是这样做非常奇怪。

    我把钥匙忘在家里了,于是我翻窗进房间里拿钥匙,然后再翻出来,然后再用钥匙开门。
    第 2 条附言  ·  118 天前
    V 站就有过不少的讨论贴,比如:
    《一个关于路由器端口转发的问题》 /t/820999
    《咨询内网访问无法群辉外网问题》 /t/915740
    《公网 IP 的服务,只能从「非本机地址」访问,求解》 /t/936873
    《 DDNS 解析正常, 但是就是访问不了, 如何排查?》 /t/968975
    129 条回复    2024-02-12 22:19:45 +08:00
    1  2  
    silverwolf
        1
    silverwolf  
       118 天前
    adguard home 有个 DNS 重写 功能,把家里主路由的 dns 换成 adguard home
    lff0305
        2
    lff0305  
       118 天前   ❤️ 1
    内网回流问题,要解决需要路由器支持

    简单解决,就在内网机器 host 文件加个配置,把 xxx.com 解析成内网 192ip 就行了
    Jack927
        3
    Jack927  
       118 天前
    如同#1 #2
    我也这个需求:
    解决方案是一个设备装 adguard home ,路由器的 dns 执行这个设备,ADHome 然后 dns 重写成本地 ip 。
    这样家里所有人的设备就是在家走内网,在外走公网。
    如果没有一个单独的设备,那么你用的电脑上本地设置个 host 也行
    A01514035
        4
    A01514035  
       118 天前
    我昨晚也想到了这个问题,是否可以通过一台云服务器使用 nginx 做 301 重定向来实现?
    有一个解析到云服务器的域名,nginx 判断请求 IP 段,如果是自己家宽带的就 301 到内网的 IP 地址或者 301 到解析到内网 IP 的域名。 如果是其他情况就 301 到 DDNS 绑定的公网 IP 域名:端口。

    当然前提也有点苛刻,需要有云服务器,需要自己家宽带的 IP 在某一个范围内。
    没有实验过,只是靠脑子想的,不知道是否可行。
    Jacksu
        5
    Jacksu  
       118 天前
    你没有其他网络设备,但是你有群晖是吧?群晖上搭建一个内网 DNS 服务器就行了,1 楼的就行,docker 安装。实在不想 docker 也可以群晖自带的 DNS 服务器配置一下就好,然后把家里路由器的 DNS 服务器设为群晖上的就好。
    ikn0wzxc
        6
    ikn0wzxc  
       118 天前
    路由器的问题?我用的 r2s ,内网也能通过域名访问
    titanium98118
        7
    titanium98118  
       118 天前
    在内网 DNS 劫持一下?
    1if5ty3
        8
    1if5ty3  
       118 天前
    1 、路由器 端口映射有个端口回流功能,打开就好了
    2 、在路由器加主机 host
    AirBai2
        9
    AirBai2  
       118 天前
    家里局域网搭一个 dns 服务器,群晖上有现成的套件
    jst0701
        10
    jst0701  
       118 天前
    说下我的方案吧,有公网,但不想开那么多端口,我是在 nas 搭建了一个服务端,然后在 qx 添加了一个 ssid 的策略组,根据 wifi 名称判断分流策略,连上家里的 wifi 就直连,在外面就通过 ss 回家,在家和在外面都是直接用 ip 访问,我感觉现在挺好的,家里的摄像头我也不需要开外网了,随时随地直接用 ip 访问
    yc8332
        11
    yc8332  
       118 天前
    路由器上绑定 host 。。直接把你的域名解析成内网地址不就好了
    ZRS
        12
    ZRS  
       118 天前 via iPhone   ❤️ 1
    正确配置 hairpin nat
    tsvico
        13
    tsvico  
       118 天前   ❤️ 1
    外网域名正常解析,我的 openwrt 上有 dnsmasq ,这么配置的
    ```sh
    vim /etc/dnsmasq.conf
    # add
    address=/xx.xx.cn/192.168.1.2
    ```
    libook
        14
    libook  
       118 天前
    你需要在家庭网络内让客户端直接连 NAS 而不是从路由绕一下是吧?

    这样的话就是需要你域名在家庭网络内解析到你 NAS 的内网 IP 上,思路就是你内网有个 DNS 服务器,让这个 DNS 将域名解析到 NAS 的内网 IP ,然后客户端在家庭网络内使用这个 DNS 来解析域名。

    你看看路由器支持不支持手动添加 DNS 记录,不支持的话就内网找台可以一直开机且稳定的设备装个可以自己配置解析记录的 DNS 服务,然后在路由器上设置 DHCP 的 DNS 地址为那台 DNS 设备的 IP 。
    itskingname
        15
    itskingname  
    OP
       118 天前
    @silverwolf 这样需要有地方运行 adguard home 吧。但是电脑并不是 24 小时开机。
    itskingname
        16
    itskingname  
    OP
       118 天前
    @lff0305 手机上不好改 hosts 文件
    itskingname
        17
    itskingname  
    OP
       118 天前
    @Jack927 如果我把电脑带到外面去,要访问 nas 还得把 hosts 改回来
    itskingname
        18
    itskingname  
    OP
       118 天前
    @Jacksu 本来就是因为连不上群晖才提的问题。但是你的解决方法是先要连上群晖。。。
    itskingname
        19
    itskingname  
    OP
       118 天前
    @libook 目前能够一直开机的就是群晖,没有其他能一直开机的设备。但我的需求本来就是在内网使用域名连接群晖。。。
    littlewing
        20
    littlewing  
       118 天前
    hairpin nat
    yinft
        21
    yinft  
       118 天前
    路由器加主机 host, 我家小米的路由器支持
    beyondstars
        22
    beyondstars  
       118 天前
    在家的时候用你本地电脑 mtr 那个公网 IP 试试看看输出,另外不知道是否方便提供一下网络拓扑(包括群晖接的是光猫 LAN 口还是路由器的 LAN 口,光猫是否工作在桥接模式,各个机器的 IP 地址等)。
    desperadoo
        23
    desperadoo  
       118 天前
    是不是使用 IPv6 可以避免内网访问失败的问题
    itskingname
        24
    itskingname  
    OP
       118 天前
    @beyondstars 光猫是路由模式,路由器在光猫下游是桥接模式。群晖插在光猫 LAN 口。手机连接的路由器的 wifi 。
    x86
        25
    x86  
       118 天前
    host 最简单了
    villivateur
        26
    villivateur  
       118 天前
    家里的路由器 DNS 把 NAS 域名解析到内网地址即可,我一直这么用
    peasant
        27
    peasant  
       118 天前
    跟 OP 的用法刚好相反,域名设置的是内网 IP ,在外面需要连的时候就打开代理软件,代理软件添加了 DNS 映射,老家是用的自建 DNS 设置了 DNS 重写, 设置的从外网访问 NAS 必须域名正确才能访问,这样别人只知道域名或者 IP 的其中一个是连接不到 NAS 的
    IvanLi127
        28
    IvanLi127  
       118 天前 via Android
    路由器里直接配 hosts 就行,现在品牌路由器很多都在 web ui 提供这个配置功能,可以看看你的有没有
    flyinghigherair
        29
    flyinghigherair  
       118 天前
    为什么不换一种思路,在外面直接访问 nas 的内网地址?我是在群晖上自建 wireguard ,在公司时在 clash 上添加好家里的 wg ,浏览器上一样内网地址访问 nas 或其他内网 ip 的设备
    libook
        30
    libook  
       118 天前
    @itskingname #19 不冲突啊,只要你内网群晖是固定 IP ,你就可以在主路由的 DHCP 上配置 DNS 服务器地址为群晖的内网 IP 。
    你的设备进行 DNS 解析的时候是路由 DHCP 直接告诉你群晖的 IP 的。

    不过这就会有个问题,就是你折腾群晖的时候(比如重启)可能会导致 DNS 暂时不可用,这也就是为什么我建议整个稳定的设备跑 DNS ,你可以看看一些便宜的盒子或开发板啥的。
    libook
        31
    libook  
       118 天前
    看了你的附言,实际上这一点都不奇怪,因为使用 DNS 服务器解析域名和使用域名访问群晖服务是两码事,是你自己没有转过弯来。

    不会因为你把群晖的域名解析记录配置到群晖上的 DNS 就导致无法解析了,因为你需要在主路由上配置群晖的固定 IP 的,这个 DNS 提供服务的过程是不需要域名参与的。

    或者说,你可以将 DNS 服务器看作一个抽象的独立服务器,只是实际上跑在群晖硬件上而已,如果你将来有其他可以长期运行的设备,可以随时将 DNS 服务器移到其他设备上。
    qinrui
        32
    qinrui  
       118 天前
    我的情况和你类似,域名通过 DDNS 功能指向路由器,路由器设置端口转发,3389 转 NAS 的 3389

    效果是无论从外网还是内网访问 域名:3389 ,都可以正常打开 NAS 的远程桌面
    Cambra1n
        33
    Cambra1n  
       118 天前
    我把 PC 远程桌面+群晖管理页面/jellyfin 这三个端口全交给路由器转发,路由器上部署 ddns 。
    hcocoa
        34
    hcocoa  
       118 天前
    @tsvico #13 我也是这么干的,但是 OP 的路由器不一定支持
    sujin190
        35
    sujin190  
       118 天前
    其实 ddns 的公网 ip 是路由,路由开启端口转发外围可以内外不可以,其实是端口转发一般只是目的地址重写,源地址是内外的时候还需要执行源地址重写为路由 ip 才正常,可以看看路由是否支持开启 nat 回环源地址重写,不支持的话估计就是楼上说的不同 dns 了

    openwrt 的话在配置端口转发高级里有个启用 nat 回环的配置,勾上就好了,不过这货似乎如果重新拨号不能自动更新,需要停用端口转发再启用端口转发一次才好,所以我都是另外再单独建一条 nat 规则执行 lan 源地址重写
    itskingname
        36
    itskingname  
    OP
       118 天前
    @flyinghigherair
    @peasant

    在外面不一定能用自己的电脑。这样没有 vpn 就无法连接了。
    IMengXin
        37
    IMengXin  
       118 天前
    我用的 ikuai ,里面有个 DNS 反向代理,配置域名和内网 ip 就可以了
    loocao
        38
    loocao  
       118 天前
    @flyinghigherair +1 ,如果不是需要提供外网直接访问的东西话,我觉得这种方案是最安全的而且方便的,就像直接在家里一样访问内网任何 ip ,不过我是直接使用 wireguard 官方客户端,不是 clash
    silverwolf
        39
    silverwolf  
       118 天前
    @itskingname 既然你群晖不关机,就是 #30 #31 说的这样,自个琢磨吧~
    ColinWang
        40
    ColinWang  
       118 天前
    NAT 回流或者 DNS 重写。
    ilaipi
        41
    ilaipi  
       118 天前
    @IMengXin #37 奇怪,我用 ikuai 配置了反向代理,ping 的时候显示的是内网 ip ,但是浏览器里访问的时候,看 network 显示的 Remote Address 竟然是外网 ip😂
    xuan_lengyue
        42
    xuan_lengyue  
       118 天前
    我用的 ss ,DNS 的 A 记录是内网地址,外网走软件的域名策略。
    BeautifulSoap
        43
    BeautifulSoap  
       118 天前 via Android
    组个 tailscale 就解决的事哪需要折腾 dns

    tailscale 会自动给你判定最合适的路由。唯一问题就是手机上 tailscale 需要占用 vpn
    zsan3653nj
        44
    zsan3653nj  
       118 天前
    内部 用 内部的 dns 就 ok

    dnsmasq
    IMengXin
        45
    IMengXin  
       118 天前
    @ilaipi 刚刚看了下,我浏览器里显示的也是内网 ip
    lonely701
        46
    lonely701  
       118 天前 via iPhone
    路由器是什么品牌的?华硕路由器在防火墙设置页面打开 NAT Loopback 即可。多数路由器都有这个功能,可能在防火墙设置页面。
    isbase
        47
    isbase  
       118 天前 via iPhone
    surge ponte 自带这个功能
    bs10081
        48
    bs10081  
       118 天前
    好奇這個問題為什麼會發生,我家用的是 ISP 給的數據機和 Router ,用 domain 在外面當然就是走外網,但是回到家以後,就會走局域網,感覺這個應該是正常的事情吧? DNS 解析的問題?好奇
    54xavier
        49
    54xavier  
       118 天前
    我局域网有软路由,可以在软路由加 host 解决这个问题
    e3c78a97e0f8
        50
    e3c78a97e0f8  
       118 天前   ❤️ 1
    你用 IPv6 就行了,我就是这么干的。
    zhl
        51
    zhl  
       118 天前
    如果是光猫做路由不好解决,如果是桥连还可以折腾好。
    zwlinc
        52
    zwlinc  
       118 天前   ❤️ 2
    我这里也可以提供一个思路,如果你用 tailscale 这样的组网工具的话,大可以全部解析到 tailscale 内部的 IP 上,tailscale 会自动“打洞”,在家就是走局域网,在外面就可能直连或走中转,这样就提供了一种统一的访问方法。等于说 tailscale 建立了一个 overlay network ,不用管底层到底如何连接。至于说 tailscale 在内网也走了 wireguard 加密等,这里面牺牲的一点性能在便利面前我认为是微不足道的。
    nxuu
        53
    nxuu  
       118 天前
    群晖上把 ddns 弄好以后 在路由器上加一个 host 在外面就走公网 ip 访问群晖
    在家就是走内网 ip
    没办法在路由器上加 host 也可以在本地电脑上加 host
    Yuhyeong
        54
    Yuhyeong  
       118 天前
    路由器没有带路由回流
    改路由的 host 或者自建 dns ,别奇怪不奇怪,都是这么整的,不行你域名绑 ipv6 ,直接一步到位。
    Kimyx
        55
    Kimyx  
       118 天前
    另外一种,DDNS 旁边的 QuickConnect 功能也可以实现,不需要额外设置
    Hengtang
        56
    Hengtang  
       118 天前
    群晖建一个 DNS 服务器,路由器 DNS 指向群晖,DNS 里面重写域名对应地址到群晖局域网 IP 。你回复 5 楼说的“本来就是因为连不上群晖才提的问题。但是你的解决方法是先要连上群晖。。。”完全是你自己不动脑子,这个连上群晖本身就是从路由器到群晖的局域网,直接用局域网 IP 就行了,怎么可能连不上。
    路由器支持修改 hosts 就直接修改
    itskingname
        57
    itskingname  
    OP
       118 天前
    @Kimyx 群晖官方发布公告了,quickconnect 不再支持直链,一定要走中继。如果想直连需要用 ddns
    itskingname
        59
    itskingname  
    OP
       118 天前
    @Hengtang 你把钥匙忘在房间了,你需要先翻窗进房间,拿到钥匙以后,再翻出来,然后用钥匙开门进房间。

    你这个方案,需要先让手机通过群晖的内网 IP ,连到群晖的 DNS 服务器上面,然后查到我这个域名在内网对应的 IP ,把这个 IP 返回给手机,然后手机再连这个 IP 。

    我在猫和老鼠里面看到过这个剧情
    laox0
        60
    laox0  
       118 天前
    NAT 环回问题 OPwrt 可以设置,普通路由器估计不行,试试写一个局域网导航页呢,我设置的点击名称打开内网地址,点击右边图标打开外网地址
    bg7lgb
        61
    bg7lgb  
       118 天前
    hairpin nat ,需要路由器支持。

    在 RouterOS 上通过设置两条 Nat 规则 实现。
    LoNeZ
        62
    LoNeZ  
       118 天前
    太麻烦了感觉直接解析到 tailscale 这之类的 ip 就好了, 透过 tailscale 直接访问
    Laoz666
        63
    Laoz666  
       118 天前
    说实话 威联通自然实现了 他先访问的外网,检测到在内网的时候会自己切换内网的地址
    wheat0r
        64
    wheat0r  
       118 天前
    @itskingname #59 这根本不是什么回家取钥匙的问题,DNS 服务器可没规定自己必须运行在群晖上,你大可以装一台机架服务器放在家里跑 DNS
    itskingname
        65
    itskingname  
    OP
       118 天前
    @laox0 群晖的 app 需要连
    itskingname
        66
    itskingname  
    OP
       118 天前
    @wheat0r 就是因为家里没有其他设备 24 小时开机,否则我直接搭建一个软路由就解决了
    bobryjosin
        67
    bobryjosin  
       118 天前 via Android
    看下来你需要一种合理优雅且简单的办法,不能路由器回流也不想用 vpn 和 dns ,那就只剩类似 zerotrust tunnel 或者 vps 全部走中转吧,最麻烦且合理办法。
    wheat0r
        68
    wheat0r  
       118 天前
    @bg7lgb #61 我一直觉得 Hairpin NAT 是没办法的办法,产生不必要的路径和 NAT 压力
    kome
        69
    kome  
       118 天前
    1. 添加两条 DDNS 记录,一条公网 IPv4 ,一条内网 IPv6 ,是否可行不清楚
    2. 搭建内网 DNS ,DHCP 分发 IP 的时候直接分发内网 DNS 地址,不再分发公网 DNS
    3. 只做 IPv6 的 DDNS
    sundev
        70
    sundev  
       118 天前
    这个目前两种方案:
    1. 内网布置 dns 服务器,将这个域名解析到内网 ip
    2. 设置路由器的 NAT ,关键词:NAT 环回、端口回流、hairpin nat

    这两种时完美方案,其他方案都不完美
    sundev
        71
    sundev  
       118 天前
    @sundev #70 这个问题的本质是路由器(网关)在进行 NAT 的时候没有进行 SNAT ,NAS 返回的数据包没有经过网关,直接发送到终端上,终端不认识该数据包,所以被丢弃。
    totoro625
        72
    totoro625  
       118 天前
    surge
    判断是否处于局域网,自动切换
    YoukuShow
        73
    YoukuShow  
       118 天前
    只要你能拿到联通送的光猫的管理员权限就可以设置。
    1 ,买个域名,比如:yyy.cn ,把 synology.yyy.cn 指向自己家
    2 ,登录光猫:a. 把本地网络域名设置为 yyy.cn ; b. 群晖的 ip 给个 hostname ,比如:synology
    3 ,内网用 synology.yyy.cn:5000 (或者 5001) 就能访问到了
    4 ,登录光猫:允许端口 5000 (或者 5001) 的数据转发去群晖

    这样家内外都能用 http://synology.yyy.cn:5000 访问了。
    Puteulanus
        74
    Puteulanus  
       118 天前
    其实 DNS 的解决办法好一些,你回家了还用公网 IP 访问 NAS ,肯定至少得到路由器走一圈,你要光猫没改桥接甚至还得去光猫上转一圈,但是走内网 IP 可能走硬件交换芯片/交换机直接就通信了

    而且断网的时候 DNS 那个方案你是依然能在内网用域名访问到 NAS 的

    这个过程复杂是你自己想象出来的,实际上走公网 IP 才是影响更大的那个方案。。
    afirefish
        75
    afirefish  
       118 天前
    送的路由器支持改 host 的话,直接在上面指定域名解析记录为内网地址。不支持的话,换个支持 openwrt 的路由器。( wr30u ,150 块)
    woody3rd
        76
    woody3rd  
       118 天前
    花哨
    mikasa1024
        77
    mikasa1024  
       118 天前
    之前也有过类似的问题

    我家里的宽带没有公网 IP ,利用云服务器搭建了 tailscale 在外面访问家里的群晖。这样一来,家里局域网环境下群晖 IP 是 192.XXX ,外面使用 tailscale 访问的群晖 IP 是 10.XXX ,导致手机上的一些群晖 APP 来回改地址。

    至于为什么在家里不用 tailscale 的 IP 访问群晖,是因为不想时刻开着 tailscale ,而且局域网中手机挂着 VPN 访问局域网设备也有点奇怪

    看了楼上的一些回复,感觉可以这样解决:
    域名指向 tailscale 群晖 IP ,同时家里路由器上设置 hosts 使局域网中域名指向 192.XXX ,就可以一直使用一个域名访问,但是如果路由器不支持设置 hosts 就不好弄了
    Jack927
        78
    Jack927  
       118 天前   ❤️ 1
    看了 op 的回复和附言,去了解下基础的网络知识吧。

    > 我知道可以群晖搭 DNS ,然后使用自己的 dns 服务器。 然后 xxx 但是这样做非常奇怪。

    你的需求是,“使用这个域名,无论在外网还是内网均能访问群晖”,那么域名解析经过 dns 有啥好奇怪的呢? 域名不经过 dns 解析才奇怪呢。
    dasf53adf
        79
    dasf53adf  
       118 天前
    NAT 回源,OPENWRT 有这个选项,如果找不到就手动加一个 SNAT ,目标地址是这个内网服务器的内网地址,然后源是同段地址,源地址转换为网关地址。或者用伪装。
    Jack927
        80
    Jack927  
       118 天前
    自建 dns/dns 重写的的情况下:
    外网:dns 正常解析到 ddns 的 ip , 能访问。
    内网: 走自己的 dns ,直接解析到内网 IP ,能访问。
    dasf53adf
        81
    dasf53adf  
       118 天前
    NAT 回源,NAT 回环,NAT 回流,找这三个关键词有选项就打开。如果没有就需要在做 IP 映射的网关上配置 SNAT 解决。不需要 DNS 服务器,太麻烦了。。。
    dasf53adf
        82
    dasf53adf  
       118 天前
    @Jack927 这是一个经典的 TCP 连接问题,甚至有专门的名词,NAT 回流,NAT 回环,NAT 回源。。。 用不到 DNS 的。做 SNAT 就可以。(源:服务器网段,目标:服务器局域网地址,转换为:网关地址)
    mohumohu
        83
    mohumohu  
       117 天前
    DNS 明明就是最优解,哪里奇怪了,DHCP 可以设置下发什么 DNS ,DNS 在你那个 NAS 也是 24 小时跑,不是已经满足了需求了吗?很多大企业也一直是这么干的,内部域名有专用的解析,建议 OP 补一下 DNS 知识。
    itskingname
        84
    itskingname  
    OP
       117 天前
    @Jack927 #78 你可能看漏了。解析域名经过 DNS 不奇怪。奇怪的是 DNS 服务器运行在我即将需要访问的这个机器上。

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

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

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

    假设有下列环境:

    - 外网主机 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
        94
    Jack927  
       117 天前
    @itskingname #90 不, 你没有。你如果内网使用 ip 访问,那就不会有你提出的问题了。 内网即然使用域名访问,那么域名的记录权威的解析是你的 ddns 的外网 ip ,你需要自己的 dns 重写为内网的 ip 。 必然要 dns 的,自己群晖上搞个有问题么?
    如果你接受不了自己 dns 重写的这个结果,更高级和底层的方案就是也有不少人在说的 NAT 回环了
    lxxself
        95
    lxxself  
       117 天前
    @flyinghigherair #29 +1 直接就 clash 配置规则上外网和 ss 回家
    Puteulanus
        96
    Puteulanus  
       117 天前
    如果你的路由器支持直接改 hosts (影响 dnsmasq 解析记录),那你直接改 hosts 让域名生效;

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

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


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

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

    重定向 Synology.me ,简单粗暴。
    Surge 等代理软件,当识别到某 Wi-Fi 时,自动启动模块或配置文件,把域名重定向内网。
    Surge Ponte 代理内网,简单粗暴解决部分问题。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5409 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 07:10 · PVG 15:10 · LAX 00:10 · JFK 03:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.