LINUX.ORG.RU

iptables snat + несколько ip


0

0

Есть выделенный сервер с несколькими ip адресами (то есть если обращаться на адреса в диапазоне 64.120.*.3-64.120.*.6 - обращения прийдут на адрес 64.120.*.2)

Стоит задача сделать так, чтобы все исходящие запросы с сервера шли с ip адресов диапазона, причем рандомно. Почитав мануалы iptables, я пришел к конструкции вида:

iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to 64.120.*.3-64.120.*.6
Софт, запущенный на сервере обращается на php скрипт, который логирует ip, так вот почему-то ip для кажлого запроса берется один и тот же 64.120.*.4

Просьба подскажите, где я допустил ошибку?


ИМХО, SNAT не делает выбор случайного ip-адреса, а наоборот предпочитает для каждого исходно src-ip адреса выбирать один и то же SNAT ip адрес. Така php скрип всегда идёт с одно адреса его и SNAT'ят с одно адреса. Наверное вам нужно 4 SNAT правила (по одному для каждого адреса), в каждом из которых добавить "-m random" (если это ещё работает).

mky ★★★★★
()
Ответ на: комментарий от mky
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to 64.120.*.3-64.120.*.6 -m random

выдает:

iptables v1.3.5: Couldn't load match `random':/lib/iptables/libipt_random.so: cannot open shared object file: No such file or directory

насчет того, что SNAT при диапазоне source IP выбирает рандомно - я вычитал в документации.

насчет того, если создать отдельно 4 правила для каждого IP без рандома - в таком случае мне кажется при первом совпадении условия - правило начнет выполняться, так как условия для всех правил одинаковые, то будет выполняться только первое правило (как вариант - все правила - тогда source IP тоже будет один).

himas
() автор топика
Ответ на: комментарий от himas

>насчет того, что SNAT при диапазоне source IP выбирает рандомно - я вычитал в документации.

Не знаю, в какой документации это написано, но с точки зрения протоколов крайне не желательно натить одно и того же клиента с разных адресов. То есть если у нас есть компьютер в локалке и он пошел в инет и мы его отнатили от адреса 64.120.*.3 то желательно, чтобы все последующие коннекты этого клинета аналогично были отначены от этого же адреса. Иначе противоположной стороне (серверу) может не пронравиться, что к нему идёт обращение одного и тогоже клиента с разных ip-адресов.

Относительно random вам нужно было почитать гугл. Это было (а может и сейчас есть) расширение iptables, которое обеспечивало срабатывание правила с заданной вероятностью. То есть если это правило у вас работало, можно было сделать 4 SNAT правила и через "-m random --average 25" сделать чтобы не всегда срабатывало первое SNAT правило.

Может у вас в iptables есть "-m statistic"? Тогда прочитате man и опредлите, что вам нужно "--mode random" или "--mode nth".

mky ★★★★★
()
Ответ на: комментарий от mky

насчет random, я скачал и собрал на сервере новый iptables 1.4.7, там точно такая же ошибка выскакивает

насчет -m statistic - огромное спасибо, сделал для каждого IP правило:

iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.5 -j SNAT --to 64.120.*.3
а для последнего IP с вероятностью 1 (на случай, если предыдущие правила не применятся)

Не знаю, в какой документации это написано, но с точки зрения протоколов крайне не желательно натить одно и того же клиента с разных адресов. То есть если у нас есть компьютер в локалке и он пошел в инет и мы его отнатили от адреса 64.120.*.3 то желательно, чтобы все последующие коннекты этого клинета аналогично были отначены от этого же адреса. Иначе противоположной стороне (серверу) может не пронравиться, что к нему идёт обращение одного и тогоже клиента с разных ip-адресов.

согласен, взять хотя бы в расчет специфику соединения icq-клиентов, где сначала идет авториация на один IP, а потом создается новое соединение на другой IP для работы, то при снате с разных адресов возникают проблемы.

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

himas
() автор топика
Ответ на: комментарий от himas

еще есть вариант разделить нагрузку при помощи прямого указания -s, то есть определенные IP снатить все время через один и тот же IP. но тут есть один ньюанс, клиенты, подключающиеся к серверу будут со всего интернета.

возникла идея разделять по последней цифре IP адреса, то есть у меня 4+1 внешних IP, значит IP вида *.*.*.0-50 будут снатиться через первый внешний IP, *.*.*.51-100 через второй и т.д

возможно ли это реализовать средствами iptables?

himas
() автор топика
Ответ на: комментарий от himas

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

Если же вам нужно явно задавать SNAT по последней цифре, то надо писать маску. В iptables маска у ip-адреса может быть любая, поэтому такое правило:

iptables -s 0.0.0.64/0.0.0.63

должно соответствовать адресам *.*.*.0-63. А если надо именно 0-50, то надо несколько правил/масок.

Относительно того «как запоминать подмененный Source IP», то весь SNAT в ядре, из user-space можно только наблюдать за тем, что от какого ip отначено (cat /proc/net/ip_conntrack). В ядре сущетсвует поддержка NAT для различных протоколов, например, ftp, и в правилах можно узнать для каждого пакета, является ли представляемое им соединение связанным (RELATED) с уже установленным, но, вроде нельзя узнать какие-либо свойства того (ранее установленного) соединения.

То есть если мы SNAT'им ftp-сontrol соедиение со случайного ip-адреса, то нельзя написать такие правила, которые бы SNAT'или ftp-data с этого же ip-адреам. Вышенаписанное ИМХО, если кто знает как, пусть сообщит.

mky ★★★★★
()
Ответ на: комментарий от mky

Очень признателен за помощь, я нашел еще одно решение по сохранению сначенного IP для одного и того же клиента - это параметр --persistent (реинкарнация старого SAME).

В итоге конструкция принимает вид:

iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to 64.120.*.3-64.120.*.6 --persistent

himas
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.