top
logo


KVM VPS на Proxmox за NAT с пробросом портов PDF Печать E-mail
Автор: adm   
11.01.13 10:19

Часто, когда сервер арендуется у какого-либо хостинг-провайдера, к нему прилагается от одного до нескольких IP-адресов. Если сервер «каноничный» и все сервисы устанавливаются прямо на ОС, деля ресурсы между собой как придется, то данной проблемы может и не возникнуть. Но если же планируется четкое разделение ресурсов сервера посредством виртуализации, то в какой-то момент может появиться надобность либо в дополнительных IP-адресах, либо в организации NAT и пробросе портов. Если, конечно, сервисы смотрят наружу.
Организовать NAT для нескольких виртуальных машин довольно просто. В Proxmox «из коробки» доступно создание сетевых мостов. Для наших целей создадим бридж vmbr1 с ip-адресом 192.168.1.1 и стандартной маской 255.255.255.0.

После того как он заработает, идем в /etc/network/interfaces и немного правим конфигурацию созданного бриджа:

1
2
3
4
5
6
7
8
9
10
auto vmbr1
iface vmbr1 inet static
address 192.168.1.1
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '192.168.1.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.1.0/24' -o vmbr0 -j MASQUERADE

Здесь мы разрешаем виртуальным машинам на vmbr1 подключаться к интернету через vmbr0. Стоит отметить, что последние две строчки с добавлением и удалением правил файрвола могут отличаться по причине того, что в моем случае главным интерфейсом сервера является бридж vmbr0 и сеть настраивается на него. У меня он работает для получения несколькими виртуальными машинами реальных IP-адресов от внешнего гейта. Если у вас сеть настраивается на eth0, то он и должен быть вместо vmbr0. В остальном разницы никакой нет.
Также, включать ip_forward можно в /etc/sysctl.conf.

1
net.ipv4.ip_forward=1

Далее, если необходимо пробросить определенные порты на нужные виртуальные машины. Это можно сделать с помощью iptables:

1
iptables -A PREROUTING -t nat -i vmbr0 -p tcp -d %ext_ip_on_vmbr0% --dport %ext_port% -j DNAT --to %int_ip_on_vmbr1%:%int_port%

Где

%ext_ip_on_vmbr0% — внешний IP-адрес, который находится на vmbr0. Если не указать этого параметра, то порт будет пробрасываться со всех адресов на этом бридже.
%ext_port% — внешний порт по которому будут обращаться к серверу из интернета.
%int_ip_on_vmbr1% — внутренний IP виртуальной машины на vmbr1.
%int_port% — внутренний порт, на котором будет работать сервис в виртуальной машине.

Ну и после применения правил для нужных портов можно посмотреть все ли правильно:

1
2
3
4
5
6
7
8
9
10
11
12
# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere xxx.yyy.ru tcp dpt:33122 to:192.168.1.2:22
DNAT tcp -- anywhere xxx.yyy.ru tcp dpt:33222 to:192.168.1.3:22

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.1.0/24 anywhere

Если все верно — остается сделать так, чтобы при перезагрузке правила восстанавливались. Для этого можно воспользоваться iptables-save и скриптами инициализации сети.

1
iptables-save > /etc/iptables.up.rules

Создадим скрипт загрузки правил:

1
nano /etc/network/if-pre-up.d/iptables

И впишем в него команду загрузки правил из сохраненного ранее файла:

1
2
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

Не забудем дать права на исполнение этому файлу:

1
chmod +x /etc/network/if-pre-up.d/iptables

Все. Проброс портов работает.

На виртуальных же машинах, которые сидят на vmbr1 конфигурация сети банальна:

1
2
3
4
5
6
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1

 

источник: http://skobkin.ru/2012/03/kvm-vps-proxmox-with-port-forwarding

ссылка на материал: http://www.thin.kiev.ua/categoryblog/741-kvm-vps-proxmox-with-port-forwarding.html

{jcomments on}

Последнее обновление 11.01.13 10:27
 
Интересная статья? Поделись ей с другими:

bottom

 

Unreal Commander PfSense по русски Яндекс.Метрика