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

iptables опция --persistent

Использовал до недавнего времени iptables и ядро 2.2.24 когда был same.

Обновил ядро, iptables (почитав перед эти про исчезновение и реинкарнацию same'а).

Делаю

iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source ххх.ххх.226.128-ххх.ххх.226.250
Получаю криво работающую аську, неработающее "контактное" видео, через раз работает SSL.

 

Делаю

iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source ххх.ххх.226.128-ххх.ххх.226.250 --persistent
Я так понимаю в таком варианте выдаются сопоставлений 1:1 и когда заканчиваются белые адреса из диапазона остальные клиенты идут лесом ?

 

Подскажите пожалуйста что сделать с NAT'ом чтобы он корректно работал ?

 

Linux sh 2.6.31.4 #1 SMP x86_64 GNU/Linux

iptables v1.4.5

Edited by pchol

Share this post


Link to post
Share on other sites
Я так понимаю в таком варианте выдаются сопоставлений 1:1 и когда заканчиваются белые адреса из диапазона остальные клиенты идут лесом ?
--persistent

Gives a client the same source-/destination-address for each connection.

Не сказано, что адрес выделенный.

 

Share this post


Link to post
Share on other sites

Мы портировали SAME со старых версий ядер, это не сложно (пока).

Share this post


Link to post
Share on other sites

Всё казалось гораздо лучше.

--persistent работает как старый same. Сутки прошли, жалоб нет.

Всем спасибо.

Share this post


Link to post
Share on other sites

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

-j SNAT ... --persistent

при каждом риконекте по pppoe/pptp натить абонента на новый адрес, а именно при accounting-stop на радиусе чистить условия выбора исходящего нат адреса по абоненту.

Почему-то подумалось что persistent основывает выбор адреса на который натить из коннтрака. Собрал тестовую схему, пробую достучаться до инета с src адреса х.х.х.х, проверяю исходящий адрес - y.y.y.y. Чищу -

conntrack -D -s x.x.x.x

conntrack -D -d x.x.x.x

захожу тестовым компом и снова тот же отначеный y.y.y.y.

 

Может кто в курсе из каких условий выбирается nat ip если использовать --persistent? Не пнете в нужную сторону?

 

пс. можно насоздавать кучу ipset-ов и каждый натить на определенный ip. Но некрасиво (( А так сразу динамические адреса и всего 1 правило в iptables

ппс. для того, что-бы сразу по впн выдавать чесные адреса из пула не хватает адресов

 

Share this post


Link to post
Share on other sites

Может кто в курсе из каких условий выбирается nat ip если использовать --persistent? Не пнете в нужную сторону?

По трем IP-адресам. Внутренний IP-адрес источника, внешний начальный, внешний конечный. Для себя накидал программку, на вход 3 ip на выходе внешний ip. Потом вокруг нее написал парсер правил iptables на питоне и теперь счастлив.

#include <stdio.h>
#include <stdint.h>

typedef uint8_t  u8;
typedef uint32_t u32;
typedef uint64_t u64;
#define JHASH_INITVAL           0xdeadbeef

u32 parseIp(char *ipStr)
{
       int i1, i2, i3, i4;
       sscanf(ipStr, "%d.%d.%d.%d", &i1, &i2, &i3, &i4);
       return (i1 << 24) + (i2 << 16) + (i3 << 8) + i4;
}

u32 rparseIp(char *ipStr)
{
       int i1, i2, i3, i4;
       sscanf(ipStr, "%d.%d.%d.%d", &i1, &i2, &i3, &i4);
       return (i4 << 24) + (i3 << 16) + (i2 << 8) + i1;
}

static inline u32 rol32(u32 word, unsigned int shift)
{
       return (word << shift) | (word >> (32 - shift));
}

static inline u32 jhash_2words(u32 a, u32 b, u32 c)
{
       a += JHASH_INITVAL;
       b += JHASH_INITVAL;
       c ^= b; c -= rol32(b, 14);
       a ^= c; a -= rol32(c, 11);
       b ^= a; b -= rol32(a, 25);
       c ^= b; c -= rol32(b, 16);
       a ^= c; a -= rol32(c, 4);
       b ^= a; b -= rol32(a, 14);
       c ^= b; c -= rol32(b, 24);
       return c;
}

int main(int argc, char *argv[]) {
       if (argc < 4) {
               printf("fail");
       }
       u32 minip, maxip, srcip, j, result;
       minip = parseIp(argv[1]);
       maxip = parseIp(argv[2]);
       srcip = rparseIp(argv[3]);
       j = jhash_2words(srcip, 0, 0);
       j = ((u64)j * (maxip - minip + 1)) >> 32;
       result = minip + j;
       printf("%d.%d.%d.%d\n", (u8)(result >> 24), (u8)(result >> 16), (u8)(result >> 8), (u8)result);
       return 0;
}

Share this post


Link to post
Share on other sites

дык русским по белому же вам в соседнем топике ответили:

потом запилили туда рандом и теперь только сливать трансляции

Share this post


Link to post
Share on other sites

теперь только сливать трансляции

 

 

Не рандом точно! Внешний адрес трансляции не меняется! Просто формулу поменяли похоже.

Share this post


Link to post
Share on other sites

Спецы по ядрам - не смотрели как сейчас ядро выбирает IP под NAT?

Ну и собственно интересно как мониторить, что IP досыпать надо..

Share this post


Link to post
Share on other sites

Я смотрел, даже патчил, по хешу насколько я помню. Оно достаточно долго может прожить на небольшом количестве, главное чтоб не было много коннектов к одинаковому dst ip/port с небольшого количества адресов.

Share this post


Link to post
Share on other sites

Спецы по ядрам - не смотрели как сейчас ядро выбирает IP под NAT?

Ну и собственно интересно как мониторить, что IP досыпать надо..

 

Не так давно была темка здесь, там выяснили что до ядра 3.3 (вроде бы) был просто хеш и можно было точно определить какой ip будет, потом добавили рандом

 

Поищите, там я выкладывал исходник на C для старых ядер чтобы вычислять какой public ip будет

Share this post


Link to post
Share on other sites

Ну вычислить кто во что натился можно с помощью ipt_NETFLOW

Данный модуль умеет NAT Events и работает шустрее, чем conntrack(-tools) через нетлинк.

 

Меня именно как мониторить использование пулла скорее интерисует.

Share this post


Link to post
Share on other sites

так как народ обычно мониторит использование пулла?

 

Ну и ещё вопрос.. кто сколько PPS натил на линукс серверах в плане PPS/полосы?

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