如何使用 iptables 重定向正在监听的 IP 和端口?

如何使用 iptables 重定向正在监听的 IP 和端口?

我有一台有两个外部 IPv4 地址的服务器。其中一个地址基本上没用,因为它没有出现在任何 DNS 中,我也没有用它做任何事情。我现在想使用端口 80,但我正在该机器上使用 Web 服务器 (lighttpd),该服务器监听 0.0.0.0:80,很难让它停止监听,否则会产生不愉快的后果(要么我失去让它监听 127.0.0.1 的功能,要么必须完全重写它的所有配置,不使用任何全局设置)。

有没有更简单的方法?我可以将“未使用”IP 上的端口 80 转发到其他地方,以便堆栈在数据包到达监听 lighttpd 之前将其转移?我希望通过同一台机器上的 VPN 适配器转发它:

服务器:

Public IP1 on eth0 = 55.66.77.8
Public IP2 on eth1 = 55.66.77.10
Wireguard IP on wg = 10.20.2.1

Lighttpd listening on 0.0.0.0:80

我可以从 Lighttpd 监听中转发 eth1 55.66.77.10:80-> wg 吗?10.20.2.15:8080

我试过:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 10.20.2.15:8080
iptables -t nat -A POSTROUTING -p tcp -d 10.20.2.15 --dport 8080 -j SNAT --to-source 10.20.2.1

...正在通过 VPN 转发同一台机器上的其他端口。但在这种情况下,telnet 55.66.77.10 80仍然到达 lighttpd,并且不会被转发。

答案1

lighttpd 套接字从全局范围继承,因此如果你的配置在全局范围内,那么你可以

server.bind = "55.66.77.8"
$SERVER["socket"] == "127.0.0.1:80" { }

你之前收听的地方"*:80"

如果您担心修改现有配置,您可以在末尾添加一个包含文件,并使用覆盖某些设置:=,例如 server.bind := "55.66.77.8"


iptables 的另一种解决方案是让 lighttpd 充当 10.20.2.15:8080 的反向代理,使用lighttpd mod_proxy. 如果监听端口 443,lighttpd 也可以执行 TLS 终止。

相关内容