- Вопрос или проблема
- Ответ или решение
- Как отладить NAT-соединения iptables, когда пакеты пересылаются, но не достигают сервера
- 1. Проверьте настройки IP-адресации и маршрутизации
- 2. Проверка настроек iptables
- 3. Используйте различные инструменты для мониторинга
- 4. Проверьте настройки на VM2
- 5. Использование tcpdump
- 6. Убедитесь в правильности конфигурации WireGuard
- 7. Завершение отладки
Вопрос или проблема
Я хочу, чтобы виртуальная машина в облаке (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.