Правила libvirt iptables нарушают переадресацию портов на мои виртуальные машины KVM

Когда я очищаю IPtables, а затем добавляю следующие правила, входящие подключения могут без проблем подключаться к моей виртуальной машине KVM через порт 1234.

-A PREROUTING -i br0 -p tcp -m tcp --dport 1234 -j DNAT --to-destination 192.168.122.194:1234
-A FORWARD -d 192.168.122.194/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 1234 -j ACCEPT
-A FORWARD -s 192.168.122.194/32 -p tcp -m tcp --sport 1234 -j ACCEPT
-A FORWARD -d 192.168.122.194/32 -p tcp -m tcp --dport 1234 -j ACCEPT

Но я также хочу, чтобы NAT работал внутри моих виртуальных машин KVM. По умолчанию libvirt устанавливает некоторые правила, которые предоставляют моим виртуальным машинам NAT. Однако, когда я пытаюсь отправить SIGHUP в libvirt (именно так вы просите его добавить свои правила в iptables), он добавляет в iptables следующие правила, которые нарушают мою переадресацию портов, указанную выше.

-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT

-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE

Я пробовал запускать эти команды вручную. Я могу запускать все команды FORWARD и OUTPUT, и они не нарушают мою переадресацию портов. Однако я не могу запустить ни одну из команд POSTROUTING вручную. Я получаю сообщение об ошибке: «Нет цепочки/цели/совпадения с таким именем».

*Эти правила iptables libvirt в последнем сером разделе выше были получены путем запуска iptables-save и подтверждения того, что переадресация портов работает, затем отправки SIGHUP в libvirt, подтверждения того, что переадресация портов нарушена, затем повторного запуска iptables-save и запуска diff на двух позволяет узнать, какие новые правила iptables были добавлены libvirt.


person user1862165    schedule 04.06.2015    source источник
comment
Я тоже хотел бы это знать.   -  person Tino    schedule 25.09.2016


Ответы (1)


Я только что включил NAT со своими правилами. Я не беспокоился ни о каких правилах libvirt по умолчанию.

Добавить NAT так же просто, как 3 команды iptables. (где br0 — ваш интернет-адаптер (это может быть ppp0 или что-то в этом роде))

iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
iptables -A FORWARD -i br0 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i virbr0 -o br0 -j ACCEPT
person user1862165    schedule 05.06.2015
comment
Еще раз я научился не беспокоиться об использовании StackOverflow или его дочерних сайтов. Так много недобрых людей в большом эгоизме со своими пустыми точками, стремящимися оскорбить людей. Мой вопрос получил минус 4 балла, без комментариев и ответов. Еще раз, как всегда, я решил свою проблему сам. Все, что я получаю от StackOverflow, — это оскорбления. Это жалко. Я публикую этот ответ здесь для других. Я не буду больше задавать здесь вопросы. До свидания, StackOverflow. - person user1862165; 05.06.2015
comment
Проблема с вашим решением в том, что libvirt/KVM/qemu часто (если не всегда) уничтожает iptables, как только что-то делает. Я не нашел способа предотвратить изменение правил libvirt/KVM/qemu. Также совершенно непонятно руководство на libvirt.org. Вещи, которые просты и хорошо известны веками, кажутся сложными задачами, включая редактирование XML с произвольной семантикой, без какой-либо документации. Мое решение — скрипт, который каждую минуту проверяет iptables и при необходимости выполняет iptables-restore на основе рассчитанной матрицы соединений для всех локальных и удаленных виртуальных машин. - person Tino; 25.09.2016