Я хочу, чтобы каждый исходный IP-адрес (у меня их много) всегда был одним и тем же SNAT (у меня их два. которые для меня могут назначаться случайным образом в первый раз).
например:
10.0.0.1 > 8.0.0.1
10.0.0.2 > 8.0.0.2
10.0.0.3 > 8.0.0.1
10.0.0.4 > 8.0.0.2
10.0.0.1 > 8.0.0.1
10.0.0.2 > 8.0.0.2
т. д.
Это возможно?
По-видимому -j SNAT --persistent
работает только для пары src / dst, поэтому при подключении к разным адресатам нет гарантии, что будет использоваться один и тот же источник.
Вместо этого из man iptables-extensions
:
u32
U32 проверяет, имеют ли количество до 4 байтов, извлеченных из пакета, заданные значения. Спецификация того, что извлекать, является достаточно общей, чтобы найти данные с заданными смещениями из заголовков tcp или полезных нагрузок.
Если вам нужно ровно 2 ^ n IP-адресов после преобразования (здесь вы хотите 2, так что все в порядке), тогда легко использовать только правила 2 ^ n (здесь 2), проверив конец исходного IP-адреса по модулю 2 ^ n и выполнив выборочный SNAT по результату. Тогда решение:
iptables -t nat -I POSTROUTING -s 10.0.0.0/16 ! -d 10.0.0.0/16 -m u32 --u32 '12 & 0x1 = 0x1' -j SNAT --to-source 8.0.0.1
iptables -t nat -I POSTROUTING -s 10.0.0.0/16 ! -d 10.0.0.0/16 -m u32 --u32 '12 & 0x1 = 0x0' -j SNAT --to-source 8.0.0.2
12 - это положение исходного IP-адреса в пакете
Пожалуйста, замените -I на -A и все / 16 (вы сказали, что много!) При необходимости любого другого размера.
Если вы не знаете заранее целевые IP-адреса (8.0.0.1 и 8.0.0.2), тогда, конечно, вам придется использовать некоторые переменные в скрипте для замены значений (8.0.0.1 и 8.0.0.2).
Если бы у вас было 4 доступных общедоступных IP-адреса, вы бы изменили маску & 0x1
к & 0x3
и будет использовать в общей сложности 4 SNAT, по одному для каждого из 4 возможных результатов 1 2 3 0. И так далее...
Поскольку не существует эквивалентного правила расширения целевого объекта, кажется невозможным с помощью iptables выполнить «общее» преобразование целевого IP-адреса, чтобы напрямую использовать результат теста в уникальном правиле.
я делаю совпадение bpf, чтобы сделать работа мода для разделения любого количества внешних ip
как это ip % 3 == 2
этот код на bash
#!/bin/bash
mod=7
src_ip_mod (){
eq=$1
echo "15,48 0 0 0,84 0 0 240,21 0 11 64,32 0 0 12,2 0 0 1,52 0 0 ${mod},7 0 0 5,0 0 0 ${mod},44 0 0 0,7 0 0 5,96 0 0 1,28 0 0 0,21 0 1 ${eq},6 0 0 65535,6 0 0 0"
}
mod=3
iptables -t nat -A POSTROUTING -m bpf --bytecode "`src_ip_mod 0`" -j SNAT --to-source 8.0.0.1
iptables -t nat -A POSTROUTING -m bpf --bytecode "`src_ip_mod 1`" -j SNAT --to-source 8.0.0.2
iptables -t nat -A POSTROUTING -m bpf --bytecode "`src_ip_mod 2`" -j SNAT --to-source 8.0.0.3