Резюме
Я использую Nginx в качестве обратного прокси и, в частности, его функциональность. proxy_bind
чтобы отправить реальный IP-адрес клиента на серверную часть. Я последовал за эта документация с nginx.com.
Это работает хорошо, как когда HTTP-сервер размещен на другом компьютере, так и непосредственно на одном из обратных прокси-серверов, за исключением второго случая, когда HTTP-сервер прослушивает локальный хост.
=> Я не могу заставить эту конфигурацию работать:
# /etc/nginx/conf.d/nginx-revprox-test.conf
сервер {
слушать 80;
место расположения / {
прокси_пароль http://127.0.0.1:8080;
proxy_bind $remote_addr прозрачный;
}
}
Подробности
Гипотезы:
- IP-адреса:
- Обратный прокси/локальный сервер:
192.168.1.90 (эт0)
& 172.17.0.1 (эт1)
- Внешний бэкенд:
172.17.0.2
- Клиент:
192.168.1.91
- Порты:
- внешний интерфейс:
80
(без TLS)
- серверные части:
8080
Дело №1: HTTP-сервер размещен на внешнем сервере (http://172.17.0.2:8080).
# /etc/nginx/conf.d/nginx-revprox-test.conf
сервер {
слушать 192.168.1.90:80;
место расположения / {
прокси_пасс http://172.17.0.2:8080;
proxy_bind $remote_addr прозрачный;
}
}
руководство говорит, что мы должны настроить iptables последовательно:
iptables -t mangle -A PREROUTING -p tcp -s 172.17.0.2 --sport 8080 -j MARK --set-xmark 0x1/0xffffffff
ip правило добавить fwmark 1 поиск 100
ip route add local 0.0.0.0/0 dev lo таблица 100
=> Работает нормально.
Дело №2: HTTP-сервер размещается на том же компьютере, что и обратный прокси-сервер, и прослушивает эт1
(http://172.17.0.1:8080).
# /etc/nginx/conf.d/nginx-revprox-test.conf
сервер {
слушать 192.168.1.90:80;
место расположения / {
прокси_пасс http://172.17.0.1:8080;
proxy_bind $remote_addr прозрачный;
}
}
Согласно с этот ответ и эта диаграмма, Только ВЫВОД и РАЗМЕЩЕНИЕ применяются к локально сгенерированным пакетам. Нам нужно изменить наше правило iptables следующим образом:
iptables -t mangle -A ВЫВОД -p tcp -s 172.17.0.2 --sport 8080 -j MARK --set-xmark 0x1/0xffffffff
=> Это тоже работает.
Дело №3: HTTP-сервер размещен локально, но вот
(http://127.0.0.1:8080).
# /etc/nginx/conf.d/nginx-revprox-test.conf
сервер {
слушать 192.168.1.90:80;
место расположения / {
прокси_пароль http://127.0.0.1:8080;
proxy_bind $remote_addr прозрачный;
}
}
=> [!] Я не могу заставить его работать, даже с ВЫВОД правило в iptables.
завиток http://192.168.1.90:80
не работает с клиента (работает только с сервера но не в этом дело).
Что-то я пропустил про iptables. Не могли бы вы помочь мне?