1. 路由器上的 DNAT

1. 路由器上的 DNAT

我想将端口 80 从代理转发到 nginx 并保留原始 IP。我当前的结构:

在此处输入图片描述

Proxy vm(192.168.0.104) - VM with iptables that redirects all traffic from port 80 to 192.168.106:80  
Nginx vm(192.168.0.106) - VM with default nginx webpage on port 80

例如,我打开一个 Web 浏览器(本地 IP:192.168.103),在地址栏中输入 192.168.0.104,然后我得到了默认的 Nginx 网页。在 Nginx 日志中,我希望看到类似这样的内容:“192.168.0.103 -- [06/Nov/2022:19:10:38 +0600] ...”,其中源 IP 仍然是原始 IP

代理虚拟机(192.168.0.104)上的 Iptables 脚本

#!/bin/bash

IPT=/sbin/iptables

echo "Flushing Tables ..."

# Reset Default Policies
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT

# Flush all rules
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F

# Erase all non-default chains
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# apt install conntrack # if error 
conntrack --flush

IF_IN=enp0s3
PORT_IN=80

IP_OUT=192.168.0.106
PORT_OUT=80

echo "1" > /proc/sys/net/ipv4/ip_forward

$IPT -A PREROUTING -t nat -i $IF_IN -p tcp --dport $PORT_IN -j DNAT --to-destination ${IP_OUT}:${PORT_OUT}
$IPT -A FORWARD -p tcp -i $IF_IN --dport $PORT_OUT -j ACCEPT
$IPT -A POSTROUTING -o $IF_IN -t nat -j MASQUERADE

此配置允许我通过 192.168.0.104 从本地访问网页,但不保存我的原始 IP 地址。
有人知道如何使用这个技巧吗?

答案1

只有当您的代理也是您的默认网关或其他路由技巧时,才有可能使用 iptables 转发流量并保留客户端 IP(使用 DNAT)。

在我看来,您最合适的选择是:

1. 路由器上的 DNAT

将代理虚拟机配置为路由器。让所有 Web 服务器的流量都通过此路由器(默认网关)。接下来在路由器上设置目标 NAT

2. 使用 L7 代理

使用能够理解 HTTP 流量的第 7 层代理。(nginx、haproxy 等)此代理可以设置设置为原始客户端 IP 的 HTTP 错误。

nginx

将以下内容添加到您的配置中:

proxy_set_header   X-Real-IP          $remote_addr;

HAProxy

将以下内容添加到您的配置中:

frontend *your_frontend*
  option forwardfor header X-Real-IP
  http-request set-header X-Real-IP %[src]

相关内容