如何将 LAN 中设备发往公网指定 domain:port 的 HTTPS 请求重定向到 LAN 中指定设备的 ip:port

2021-02-26 02:30:00 +08:00
 dLvsYgJ8fiP8TGYU

背景: 家中运行一台 NAS,为实现从公网(使用移动数据)访问,已通过一台拥有公网 IP 地址的云服务器配置端口转发服务,并申请了域名及 SSL 证书,目前运行良好。

用 PPT 画了个网络拓扑: https://i.imgur.com/0yGEJ6C.png

在外面使用移动数据连接家里的 NAS,需要访问云服务器的指定端口(示例: https://nas.example.com:12345 ),在这一过程中需要消耗云服务器的流量(废话)。

如果我回到家里,在局域网中访问上述 domain:port,依然可以成功连接 NAS,但还是需要消耗云服务器的流量。这部分流量其实消耗的有点冤,毕竟已经在同一个 LAN 里面了,按理说可以直连的。这样子不但多交钱,延时也增加了。

问题: 是否可以通过某种方式在局域网中重定向发往 nas.example.com:12345 的请求,使其无需经由云服务器中转而直接发往局域网中的 NAS 的指定端口?

  1. 尽可能避免用户在设备端进行操作,如记住不同的 ip:port,在网络环境变化时手动输入(可行,但用户操作不便,排除)

    • 我个人其实无所谓,主要是考虑到家里其他人不太懂计算机 /网络这块,
  2. 已经尝试过以下方案,效果均不好

    • 修改 hosts
      • 在 iOS 设备基本不可行,且离开局域网即失效
    • 在 NAS 上搭建基于 AdGuard 的 DNS 服务器
      • 在网络环境变换时,比如出门 /刚回家,可能是由于 DNS 缓存,不能实现无缝无感切换
      • 改 DNS TTL 有用吗?
  3. 可能可行的其他方案?

    • 路由器设置策略路由或其他某种设置
      • 对现有硬件改动最小。TP-LINK 企业级路由器,不清楚是否支持这样操作
    • 新增一个软路由?
    • 在 iOS 上运行某种支持通过判断当前 SSID 并修改请求的软件?
  4. NAS 用的是群晖,5001 是 HTTPS 端口

  5. 如果能实现 IP 地址重定向,但无法同时实现端口重定向,可妥协

    • 在 NAS 也开启 12345 端口,与云服务器端口号实现同步,并允许相应服务使用此端口
    • 云服务器端口需保持至少 10000+ 高位,以保证安全
4305 次点击
所在节点    NAS
43 条回复
learningman
2021-02-26 02:46:40 +08:00
可以,iptables SNAT 和 DNAT,DNS 管不了端口的
f165af34d4830eeb
2021-02-26 02:52:44 +08:00
常见的手段就是内网 dns 劫持和 ip 重定向。感觉这篇文章应该可以帮到你。

https://www.zhoujiangang.com/p/iptables-redirect-ip/
f165af34d4830eeb
2021-02-26 03:09:41 +08:00
额外说一句,保证安全可不是靠高位端口这种野路子,外网访问内网走 vpn 更稳妥,不建议把私人 web 服务暴露在公网上。
Niphor
2021-02-26 04:00:50 +08:00
你路由器 host 里加一条,像 op 的话直接加 dnsmasq 里
ysc3839
2021-02-26 04:13:14 +08:00
nas.example.com 解析到云服务器,然后在路由器上修改 hosts 让 nas.example.com 指向 NAS 不就好了吗?为什么离开局域网失效不可行?你离开了局域网不是要走云服务器吗?
Sylv
2021-02-26 06:29:34 +08:00
首先路由器得支持 dnsmasq (我是华硕路由器刷了梅林系统)。

然后 ssh 到路由器上。

编辑 dnsmasq 配置文件:
vi /jffs/configs/dnsmasq.conf.add

加入将 NAS 域名解析到内网 IP 的规则,例如:
# NAS
address=/mynas.com/192.168.1.10

然后重启 dnsmasq:
service restart_dnsmasq

这样一来,内网访问 mynas.com 时就会通过路由器 dnsmasq 解析为内网 IP 192.168.1.10 ,直接内网访问 NAS,不需要出去外网再绕回来;外网访问时还是解析为外网 IP 。
soulzz
2021-02-26 08:54:56 +08:00
@Sylv 楼主说的是 dns 缓存的问题,切换网络时会造成体验中断,你这种和用 adguardhome 没区别

建议楼主向 isp 要一下动态公网 ip 做一下 ddns,不行的话考虑换个运营商
weyou
2021-02-26 09:19:49 +08:00
在路由器上将所有的 DNS 请求强制重定向到自己的 DNS 服务器可以解决缓存的问题。
比如在 Openwrt 路由上可以设置 Firewall Custom Rule:
iptables -t nat -I PREROUTING 1 -i br-lan -p udp --dport 53 -j DNAT --to-destination <自己的 dns ip 地址>:53
weyou
2021-02-26 09:23:38 +08:00
会错意了,上述并不能解决已解析好的域名地址缓存
tankren
2021-02-26 09:26:37 +08:00
在家直接用局域网 IP 访问不就好了?自己给自己找麻烦
tankren
2021-02-26 09:27:00 +08:00
如果实在记不住 自己做一个导航页
locoz
2021-02-26 09:37:22 +08:00
内外网访问时,端口是否相同?如果相同的话,直接在路由器端做内网 dns,然后外网通过 vpn 连接回来,百分百无感切换。
hjylxmhzq
2021-02-26 09:53:03 +08:00
可以用 iptables 试试,如果只用网页端的话也可以做个跳转页
Slin
2021-02-26 10:22:52 +08:00
改下 host 文件不就行了吗 或者在 nas 搭建一个局域网 dns 服务
在家你的域名会被解析成局域网 ip,如果你就固定一台电脑使用 直接改 hosts 就行了
Slin
2021-02-26 10:26:36 +08:00
看了你后面说的问题,我没有遇到过, 你在切换网络环境 用 dig 命令, 测试下域名解析情况
Slin
2021-02-26 10:30:57 +08:00
@tankren 这种需求很常见,如果你使用 客户端填写 服务的访问地址,你就需要使用域名,内外网环境切换方便,不一定是 用在浏览器。
la0wei
2021-02-26 10:45:38 +08:00
我有类似的经验,前两天刚刚搞定。家里的 n2n 今早挂了,无法连上去看配置,我回忆下配置。
需要的设备:能自定义 hosts 的路由器一台,linux 设备一台或 linux 虚拟机,nas 如果能安装 haproxy 也行。

路由器配置:192.168.1.10

linux 设备:安装 haproxy,frontend 中 bind 端口 12345 。backend 中 server 指向 192.168.1.10:5001

原理:访问 nas.example.com:12345 时,路由器解析到 linux 设备的 ip,而该 ip:12345,则是反代的 192.168.1.10:5001 。

优势:无需改其他设备的配置,比如端口之类的。上面几个回答都解决了 ip 的问题,但是没解决端口的转换。
la0wei
2021-02-26 10:47:02 +08:00
#17 有误,应为 路由器配置:192.168.1.10 nas.example.com
la0wei
2021-02-26 10:49:02 +08:00
另外说一句,你画的 ppt 还怪好看的
tankren
2021-02-26 11:18:53 +08:00
@Slin #16 那倒是 不过楼主这种情况只能统一局域网端口和转发端口然后加上网关 DNS 覆盖才能比较完美的实现 有些人性化的客户端可以配置两套服务端信息 当连入指定 WiFi 时走局域网 IP

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

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

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

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

© 2021 V2EX