Как настроить переадресацию портов на гостевую виртуальную машину с помощью iptables

Как настроить переадресацию портов на гостевую виртуальную машину с помощью iptables

Я пытаюсь реализовать концепцию переадресации портов на гостевой сервер libvirt.

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

port=500                    # Arbitrary port, for proof of concept
public_if=wlp0s20f3         # My public interface, connected to the internet.
private_if=virbr0           # My private interface, through which the guest OS communicates
public_ip=192.168.0.11      # public interface's IP
private_ip=192.168.122.1    # private interface's IP
guest_ip=192.168.122.175    # Guest's IP

Гость — это просто Ubuntu live CD с командой, sudo nc -l 500 -kзапущенной в терминале. Я тестирую свою настройку, запустив nmap $public_ip -p $port. Когда я запускаю nmap $guest_ip -p $port, он показывает порт как «открытый».

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

Прежде всего, во всех случаях я выполняю следующее:echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Затем я попробовал следующий набор команд, изэтот урок:

sudo iptables -A FORWARD -i $public_if -o $private_if -p tcp --syn --dport $port -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i $public_if -o $private_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i $private_if -o $public_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -t nat -A PREROUTING -i $public_if -p tcp --dport $port -j DNAT --to-destination $guest_ip
sudo iptables -t nat -A POSTROUTING -o $private_if -p tcp --dport $port -d $guest_ip -j SNAT --to-source $private_ip

Это не делает этого. После этого sudo iptables -Fя также попробовал следующие команды, изэтот ответ:

sudo iptables -t nat -I PREROUTING -p tcp -d $public_ip --dport $port -j DNAT --to-destination $guest_ip:$port
sudo iptables -I FORWARD -m state -d $private_ip/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

И это тоже не сработало. Порт остаётся закрытым на $public_ip.

Для большего контекста: я запускаю эти правила после запуска гостевой ОС и после запуска на ней фиктивного сервера.

Что я делаю не так? Есть предложения, как это исправить?

Обновлять:

Я попробовал запустить захват пакетов как на хосте, так и на госте.

На хосте:

sudo tcpdump -i $private_if

Абсолютно никакого вывода на nmap $public_ip -p $port, но вывод есть при nmap $guest_ip -p $port.

В гостях:

sudo tcpdump

Точно то же самое, что и выше. Похоже, что виноват хост.

решение1

Проблема в том, как это проверяется.

Запуск nmap $public_ip -p $portна хосте — это не то же самое, что запуск на другой машине в сети. Самое важное здесь, что пакет SYN не пройдет через хук PREROUTING, который направляет пакет гостю. Он пройдет только через хуки OUTPUT и POSTROUTING, в указанном порядке.

Для справки: первый набор строк не работает, а второй работает.

Связанный контент