Пример команды iptables для проброса порта из интернета в виртуалку

redirect port linux iptables-restore rdp redirect iptables toucan

Команда iptables для проброса порта из интернета во внутреннюю виртуальную машину по адресу LAN:

echo 1 > /proc/sys/net/ipv4/ip_forward**

Чтобы пересылка пакетов работала после перезагрузки надо в файле /etc/sysctl.conf снять комментарий со строки:

#net.ipv4.ip_forward=1
Проверить: 
sysctl net.ipv4.ip_forward

Работающий пример

144.76.100.244:110 <—> 192.168.17.15:110  (shelter->regul)

iptables -t nat -A PREROUTING --dst 144.76.100.244 -p tcp --dport 110 -j DNAT --to-destination 192.168.17.15
iptables -I FORWARD 1 -i eth0 -o vboxnet0 -d 192.168.17.15 -p tcp -m tcp --dport 110 -j ACCEPT
iptables -t nat -A POSTROUTING --dst 192.168.17.15 -p tcp --dport 110 -j SNAT --to-source 192.168.17.1
где:  192.168.17.1 - ip-адрес внутреннего интерфейса хост-машины (корневой)
192.168.17.15 - ip-адрес внутреннего интерфейса гостевой машины regul (виртуалка)
144.76.100.244 - внешний (интернет) сетевой интерфейс хост машины (shelter)

Сохранение правил файервола

Запишем правила в файл:

iptables-save >/etc/iptables.rules

Для восстановления при загрузке в /etc/network/interfaces добавьте строчку

pre-up iptables-restore < /etc/iptables.rules

Для просмотра:

iptables -t nat -L --line-numbers

Для удаления 1-го правила из цепочки INPUT:

iptables -D INPUT 1

или еще пример:

iptables -t nat -D PREROUTING 1

Проброс порта в Ubuntu Server с использованием ufw

Допустим нам надо пробросить 80 tcp порт на локальную машину 192.168.1.1.
Убедимся что в файле /etc/ufw/sysctl.conf раскомментирована строка net/ipv4/ip_forward=1.

vi /etc/ufw/before.rules
В самом верху, до секции *filter, добавляем:

*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.1.1:80
COMMIT

и перезапускаем ufw и проверим, что правила загрузились:

iptables -L -nv -t nat
Вы должны увидеть

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- ppp0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:192.168.1.1:80 

Проверил на связке bolter->marduk - работает, но при отключенном ufw.
Чтобы заработало при включенном ufw надо:
включить в файерволе форвардинг пакетов. Это необходимо, чтобы наш шлюз мог пересылать пакеты из внутренней сети в интернет и обратно.  Для этого отредактируем файл /etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"

Вот теперь все заработало.

Пример проброса RDP-порта из хост-машины в ВМ

zilla (172.27.117.94) в ВМ KVM toucan (192.168.122.29)

sudo iptables -t nat -A PREROUTING --dst 172.27.117.94 -p tcp --dport 3389 -j DNAT --to-destination 192.168.122.29
sudo iptables -I FORWARD 1 -i enp7s0 -o virbr0 -d 192.168.122.29 -p tcp -m tcp --dport 3389 -j ACCEPT