Когда я очищаю 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.