Jump to content
Калькуляторы

Алгоритм SNAT --persistent

Кто-то знает алгоритм трансляции адресов при использовании опции SNAT --persistent ?

 

Когда использовали опцию --same - все было понятно. Когда перешли на --persistent - старый алгоритм не подходит.

В итоге мне нужно зная ip отправителя и правило iptables - получить ip под которым выйдет пакет в свет.

 

Смотрел в исходниках. Я в Си - полный ноль. Не смог разобраться =((

Share this post


Link to post
Share on other sites

Можно использовать -j NETMAP, там с алгоритмом всё предельно ясно.

NETMAP is a new implementation of the SNAT and DNAT targets where the host part of the IP address isn't changed. It provides a 1:1 NAT function for whole networks which isn't available in the standard SNAT and DNAT functions. For example, lets say we have a network containing 254 hosts using private IP addresses (a /24 network), and we just got a new /24 network of public IP's. Instead of walking around and changing the IP of each and every one of the hosts, we would be able to simply use the NETMAP target like -j NETMAP -to 10.5.6.0/24 and voila, all the hosts are seen as 10.5.6.x when they leave the firewall. For example, 192.168.0.26 would become 10.5.6.26.

Share this post


Link to post
Share on other sites

Сам выбор:

        /* Hashing source and destination IPs gives a fairly even
         * spread in practice (if there are a small number of IPs
         * involved, there usually aren't that many connections
         * anyway).  The consistency means that servers see the same
         * client coming from the same IP (some Internet Banking sites
         * like this), even across reboots. */
        minip = ntohl(range->min_ip);
        maxip = ntohl(range->max_ip);
        j = jhash_2words((__force u32)tuple->src.u3.ip,
                         range->flags & IP_NAT_RANGE_PERSISTENT ?
                                0 : (__force u32)tuple->dst.u3.ip ^ zone, 0);
        j = ((u64)j * (maxip - minip + 1)) >> 32;
        *var_ipp = htonl(minip + j);

 

Тоесть алгоритм то несложный , но узнать под каким ip уйдет можно только выполнив вышеприведенный кусок кода(просто так не прикинуть - хеш всеже). Как вариант - написать мелкую утилитку для рассчета , но я так понимаю не совсем устроит?

Share this post


Link to post
Share on other sites
у меня трансляция не 1:1

NETMAP не требует трансляции именно 1:1. Зато он строго регламентирует, в какой именно IP из пула будет транслирован src-адрес клиента. То, что вам нужно.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this