Мне почти неловко публиковать это, но это один из немногих случаев, когда я не могу выразить словами (правильно), что я пытаюсь сделать, и погуглить.
У меня есть размещенный сервер 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)