Как отладки соединений iptables nat, когда пакеты пересылаются, но не принимаются сервером?

Вопрос или проблема

Я хочу, чтобы виртуальная машина в облаке (VM1) работала как TCP-прокси для сервера (VM2), чтобы адрес IP VM2 не был доступен клиентам. Клиенты должны подключаться к публичному IP-адресу VM1 на порту 9735, и весь трафик должен пересываться на VM2 на том же порту. Ответы должны идти в обратном направлении.

VM1 и VM2 соединены через wireguard. У обеих машин есть два интерфейса: интерфейс wireguard (wg0) и интернет-интерфейс (ens5, eth0 соответственно). Адрес IP VM1 на wg0 – 10.200.200.1, адрес VM2 – 10.200.200.2. Соединение wireguard работает нормально. Я могу успешно выполнить telnet 10.200.200.2:9735 с VM1.

Проблема возникает, когда я пытаюсь выполнить telnet на публичный IP VM1.

Я настроил iptables на VM1 следующим образом.

# Включить IP-перенаправление
# https://serverfault.com/questions/240532/iptables-dnat-not-working
echo 1 > /proc/sys/net/ipv4/ip_forward

# Сброс и разрешение всего
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
iptables -t security -F
iptables -t security -X

export WAN=ens5
export LAN=wg0

# Правила фильтрации, по умолчанию разрешить, записать некоторые
iptables -P INPUT ACCEPT
iptables -A INPUT -p tcp --dport 9735 -j LOG --log-level info --log-prefix "fiter_in"

iptables -P OUTPUT ACCEPT
iptables -A OUTPUT -p tcp --dport 9735 -j LOG --log-level info --log-prefix "fiter_out"

iptables -P FORWARD ACCEPT
iptables -A FORWARD -p tcp --dport 9735 -j LOG --log-level info --log-prefix "filter_forward"

iptables -t nat -A PREROUTING -p tcp -i $LAN -j LOG --log-level info --log-prefix "prerouting_fr_wg0"
iptables -t nat -A PREROUTING -p tcp -i $WAN --dport 9735 -j LOG --log-level info --log-prefix "prerouting_9735"
iptables -t nat -A PREROUTING -p tcp -i $WAN --dport 9735 -j DNAT --to-destination 10.200.200.2:9735

iptables -t nat -A POSTROUTING -o $LAN -j LOG --log-level info --log-prefix "postrouting_to_wg0"
iptables -t nat -A POSTROUTING -o $WAN -j LOG --log-level info --log-prefix "postrouting_to_ens5"
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE

На VM1 пересылка iptables работает нормально, я вижу, что пакеты пересылаются, используя tcpdump.

root@myserver:~# tcpdump -n -A tcp -i wg0
tcpdump: подробный вывод подавлен, используйте -v[v]... для полного декодирования протокола
слушая на wg0, тип ссылки RAW (Raw IP), длина снимка 262144 байт
19:53:56.838847 IP [публичный IP-адрес клиента].16190 > 10.200.200.2.9735: Flags [S], seq 2996679219, win 64240, options [mss 1420,sackOK,TS val 1658363264 ecr 0,nop,wscale 7], length 0
E..<[email protected].......
...?>&....3.........r.........
b...........

На VM2 вывод tcpdump просто ничего не показывает. Похоже, что VM2 ничего не получает.

Есть ли какие-либо предложения по дальнейшей отладке этой проблемы?

Ответ или решение

Как отладить NAT-соединения iptables, когда пакеты пересылаются, но не достигают сервера

Ваша задача настроить виртуальную машину (VM1) как TCP-прокси для другого сервера (VM2) с целью скрытия IP-адреса VM2 от клиентов является довольно распространенной задачей в областях сетевой безопасности и управления доступом. Проблема, с которой вы столкнулись, заключается в том, что хотя пакеты успешно пересылаются на VM1, сервер VM2 не получает их. Рассмотрим пошаговый процесс отладки проблемы.

1. Проверьте настройки IP-адресации и маршрутизации

Убедитесь, что обе виртуальные машины правильно настроены для использования WireGuard. Проверьте, что маршруты и интерфейсы настроены корректно. Используйте команду:

ip route

Эта команда позволит уточнить, что трафик направляется по правильным интерфейсам. Убедитесь, что для VM2 задано правильное значение для маршрута к провайдеру.

2. Проверка настроек iptables

На VM1 вы правильно настраиваете правила iptables, однако есть несколько моментов, на которые стоит обратить внимание:

  • Убедитесь, что вы используете FORWARD правильно. Хотя ваши правила устанавливают политику ACCEPT, лучше всего добавить более специфические правила для определённых потоков:

    iptables -A FORWARD -i $WAN -o $LAN -p tcp --dport 9735 -j ACCEPT
    iptables -A FORWARD -i $LAN -o $WAN -p tcp --sport 9735 -j ACCEPT
  • Ваша конфигурация в POSTROUTING также нуждается в уточнении. Убедитесь, что использование MASQUERADE на интерфейсе WAN действительно служит вашей цели и корректно настраивает исходящие соединения.

3. Используйте различные инструменты для мониторинга

  • Подключитесь к VM1 и наберите следующую команду для просмотра логов:

    tail -f /var/log/syslog | grep "filter_forward"

    Это позволит вам увидеть, проходят ли пакеты через правила FORWARD.

  • Включите также логи для заблокированных пакетов:

    iptables -A INPUT -j LOG --log-prefix "Dropped: " --log-level 4

Это даст вам возможность видеть пакеты, которые могут быть отклонены.

4. Проверьте настройки на VM2

Проблема может также заключаться в настройках сетевых интерфейсов на VM2. Убедитесь, что все необходимые порты открыты. Возможно, выполните следующую команду:

iptables -L

Это позволит вам удостовериться, что никакие правила не блокируют входящие соединения. Если ваш сервер работает под управлением Ubuntu или другого дистрибутива, проверьте, открыт ли порт 9735 для соединений:

netstat -tuln | grep 9735

5. Использование tcpdump

Пока вы уже используете tcpdump на VM1, также полезно запустить его на VM2, чтобы убедиться, что пакеты действительно не достигают VM2:

tcpdump -i wg0 -n port 9735

Если пакеты не отображаются, это означает, что проблема вероятнее всего на уровне маршрутизации.

6. Убедитесь в правильности конфигурации WireGuard

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

  • Проверьте, что AllowedIPs настроены правильно. Убедитесь, что IP-адреса находятся в диапазоне, который вы определили.
  • Перезапустите соответствующие службы WireGuard после внесения изменений.

7. Завершение отладки

После выполнения этих шагов вы сможете найти источник проблемы. Если проблема остается нерешенной, рассмотрите возможность использования других инструментов мониторинга, таких как traceroute, для проверки маршрута трафика.

Соблюдение вышеуказанных рекомендаций поможет вам диагностировать проблему с NAT-соединениями и обеспечить успешную передачу трафика от VM1 к VM2.

Оцените материал
Добавить комментарий

Капча загружается...