DNAT 到同一主机上的另一个隐藏端口

DNAT 到同一主机上的另一个隐藏端口

我希望使用 iptables 将到达公共 eth 接口(公共 IPv4 地址)上的特权端口的传入流量静默重定向到同一 ubuntu 框上的隐藏非特权端口。 ufw 防火墙处于活动状态。 当然还有其他选项,例如功能,或特权进程将流量复制到非特权端口,或特权进程在绑定后放弃其特权等,但对我来说,至少 iptables 似乎是最有吸引力的。

虚拟接口解决方案使用 iptables 将 DNAT 设置为 127.0.0.1 / 透明 SOCKS 代理的目标访问控制对我来说是完美的(一旦我在 ip add addr... 命令中插入一个额外的 'dev' 关键字)。除了一件事:

  • 我必须打开防火墙,以便让传入流量进入隐藏端口上的虚拟接口的 IP

据我所知,这允许其他人将传入流量直接发送到该 IP:端口,他们应该能够猜出大约 40 位的隐藏信息(私有 IPv4 地址 + 端口)。

是否有一种解决方案,使任何外部流量都无法到达该隐藏端口,除非原始目标 IP 是盒子的公共 IP,并且目标端口是特权端口?


[在日常用语中,虚拟接口解决方案就像让我的朋友来我的俱乐部,告诉他这里有一张 VIP 通行证,带它到后门,保镖就会让你进去。他当然可以进去,但其他人可能会试图用假通行证欺骗保镖。我可以陪同我的朋友到后门,告诉保镖他很厉害,然后和他一起进去吗?换句话说,我能否以某种方式标记这个 NAT 数据包,使其绕过防火墙规则?]

答案1

与此同时,我了解到,人们可以标记数据包(例如,如何在 nat 预路由表中转发数据包时设置标记?),还进一步了解了在什么情况下应用哪些 iptables 操作(https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture)。有了这些,解决方案就很简单了:

  1. 在/etc/ufw/before.rules中,添加一条 MANGLE 规则:
*mangle
-F
-A PREROUTING -p tcp -i eth0 -d 1.2.3.4 --dport 80 -j MARK --set-mark 0x401
COMMIT
  1. 在同一个文件中,将重定向插入到 NAT 表规则(*nat 部分)中,使用以下行
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
  1. 最后,将以下行插入到 FILTER 表 (*filter 部分) 的 ufw-before-input 链中
-A ufw-before-input -m mark --mark 0x401 -j ACCEPT
  1. 重启 ufw
services ufw restart

无需打开任何端口,传入 1.2.3.4:80 的数据包将被重定向到 1.2.3.4:8080,并明确通过防火墙。iptables 对数据包的操作时间顺序为:标记、重定向、放行。

答案2

您可以跳过虚拟接口并将此类流量重定向到本地主机 IP 地址。

在nat表中:

-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

然后,您告诉 ufw 允许流量到该端口,但仅发往本地主机 IP 地址。

sudo ufw allow to 127.0.0.1 port 8080 proto tcp

相关内容