libvirt iptables пересылка, пересылка не работает, хотя раньше работала. Что еще я могу проверить?

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

Я использую Ubuntu 20 и libvirt для хостинга виртуальной машины Ubuntu 20. Переадресация портов внезапно перестала работать. Интернет и все другие функции по-прежнему работают как ожидалось.

Я пытался сбросить virbr0 и очищал iptables, созданные по умолчанию через libvirt. Также перезагружал хост и гостевую систему. Есть ли что-то очевидно неправильное или какую-то другую конфигурацию, которую мне следует проверить?

Некоторые общие результаты, которые я видел у людей, за исключением некоторых распространенных проблем:

Результат telnet 192.168.122.104 5001

Попытка 192.168.122.104...
Подключено к 192.168.122.104.
Символ для выхода: '^]'.

Да, программа слушает на порту гостя.

Результат sudo netstat -plant

Активные интернет-соединения (серверы и установленные)
Протокол Recv-Q Send-Q Локальный адрес           Удаленный адрес         Состояние       PID/Имя программы    
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      553220/dnsmasq      
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      1322/systemd-resolv 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1557/sshd: /usr/sbi 
tcp        0      0 127.0.0.1:5900          0.0.0.0:*               LISTEN      563376/qemu-system- 
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      184233/cupsd        
tcp        0      0 192.168.1.22:43298      165.254.239.131:443     ESTABLISHED 1572/vncserver-x11- 

Нет, программа не переадресовывается на порт хоста.

Результат sudo iptables -L -n -t nat -v

Цепочка PREROUTING (политика ACCEPT 3127 пакетов, 364K байт)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:5001 to:192.168.122.104:5001
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:5000 to:192.168.122.104:5000

Цепочка INPUT (политика ACCEPT 306 пакетов, 37886 байт)
 pkts bytes target     prot opt in     out     source               destination         

Цепочка OUTPUT (политика ACCEPT 984 пакетов, 96927 байт)
 pkts bytes target     prot opt in     out     source               destination         

Цепочка POSTROUTING (политика ACCEPT 933 пакетов, 86727 байт)
 pkts bytes target     prot opt in     out     source               destination         
 2168  211K LIBVIRT_PRT  все  --  *      *       0.0.0.0/0            0.0.0.0/0           

Цепочка LIBVIRT_PRT (1 ссылка)
 pkts bytes target     prot opt in     out     source               destination         
    9  1090 RETURN     все  --  *      *       192.168.122.0/24     224.0.0.0/24        
    0     0 RETURN     все  --  *      *       192.168.122.0/24     255.255.255.255     
 1085 65100 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
  146 59104 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  все  --  *      *       192.168.122.0/24    !192.168.122.0/24    

UFW был включен, даже когда все работало. Отключение его не изменило ситуацию.

Я предполагаю, что вы хотите, чтобы локальный хост переадресовывал на порт 5001 по IP 192.168.122.104

Я вижу, что у вас есть правило DNAT для dpt 5001, которое должно быть переадресовано на 192.168.122.104:5001 в цепочке Prerouting.

Здесь ключевое слово – Prerouting. По умолчанию Linux не будет маршрутизировать на локальную сеть. Следовательно, правило Prerouting никогда не будет срабатывать.

Чтобы подтвердить, выполните (замените virbr0 на имя интерфейса, если оно отличается от virbr0):

sysctl net.ipv4.conf.virbr0.route_localnet

Если сейчас установлено 0, вам нужно изменить это, выполнив:

sysctl net.ipv4.conf.virbr0.route_localnet=1

Если вы хотите включить это для всех интерфейсов, то:

sysctl net.ipv4.conf.all.route_localnet=1

Это должно решить проблему, если нет, то я бы предложил проверить, чтобы все модули, необходимые для iptables для выполнения NAT, были установлены и активны.

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

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

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

    Для проверки текущего значения выполните:

    sysctl net.ipv4.conf.virbr0.route_localnet

    Если результат равен 0, это означает, что маршрутизация локального трафика отключена. Чтобы изменить это значение, выполните команду:

    sudo sysctl -w net.ipv4.conf.virbr0.route_localnet=1

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

    sudo sysctl -w net.ipv4.conf.all.route_localnet=1

    Для сохранения этих изменений после перезагрузки добавьте их в файл /etc/sysctl.conf:

    net.ipv4.conf.virbr0.route_localnet=1
  2. Проверка активных правил iptables:
    Убедитесь, что ваши правила iptables настроены правильно и нет блокирующих правил, которые могут мешать перенаправлению. Вы можете рассмотреть возможность временно сбросить правила iptables (предварительно сделав резервную копию) для диагностики.

    sudo iptables -F
    sudo iptables -t nat -F

    После этого добавьте обратно ваши нужные правила.

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

    lsmod | grep iptable_nat

    Если модули не загружены, их можно загрузить следующим образом:

    sudo modprobe iptable_nat
  4. Проверка конфигурации сети и соединений:
    Убедитесь, что программа на виртуальной машине действительно слушает на нужном порту и доступ к ней не блокируется. Для проверки можно использовать:

    sudo netstat -tuln | grep 5001
  5. Логи и отладка:
    Ознакомьтесь с системными логами на хосте и гостевой машине, чтобы выявить возможные ошибки. Используйте команды:

    journalctl -xe
    dmesg
  6. Проверка UFW и других брандмауэров:
    Хотя вы упомянули отключение UFW, проверьте, нет ли других средств брандмауэра или правил, мешающих вашему перенаправлению. Также убедитесь, что настройки UFW не были повторно активированы.

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

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

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