Назад | Перейти на главную страницу

NAT через iptables и виртуальный интерфейс

Я пытаюсь реализовать следующий сценарий: один виртуальный хост, несколько гостевые ВМ, каждый получает свой собственный IP-адрес (и домен).

Наш сервер имеет только один физический интерфейс, поэтому его предполагаемое использование - добавление виртуальные интерфейсы на eth0. Чтобы усложнить нашу ситуацию, провайдер использует безопасность порта на их коммутаторах, поэтому я не могу запустить гостевые интерфейсы в мостовом режиме, потому что тогда коммутатор обнаруживает «поддельный» MAC-адрес и убивает интерфейс (навсегда, заставляя меня позвонить в службу поддержки, которая, я уверен, получит их немного рассердили в третий раз;)).

Мое первое предположение заключалось в использовании iptables и NAT для пересылки всех пакетов с одного виртуального интерфейса на другой, но iptables, похоже, не любит виртуальные интерфейсы (по крайней мере, я не могу заставить его работать должным образом). Второе предположение - использовать исходный IP-адрес пакетов в общедоступном интерфейсе.

Предположим, libvirt создает сеть virbr0 с адресом 192.168.100.0/24, а гость использует 192.168.100.2 в качестве IP-адреса.

Вот что я пытался использовать: iptables -t nat -I PREROUTING --src public_ip_on_eth0:0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:80

Это тоже не дает ожидаемых результатов (время ожидания доступа к серверу истекло).

Есть ли способ сделать то, что я пытаюсь сделать, или даже направить весь трафик на определенный IP-адрес виртуального интерфейса к устройству виртуальной машины?

С ответами Кристоф Древе и Герцог лев Мне удалось получить желаемую конфигурацию.

Я отвечу сам, объясняя свое решение. Пожалуйста, не стесняйтесь комментировать это, так как я не занимался сетевыми вещами несколько лет и вполне мог пропустить что-то очень важное.

Приведенная ниже конфигурация работает идеально и позволяет добавлять дополнительные виртуальные машины, каждая из которых использует свой общедоступный IP-адрес (IP-адреса из 172.16.0.0, используемые здесь, являются «общедоступными»).


Сетевые интерфейсы

VM-Host, eth0        -> 172.16.0.1
VM-Host, eth0:0      -> 172.16.0.2
VM-Host, br0         -> 192.168.10.1
Virt. machine, eth0  -> 192.168.10.2 (added to br0)
                        gateway: 172.16.0.2

iptables

Отслеживание подключений:

iptables -I FORWARD -m conntrack -d 192.168.10.0/24 --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

DNAT для веб-сервера на нашей виртуальной машине:

iptables -t nat -A PREROUTING -p tcp -d 172.16.0.2 --dport 80 -j DNAT --to-destination 192.168.10.2:80

SNAT для нашей виртуальной машины для выхода во внешний мир:

iptables -t nat -I POSTROUTING -j SNAT --src 192.168.10.2 --to-source 172.16.0.2

Заблокируйте все остальные порты на виртуальной машине:

iptables -A INPUT -d 172.16.0.2 -j REJECT --reject-with icmp-port-unreachable

У меня была аналогичная конфигурация сети, и я использовал эту конфигурацию:

localnetwork (192.168.0.0/24) <-> host eth0 (192.168.0.10)

host tun0 (192.168.1.150) <-> vm1 eth0 (192.168.1.200) gw 192.168.1.150
                          <-> vm2 eth0 (192.168.1.201) gw 192.168.1.150

Все мои виртуальные машины могут пинговать друг друга и иметь доступ к внешней сети с помощью этого правила iptable:

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.1.0/24       0.0.0.0/0            to:192.168.0.10

Внешняя сеть может получить доступ к службам на моих виртуальных машинах с помощью следующих правил:

Chain PREROUTING (policy ACCEPT)
target  prot opt source     destination         
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:22200 to:192.168.1.200:22
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:22201 to:192.168.1.201:22
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:3389  to:192.168.1.202:3389
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:443   to:192.168.1.206:443
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:80    to:192.168.1.206:80

Я настроил интерфейс tun0 с этими строками на debian в файле / etc / network / interfaces:

auto tun0
iface tun0 inet static
  address 192.168.1.150
  netmask 255.255.255.0
  pre-up tunctl -g uml-net -t tun0
  post-down tunctl -d tun0

чтобы использовать DNAT таким образом, вам необходимо, чтобы ваши гостевые системы имели виртуальный хост в качестве шлюза по умолчанию.