如何使用 iptables 重定向到某个 URL?

如何使用 iptables 重定向到某个 URL?

我想将所有传入的请求重定向到 URL 而不是 IP 地址,我该如何存档它?当我使用 IP 地址重定向时,重定向正在发生,但重定向的 IP/URL 未显示在浏览器地址栏中。如何更改这种情况?

以下是我制定的规则,

echo "1" > /proc/sys/net/ipv4/ip_forward
ebtables -t nat -N GUEST
ebtables -t nat -A PREROUTING -i eth0 -j GUEST
ebtables -t nat -N GUEST-REDIRECT
ebtables -t nat -A GUEST-REDIRECT -j mark --mark-set 1 --mark-target CONTINUE
ebtables -t nat -A GUEST-REDIRECT -j redirect
ebtables -t nat -A GUEST -p 0x800 --pkttype-type otherhost --ip-proto 6 --ip-dport 80 -j GUEST-REDIRECT
iptables -t nat -A PREROUTING -p tcp -m mark --mark 1 -j DNAT --to-destination 172.40.1.0
iptables -t nat -A POSTROUTING -j MASQUERADE
  1. 客户端被重定向到 IP 172.40.1.0。但我想要的是将请求重定向到 URL[例如:www.facebook.com/user]。

  2. 当我使用上述规则时,客户端被重定向到 IP 172.40.1.0,但在浏览器的地址栏中仍然显示请求的 URL,而不是重定向的 URL。

答案1

如果你希望重定向的 IP/URL 显示在浏览器中,你需要发送HTTP 重定向响应给浏览器(如301)。然后,浏览器将向新位置发送另一个请求。

这无法使用 iptables 来完成。这需要使用任何 HTTP 服务器/负载平衡器/代理来完成。

答案2

您无法使用 iptables 执行此操作。您混淆了网络堆栈中的层:IP 是 OSI 模型中的第 3 层,HTTP 是第 7 层。请参阅http://en.wikipedia.org/wiki/OSI_model

如果您想重定向 URL 请求,您可以将 Apache 与 mod_proxy 一起使用。

答案3

我猜你需要将传入连接重定向到某个 Web 实例(例如 Nginx)监听的端口。然后 Nginx 必须将它们重定向到你的 URL。

# Redirect inbound TCP connections, destined to port 80, to port 4444
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:4444

Nginx 配置:

server {
  listen 127.0.0.1:4444;

  return 301 "http://example.com/notice/";
}

我能想到的你应该这样做而不是直接让 Nginx 监听 80 端口的唯一原因是,这个解决方案有助于使 Nginx 实例可热插拔,也就是说,你可以创建另一个 Nginx 实例(比如说/usr/local/nginx/bin/nginx)并监听 80 端口,而无需实际修改现有实例的配置(更具体地说/etc/nginx/sites-enabled/*),以替换现有的 Nginx 实例(比如说/usr/sbin/nginx)。

相关内容