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

Сделайте назначение SNAT фиксированным / согласованным для каждого конкретного IP-источника

Я хочу, чтобы каждый исходный 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