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

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)

Edited by Andy52280

Share this post


Link to post
Share on other sites

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

 

Share this post


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

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

 

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

Share this post


Link to post
Share on other sites

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

 

#Создаем хэш 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

Share this post


Link to post
Share on other sites
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?

 

Share this post


Link to post
Share on other sites
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?
не сломается.
Edited by Ilya Evseev

Share this post


Link to post
Share on other sites

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

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

 

Share this post


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

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

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

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