1. 라우터의 DNAT

1. 라우터의 DNAT

프록시에서 nginx로 포트 80을 전달하고 원래 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

예를 들어, 웹 브라우저(로컬 IP: 192.168.103)를 열고 주소 필드에 192.168.0.104를 입력하면 기본 Nginx 웹 페이지가 나타납니다. Nginx 로그에서 "192.168.0.103 -- [06/Nov/2022:19:10:38 +0600] ..."과 같은 내용을 보고 싶습니다. 여기서 소스 IP는 원본으로 유지됩니다.

프록시 VM(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

프록시 VM을 라우터로 구성합니다. 웹 서버의 모든 트래픽이 이 라우터(기본 게이트웨이)를 통과하도록 합니다. 다음은 라우터에 대상 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]

관련 정보