Перейти к содержимому
Калькуляторы

Linux: организация NAT на основе IPSet Перевод NAT с FreeBSD (kernel NAT) на Linux

Появилась необходимость перевести NAT на платформу Linux (в основном из-за неадеквата в работе bonding(lagg/lacp) и ECMP(flowtable+radix_mpath) под нагрузкой во FreeBSD).

Во FreeBSD сейчас создаются две таблицы в первой-белые IP, во второй - серые подсетки. Причем на один белый IP может натиться несколько серых сеток.

Привязка белых IP - статическая. Входящий/исходящий интерфейсы не принципиальны - отрабатывает на все направления. Количество серых сеток порядка 15К.

 

Во FreeBSD схема выходит достаточно лаконичной:

ipfw table 14 add REAL_IP1 8868
ipfw table 15 add RFC1918_NET1 8868
ipfw table 14 add REAL_IP1 8868
ipfw table 15 add RFC1918_NET2 8868
...
ipfw table 14 add REAL_IPn 8xxx
ipfw table 15 add RFC1918_NETm 8xxx


ipfw nat 8868 config ip REAL_IP1
...
ipfw nat 8xxx config ip REAL_IPn


ipfw add yyyy set 10 nat tablearg all from any to table(14) // IN NAT
...
ipfw add zzzz set 10 nat tablearg all from table(15) to any // OUT NAT

Подскажите, пожалуйста, каким образом ПРАВИЛЬНЕЕ реализовать подобную схему в Linux?

Не хотелось бы городить под каждую пару REAL_IP/RFC1918_NET несколько правил в iptables да и минимизация нагрузки на CPU (2x Intel X5650) не помешает.

Кроме того желательно иметь возможность на лету добавлять некий новый RFC1918_NETx на уже использующийся в текущих трансляциях NAT REAL_IP скриптом.

На данный момент разбираюсь с Ubuntu-10.10 Server x86_64 (2.6.35-22-server)

Изменено пользователем Andy52280

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А с чем связано именно такое разделение серых адресов по реальным? Может можно все серые отнатить на пул реальных адресов, а кому можно/нельзя натится определить фильтрами?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А с чем связано именно такое разделение серых адресов по реальным? Может можно все серые отнатить на пул реальных адресов, а кому можно/нельзя натится определить фильтрами?
Во-первых, не смотря на наличие СОРМ, периодически напрягают и ФСБ и МВД по конкретным реальникам. При статическом соответствии, скажем 8 клиентов (8 сеток /29) на 1 белый IP - сузить круг подозреваемых для углубленного анализа статистики достаточно просто. Учет статистики у нас ведется по серым адресам.

Во-вторых, исторически так сложилось, что такая схема была удобнее на FreeBSD/ipfw и клиенты к ней уже привыкли. Многие используют реальники в фильтрах для системы клиент-банк (есть еще такие кривые банки, которые фильтруют клиентов по IP ).

 

Впрочем, если схема нетривиально ложится на реализацию NAT в Linux - можно рассмотреть какой-нибудь альтернативный вариант. Но в идеале хотелось бы ее оставить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Примерно вот так:

 

#Создаем хэш IPSET для внешнего IP xxx.xxx.88.68

ipset -N NET88_68 nethash

ipset -A NET88_68 192.168.0.0/24

ipset -A NET88_68 192.168.0.1/24

ipset -A NET88_68 192.168.0.2/24

 

 

#натим

 

iptables -m set -t nat -I POSTROUTING --set NET88_68 src -j SNAT --to-source xxx.xxx.88.68

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

iptables -m set -t nat -I POSTROUTING --set NET88_68 src -j SNAT --to-source xxx.xxx.88.68

Прошу прощения, если прошу разжевать азы, но если

1) нужно будет, скажем входящие пакеты на порт 80 реального IP xxx.xxx.88.68 пробросить на конкретный серый IP (192.168.0.10) из NET88_68, а входящие пакеты на порт 10080 - на IP 92.168.1.10 из NET88_68, то

Какие правила нужно будет добавить в iptables для этой цели и не сломается ли при этом NAT для остальных IP из NET88_68?

2) нужно будет пробросить все пакеты, приходящие на IP xxx.xxx.88.68 и не имеющие соответствий в таблице conntrack, на конкретный серый IP (192.168.0.10) из NET88_68

Какие правила нужно будет добавить в iptables для этой цели и не сломается ли при этом NAT для остальных IP из NET88_68?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Возможно вам необходимо почитать статью про iptables. Советую прочитать iptables tutorial. Может вот хватит данной ссылки

http://www.opennet.ru/docs/RUS/iptables/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1) нужно будет, скажем входящие пакеты на порт 80 реального IP xxx.xxx.88.68 пробросить на конкретный серый IP (192.168.0.10) из NET88_68, а входящие пакеты на порт 10080 - на IP 92.168.1.10 из NET88_68, то

Какие правила нужно будет добавить в iptables для этой цели

iptables -t nat -N dnat1

iptables -t nat -A dnat1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.10

iptables -t nat -A dnat1 -p tcp --dport 10080 -j DNAT --to-destination 192.168.1.10

iptables -t nat -A PREROUTING -i $INET_IFACE -d xxx.xxx.88.68 -j dnat1

 

и не сломается ли при этом NAT для остальных IP из NET88_68?
не сломается.
Изменено пользователем Ilya Evseev

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо. Картина проясняется.

А относительно 2) как реализуется проброс адреса? и могул ли при этом полноценно работать оставшиеся IP из NET88_68?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А относительно 2) как реализуется проброс адреса?
Сильно экзотический вариант. Возможно,

iptables -t nat -A PREROUTING -m conntrack --ctstate NEW -j DNAT --to-destination ...

и могул ли при этом полноценно работать оставшиеся IP из NET88_68?
Если в правиле указан конкретный IP, пакеты для/от остальных адресов в это правило не попадут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.