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

iptables SNAT и маскарад для разделения общедоступных IP-адресов для контейнеров LXC

Мне почти неловко публиковать это, но это один из немногих случаев, когда я не могу выразить словами (правильно), что я пытаюсь сделать, и погуглить.

У меня есть размещенный сервер Ubuntu с двумя общедоступными IP-адресами. Хост-машине будут доступны некоторые службы, а затем я установлю контейнеры LXC с их собственными частными / 24 и замаскированными.

Проблема в том, что все проходит через первичный общедоступный IP-адрес, и мне нужно, чтобы весь трафик, исходящий из контейнеров LXC, шел со вторичного общедоступного IP-адреса, оставляя трафик хоста в покое.

Вот макет:

eth0   1.1.1.2/24 gateway of 1.1.1.1

eth0:1 1.1.1.3/24

lxcbr0 10.0.3.1/24

iptables (текущий):

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

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

Я попытался:

iptables -t nat -I POSTROUTING 1 -s 10.0.3.0/24 -o eth0:1 -j SNAT --to-source 1.1.1.2

и

iptables -t nat -I POSTROUTING 1 -s 10.0.3.0/24 -o lxcbr0 -j SNAT --to-source 1.1.1.2

Но безрезультатно. Я уверен, что делаю это неправильно, потому что я не так хорошо разбираюсь в iptables, как другие межсетевые экраны.

Предполагая, что вторичный IP-адрес действительно 1.1.1.3, а не 1.1.1.2 (ваши примеры сбивают с толку, иначе ниже просто замените IP другим), это правило должно работать:

iptables -t nat -I POSTROUTING -s 10.0.3.0/24 -o eth0 -j SNAT --to-source 1.1.1.3

Большинство инструментов не заботятся и не знают об использовании псевдонима интерфейса: вы должны указать eth0не eth0:1 в iptables. Ваша вторая попытка не может работать как есть: lxcbr0 будет входным интерфейсом, но POSTROUTING обрабатывает только выходные интерфейсы (вы можете сделать это с помощью метки, но это более сложно).

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

iptables -t nat -I POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j SNAT --to-source 1.1.1.3

На самом деле вы можете добавить свой второй IP-адрес, вообще не создавая этого псевдонима: ip addr add 1.1.1.3/24 dev eth0 (вместо того ifconfig eth0:1 1.1.1.3 netmask 255.255.255.0, и без возможно ненужной трансляции). Но только тогда ip addr show dev eth0 покажет это, потому что ifconfig eth0 скорее всего не будет отображать второй IP. (Чтобы быть внимательным, вы даже можете не добавлять этот IP-адрес вообще, если вы играете с прокси-аргументом и маршрутами, удобно, если у вас есть целая LAN общедоступных IP-адресов вместо 2)