Что может быть неправильно с пробросом портов на виртуальную машину KVM?

Я создал виртуальную машину, которая использует сеть по умолчанию. В конфигурации dumpxml у меня настроен nginx, который слушает порт 80. Пытаюсь пробросить все порты, кроме 22, чтобы ssh на хостовой машине оставался доступным, но не могу даже получить доступ к 80 порту. Могу ли я получить помощь в настройке проброса портов? Вот конфигурация iptables: 
<pre><code>Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    DNAT       tcp  --  anywhere             CentOS-Stream-9      tcp dpt:http to:192.168.122.198:80
2    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    LIBVIRT_PRT  all  --  anywhere             anywhere
2    MASQUERADE  all  --  192.168.122.0/24     anywhere

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LIBVIRT_INP  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
LIBVIRT_FWX  all  --  anywhere             anywhere
LIBVIRT_FWI  all  --  anywhere             anywhere
LIBVIRT_FWO  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             192.168.122.198
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
LIBVIRT_OUT  all  --  anywhere             anywhere

Chain LIBVIRT_FWI (1 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

C</code></pre>
  • 25 октября 2024 г. 17:13
Ответы на вопрос 2
Проблема с пробросом портов на виртуальной машине KVM может быть вызвана несколькими факторами, учитывая вашу конфигурацию iptables. Давайте рассмотрим возможные источники проблем и предложим решения.

### 1. Конфигурация iptables
Согласно вашей конфигурации iptables, у вас настроен DNAT для перенаправления HTTP трафика на ваш виртуальный хост (`192.168.122.198`):

```plaintext
DNAT       tcp  --  anywhere             CentOS-Stream-9      tcp dpt:http to:192.168.122.198:80
```

Проблемы могут возникнуть из-за следующих причин:

- **Пробрасывание только порта 80**: Убедитесь, что вы действительно хотите пробросить все порты, кроме 22. Если это так, вы должны добавлять дополнительные правила для Tcp-соединений на другие порты (например, 443) в схему DNAT.

- **Отсутствие правильного разрешения на доступ к порту**: Проверьте, нет ли других правил в iptables, которые могут блокировать доступ к порту 80.

- **Политики цепочек**: Убедитесь, что вы принимаете или разрешаете пакеты в цепочках INPUT и FORWARD.

### 2. Настройка сети KVM (основных и віртуальных интерфейсов)
Проверьте конфигурацию сети вашей KVM host. Убедитесь, что виртуальная машина подключена к правильной сети и получает соответствующие пакеты. Если вы используете bridged networking, убедитесь, что виртуальная машина может правильно общаться с сетью, в которой находится хост.

### 3. Проверка состояние nginx
Убедитесь, что Nginx на вашей виртуальной машине слушает на порту 80 и что нет конфликта с другими службами. Используйте следующую команду для проверки:

```bash
sudo netstat -tuln | grep :80
```

Также проверьте, что конфигурация Nginx корректна, выполнив:

```bash
sudo nginx -t
```

### 4. Проверка подключения
Попробуйте выполнить ping на IP-адрес вашей виртуальной машины (`192.168.122.198`) с хостовой машины, чтобы убедиться, что сеть работает.

### 5. Логи
Проверьте логи Nginx на наличие ошибок, это может дать указание на возможные проблемы. Логи обычно находятся в `/var/log/nginx/error.log`.

### 6. Возможные дополнительные шаги
Добавьте правила для проброса других необходимых портов, если это нужно. Например:

```bash
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.122.198:443
```

Пример для проброса всех TCP портов, кроме 22, может выглядеть следующим образом (для 3-го и 4-го правил необходимо повторить его для каждого порта):

```bash
iptables -t nat -A PREROUTING -p tcp --dport <PORT> -j DNAT --to-destination 192.168.122.198:<PORT>
```

### Итог
После проверки всех этих пунктов вы, вероятно, сможете выявить причину проблемы с пробросом портов. Если проблемы сохраняются, пожалуйста, предоставьте дополнительные данные о конфигурации сети и настройках KVM для более детального анализа.
А почему iptables не пробрасывает порт?
Давайте по аналогии.
Потому что провайдер не видит ваш ПК и ничего о нём не знает,. Зато на роутере вы можете пробросить порт на ПК.
В вашей схеме: ПК - это ваша виртуалка; провайдер - это ваш хост; роутер - это сетевая часть гипервизора qemu. Таким образом, пробросить порт в режиме сети "user" вы можете только средствами гипервизора, что вам и описал zlo1 в первом комментарии.

сервер имеет статичный белый ip и подключен напрямую без маршрутизаторов
На сервере только один физический сетевой интерфейс? Очень легко настраивается, когда на сервере есть WAN и LAN, тогда бридж поднимается на LAN и на этот бридж цепляются виртуальные машины.

Вот не буду врать, я не пробовал руками поднимать бридж без привязки к физическому NIC (не было такой задачи), но по идее можно создать tap-интерфейс и навесить бридж на него. Уже с tap можно будет работать средствами хоста, а не гипервизора. Только надо сначала разрешить ip-forward, чтобы между WAN и tap в принципе могли летать пакеты. Потом разрулить маршруты между хостом и гостем (с обеих сторон), и только после этого смотреть на iptables (теперь сможете пробросить порт).
Короче, да, мост подходит, должен подходить. :)
Похожие вопросы