Назад | Перейти на главную страницу

Сохранить исходный IP-адрес после NAT

До сегодняшнего дня я использовал дешевый маршрутизатор, поэтому я могу поделиться своим подключением к Интернету и сохранить веб-сервер в сети, используя NAT. IP-адрес пользователей ($ _SERVER ['REMOTE_ADDR']) был в порядке, я видел IP-адреса пользователей класса А.

Но поскольку трафик рос с каждым днем, мне пришлось установить Linux-сервер (Debian), чтобы поделиться своим подключением к Интернету, потому что мой старый маршрутизатор больше не мог удерживать трафик. Я поделился Интернетом через IPTABLES с помощью NAT, но теперь, после перенаправления порта 80 на мой веб-сервер, теперь вместо того, чтобы видеть IP реальных пользователей, я вижу свой IP-адрес шлюза (внутренний IP-адрес Linux) как любой IP-адрес пользователя.

Как решить эту проблему?


Я отредактировал свой пост, поэтому могу вставить правила, которые использую сейчас.

#!/bin/sh
#I made a script to set the rules

#I flush everything here.
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables -F
iptables -X


# I drop everything as a general rule, but this is disabled under testing
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP


# these are the loopback rules
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# here I set the SSH port rules, so I can connect to my server
iptables -A INPUT -p tcp --sport 513:65535 --dport 22 -m state --state NEW,ESTABLISHED     -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 --dport 513:65535 -m state --state ESTABLISHED -j ACCEPT


# These are the forwards for 80 port
iptables -t nat -A PREROUTING -p tcp -s 0/0 -d xx.xx.xx.xx --dport 80 -j DNAT --to     192.168.42.3:80
iptables -t nat -A POSTROUTING -o eth0 -d xx.xx.xx.xx -j SNAT --to-source 192.168.42.3
iptables -A FORWARD -p tcp -s 192.168.42.3 --sport 80 -j ACCEPT

# These are the forwards for bind/dns
iptables -t nat -A PREROUTING -p udp -s 0/0 -d xx.xx.xx.xx --dport 53 -j DNAT --to 192.168.42.3:53
iptables -t nat -A POSTROUTING -o eth0 -d xx.xx.xx.xx -j SNAT --to-source 192.168.42.3
iptables -A FORWARD -p udp -s 192.168.42.3 --sport 53 -j ACCEPT


# And these are the rules so I can share my internet connection
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0:1 -j ACCEPT

Если я удалю часть MASQUERADE, я вижу свой реальный IP-адрес, повторяя его с помощью PHP, но у меня нет Интернета. Как это сделать, чтобы иметь интернет и видеть мой реальный IP-адрес, в то время как порты тоже перенаправляются?

** xx.xx.xx.xx - мой публичный IP. Я спрятал это из соображений безопасности.

Решил мою собственную тайну, но спасибо тем, кто помогал до сих пор. Изучил немного больше справочной страницы iptables и пришел к решению, которое, похоже, работает так, как я хочу:

Замените строку, содержащую МАСКАРАД (iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE) со следующей строкой:

iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o eth0 -j SNAT --to-source XX.XX.XX.XX

Теперь я могу видеть свой настоящий IP-адрес и иметь доступ в Интернет.

* XX.XX.XX.XX = публичный IP

Это нормальное поведение, если вы использовали правило маскарада (-j MASQUERADE). Я думаю, что вы используете для "трансляции сетевого адреса назначения" (-j DNAT), например что-то вроде:

/sbin/iptables -t nat -A PREROUTING -p tcp -d {$PUBLICADDRESS} --dport 80 -j DNAT --to {$WEBSERVER}:80

Вышеупомянутое может работать или не работать в зависимости от остальных ваших правил, конечно. Вам следует обновить свой вопрос, указав, по крайней мере, те правила, которые у вас есть в настоящее время и которые относятся к веб-серверу.