dikey58
@dikey58
Самоучка - web-разработчик

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

Создал виртуальную машину, она использует default сеть. В dumpxml . На виртуальной машине работает nginx и слушает 80 порт.
Пытаюсь пробросить все порты кроме 22 (чтобы ssh хостовой машины был досутпен) на виртуальную машину. Но не могу даже добиться доступа 80 порта.
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

Chain LIBVIRT_FWO (1 references)
target     prot opt source               destination
ACCEPT     all  --  192.168.122.0/24     anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain LIBVIRT_FWX (1 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain LIBVIRT_INP (1 references)
target     prot opt source               destination
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps

Chain LIBVIRT_OUT (1 references)
target     prot opt source               destination
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootpc
  • Вопрос задан
  • 195 просмотров
Пригласить эксперта
Ответы на вопрос 2
hint000
@hint000
у админа три руки
А почему iptables не пробрасывает порт?
Давайте по аналогии.
spoiler
(Да, меня хлебом не кормите, дайте приделать дверцу к котёнку).
Например, у вас есть ПК, есть провайдер, предоставляющий доступ в интернет, и есть роутер между провайдером и вашим ПК. Вы спрашиваете: "А почему провайдер не может пробросить порт на мой ПК?"
Потому что провайдер не видит ваш ПК и ничего о нём не знает,. Зато на роутере вы можете пробросить порт на ПК.
В вашей схеме: ПК - это ваша виртуалка; провайдер - это ваш хост; роутер - это сетевая часть гипервизора qemu. Таким образом, пробросить порт в режиме сети "user" вы можете только средствами гипервизора, что вам и описал zlo1 в первом комментарии.

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

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

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

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

Но явно выглядит всё не быстро для меня, так что пока разверну обратный прокси.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы