Я пытаюсь реализовать концепцию переадресации портов на гостевой сервер 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, в указанном порядке.
Для справки: первый набор строк не работает, а второй работает.