Я исследовал все связанные проблемы с прокси-серверами Linux NAT, но они не помогли мне решить мою проблему. Мне кажется, что я все делаю правильно, но это просто не работает.
Я пытаюсь создать прокси-узел в сети, которая находится между клиентом и сервером. Клиент думает, что он обращается к прокси, но прокси преобразует соединение и перенаправляет его на сервер. Достаточно просто, и я думаю, что iptables / netfilter может это сделать, но я не могу заставить это работать.
Вот мои шаги:
<port>
-j DNAT - пункт назначения <target-server>
<port>
-j SNAT - к источнику <proxy-ip>
Затем я пытаюсь установить соединение от моего клиента к серверу в <target-server>
подключившись к <proxy-ip>
и порт <port>
.
Если я отслеживаю счетчики с помощью iptables -t nat -L -v -n, я получаю приращения по правилу PREROUTING, но не по правилу POSTROUTING. Создается впечатление, что пакет не пересылается.
Я сделал захват пакета на прокси и вижу входящий SYN-запрос. Затем я увижу, что ICMP-пакет отправляется обратно клиенту с сообщением «Пункт назначения недоступен (сеть недоступна)». Если я посмотрю на содержимое в ответе ICMP, он покажет исходный IP-адрес пакета, который был отброшен как IP-адрес клиента, IP-адрес назначения - это IP-адрес прокси. Если я в это верю, то я задаюсь вопросом, почему IP-адрес назначения по-прежнему является IP-адресом прокси, а не тем из правила iptables, которое изменило его на целевой сервер. Я также задаюсь вопросом, почему он должен утверждать, что сеть недоступна, если IP-адрес назначения в ответе об ошибке icmp является IP-адресом прокси.
Если я удалю правила NAT и снова попробую установить соединение, прокси-сервер отправит RST, как и ожидалось, обратно клиенту, поскольку на этом порту на прокси-сервере нет приложения, прослушивающего этот порт.
Это говорит мне о том, что правило PREROUTING nat что-то делает, но по какой-то причине вместо пересылки пакета оно отбрасывает его и отвечает ICMP-пакетом о недоступности сети. Зачем? Прокси-сервер может подключаться к целевому серверу, и я доказал это, запустив клиент на прокси-сервере и подключившись напрямую к целевому серверу.
Это меня поставило в тупик. Кстати, прокси - это система android-x86, работающая внутри виртуальной машины VirtualBox.