У меня есть сервер с одним внешним IP-адресом (например, 1.2.3.4
). На этом сервере я использую libvirt для запуска виртуальных машин. Теперь я хочу получить доступ к виртуальному серверу на моем хосте через ssh ( порт 1234
) извне.
В моей хост-системе у меня есть сетевой интерфейс eth0
, который подключен к мой внешний IP ( 1.2.3.4
).
Есть несколько вещей, которые мы должны рассмотреть.
Что я здесь делаю не так?
Давайте посмотрим текущую конфигурацию iptables, а затем мы можем ее изучить.
Есть ли UFW мешают iptables?
UFW - это интерфейс командной строки для iptables, но в нем отсутствуют многие функции iptables. Конфигурация iptables покажет нам, что сделал UFW на основе введенных вами команд. Однако вам не следует создавать правила с обоими на одном компьютере. Это требует осложнений. Если вы собираетесь вводить свои команды в UFW, все в порядке, но скрипты iptables должны быть отключены. Если вы собираетесь вводить свои команды в iptables, вам следует удалить UFW.
Как я могу заставить это работать?
Попробуйте это.
iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 1234 -j DNAT --to 192.168.122.235:1234
iptables -A FORWARD -i eth0 -o vibr0 -p tcp --dport 1234 -j ACCEPT
Но имейте в виду, что гость подключен к хосту через NAT с адаптер. Так что это, вероятно, не сработает.
Что вам действительно стоит подумать, так это изменить тип адаптера с NAT на мостовой.
Я думаю, вам также следует использовать мостовое соединение:
Попытайтесь узнать свое имя сети:
virsh net-edit <network name>
Имя сети, которое вы можете увидеть в Virt Manager. Обычно это значение по умолчанию:
virsh net-edit default
Переход с NAT на мост (также имя моста, которое вы найдете в Virt Manager)
<network>
<name>default</name>
<uuid>cc45a671-e8d8-4149-a6a5-8d5547551a58</uuid>
<forward mode='route'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='AA:CC:DD:86:53:54'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
Примечания:
В этом примере мы использовали DHCP для присвоения имен виртуальным машинам. Вы также можете сделать статические настройки
Если вы используете ifconfig, вы должны получить:
virbr0 Link encap: Ethernet Hardware Adresse AA: VV: CC: 86: 53: 54
inet Адрес: 192.168.122.1 Bcast: 192.168.122.255 Маска: 255.255.255.0
ВВЕРХ ТРАНСЛЯЦИИ МУЛЬТИКАЛТА MTU: 1500 Метрик: 1
RX-Pakete: 127 Фелер: 0 Верлорен: 0 Уберлейф: 0 Фенстер: 0
TX-Pakete: 44 Fehler: 0 Verloren: 0 Überläufe: 0 Träger: 0
Коллизионен: 0 Количество отправлений: 0
RX-Bytes: 13032 (13.0 KB) TX-Bytes: 4707 (4.7 KB)
В основном вы должны использовать порт 22 для ssh
Попробуйте использовать:
sudo iptables -t nat -A POSTROUTING -s 192.168 .122.235 -j SNAT --to-source 1.2.3.4
Таким образом, вы можете локализовать, если это проблема с портами. Фактически, вы можете после закрытия портов на виртуальной машине с помощью Gufw.
Это мои правила пересылки, которые довольно хороши.
-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
-A POSTROUTING -s 192.168.122.0/24 -o br1 -j MASQUERADE
-A INPUT -s 192.168.122.0/24 -j ACCEPT
-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 FORWARD -i virbr0 -j ACCEPT
-A FORWARD -i br1 -o virbr0 -j ACCEPT
У меня была практически такая же проблема. Я хотел перенаправить порт 22 с моего хост-компьютера на мою виртуальную машину, также работающую с KVM, с сетью NAT.
Я нашел это сообщение: https://ubuntuforums.org/showthread.php?t=2261173&p=13210545 # post13210545
Который дал мне ответы.
TL; DR
192.168.1.161 - IP моего сервера во внутренней сети. 192.168.122.2 - это мой IP-адрес виртуальной машины на хосте.
iptables -t nat -I PREROUTING -p tcp -d 192.168.1.161 --dport 22 -j DNAT --to-destination 192.168.122.2:22
iptables -I FORWARD -m state -d 192.168.122.2/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
Отказ от ответственности. Я понятия не имею, что именно это делает. Он выглядит так же, как и многие другие найденные мной ответы, только некоторые теги параметров немного отличаются.