以前我家里内网有一台应用服务器对外提供服务,我的 OpenWrt 路由器上的配置就是 IPv4 做了一个端口映射到这台服务器上,IPv6 直接把 DDNS 指向这台服务器,并在路由器上开放相应的端口。完美。
最近对这台应用服务器做了拆分,拆成了多台 VM 在不同的 IP/端口上提供不同的服务。这时 IPv4 很容易解决,把相应的端口映射改到各台 VM 上就行。但 IPv6 不知道该怎么处理了,没有办法在路由上配置出类似 Iv4 的转发策略?
![]() | 1 bigfei 2024-10-06 10:00:24 +08:00 via Android ![]() ipv6tables 也是可以 redirect 的 |
2 rulagiti 2024-10-06 10:33:36 +08:00 基本上 ipv6 能做的 ip6tables 都能做 |
![]() | 4 blueboyggh 2024-10-06 10:40:22 +08:00 via Android 你的多台 vm 没有自己的 v6 地址吗? |
![]() | 6 lifanxi OP @blueboyggh 有的,每台都不一样。但是如果用 DDNS 的方案,那就要绑定到几个不同的域名上,我还是希望通过一个域名用不同的端口访问到不同的服务。 |
7 zbinlin 2024-10-06 11:00:45 +08:00 openwrt 不是支持 {hostname}.lan 来访问内网主机吗,你直接在 openwrt 做一个服务转发,然后根据不同的子域名转发到对应的主机服务上不就行了? |
![]() | 8 feng0vx 2024-10-06 11:05:03 +08:00 via iPhone */10 * * * * logger -t 'ddns' `wget -q -O - "https://ipv4.dynv6.com/api/update?hostname=z.dynv6.net&ipv4=auto&token=z"` */10 * * * * logger -t 'ddns' `wget -q -O - "https://ipv6.dynv6.com/api/update?hostname=z.dynv6.net&ipv6=auto&token=z"` |
![]() | 9 feng0vx 2024-10-06 11:07:10 +08:00 via iPhone 另外设置防火墙 ipv6 入站 rules |
![]() | 10 feng0vx 2024-10-06 11:37:49 +08:00 不好意思没看全,此上三层请忽略~ |
![]() | 11 lentrody 2024-10-06 11:40:37 +08:00 via Android ![]() IPv6 时代的正确习惯就是给每台设备分配子域名。 在一台设备上跑 DDNS 脚本就同时更新所有同网关下设备的 IPv6 地址,只要设备的 IPv6 地址是固定后缀就行。 可以这样本地拼接再提交 https://github.com/ddnspod/dnspod-ipv6-ddns/blob/master/dnspod-ipv6-ddns.sh 也可以提交后让服务商自己拼接 https://dynv6.com/docs/apis |
![]() | 12 blueboyggh 2024-10-06 11:45:21 +08:00 via Android ![]() @lifanxi 那你主路由装个 lucky 就好了,端口转发工具,支持 v6 转发,主路由如果装不了软件,就找其中一个 vm 装,然后 ddns 绑定到这个 vm |
13 A1188 2024-10-06 12:43:00 +08:00 via Android ![]() 试试 Socat ? |
![]() | 14 SenLief 2024-10-06 15:14:39 +08:00 这个内网装个反代就可以了 nginx caddy 什么的都行,或者直接用 socat 链接两个端口。 |
![]() | 15 lifanxi OP @blueboyggh @A1188 @SenLief 谢谢建议,反代或者转发是最后一条路,如果能直连我还是倾向于直连。因为毕竟多跳了一下,多增加了一个不稳定因素。 目前试下来,@bigfei 说的直接配端口射映貌似是可以,我在 OpenWrt 上配置 DNAT 到另一台机器的 IPv6 地址是可以的。不过,如果用公网 IPv6 地址前缀会变,它貌似不支持动态前缀的写法,我还在继续试验改成用 ULA IPv6 地址试试。 |
16 bobryjosin 2024-10-06 19:31:40 +08:00 你的需求不就是 ipv6 nat ? nat 后就和 ipv4 一样可以端口映射了,内网每台机器和路由上都配一个静态的内网 ipv6 地址,有公网地址的路由上做一个 DNAT 不就行了,这样就不需要管前缀了。 |
17 dislike 2024-10-06 19:52:21 +08:00 用 socat 吧,主路由 ipv6 做 DDNS,然后把各个端口分别用 socat 映射到内网各 VM 的 ipv4 地址就可以了,这样内网的 V4 地址固定,更容易管理. |
![]() | 19 flynaj 2024-10-07 02:10:14 +08:00 via Android openwrt 里面的 socat 可以满足你,可以 v4 ,v6 互相转换,也可以转发。 |
![]() | 20 momo65535 2024-10-07 08:24:59 +08:00 安装 socat |
21 maybeonly 2024-10-07 10:28:34 +08:00 ![]() 对于 tcp 和 udp ,ip6tables 可以实现和 iptables 一样的 nat 。 对于 http 类服务,根据需求,还可以选择 http 代理的模式做反向代理。 以及,建议还是用不同的域名区分不同的服务,毕竟就算是 ipv4 ,也可以用 host 区分( http 服务),就算不同的域名也可以加端口。 |
![]() | 22 lifanxi OP 感谢楼上各位。 这几天试了各位推荐的各种方法,都可行: 1. 直接像 IPv4 一样端口映射:直接在 OpenWrt 的 LuCI 上就可配置。对于动态 IPv6 前缀会变的情况,可以用 SLAAC+ULA 的固定地址做转发。 2. 用 socat 转发:最灵活简单的一种做法。 3. 用 nginx 等搭反向代理:不过我不喜欢这个方式,因为多了一层七层的转发,重。 4. 为每台设备单独绑定 DDNS 域名:最直接的做法。 虽然一开始我想要的 1 、2 、3 的效果,但是一圈实践加上仔细思考后,我最后还是决定用 4 的方案,这样各种应用相互隔离,以后如果想再迁移服务器等,改动最小。 |
![]() | 23 godall 2024-10-09 14:29:41 +08:00 ipv4 端口转发的原因是 ip 地址有限,所以要端口复用。你 ipv6 了 ip 地址无限了,直接 ip6:PORT 访问就可以了,干嘛还要去转发呢?多此一举,且降低性能。 |