LINUX.ORG.RU
решено ФорумAdmin

ip_local_port_range

 ,


0

2

Приветствую. Есть такой параметр net.ipv4.ip_local_port_range - диапазон портов для исходящих соединений. Можно ли как-то его применить не глобально для всей системы, а для процесса или пользователя, или хоста к которому устанавливается соединение (самый идеальный вариант)?

Для чего это мне понадобилось: сервер некоторой конторы, куда мне нужно устанавливать tcp соединения(много соединений), сидит за роутером. Этот роутер начинает блокировать соединения при большом разбросе исходящих портов. Если поставить

net.ipv4.ip_local_port_range = 40000 50000
то всё ок. Блокировки на их стороне больше не срабатывают. Но такого диапазона мало - вижу ошибки в логах (например, от nginx):
[crit] 6012#0: *278755918 connect() to x.x.x.196:80 failed (99: Cannot assign requested address)

Возможно, у них там баг в прошивке или фича защиты от (D)DoS. Пытаются фиксить свой роутер уже пару месяцев, но толку нет.


какой программой тебе нужно устанавливать соединения на этот сервер? Может имеет смысл поковырять именно ее?

Pinkbyte ★★★★★
()

а как насчёт РАТ?

zolden ★★★★★
()

Pinkbyte:

Программа самописная на Си. Соединение устанавливает curl. Могу попробовать сделать что-то вроде этого(последний коммент), если других вариантов не будет.

zolden:

Я только за. Уже думал на эту тему - о подмене src port. Но я плохо себе представляю как это должно работать. Например, как выставить случайный исходящий порт в выбранном диапазоне в правиле iptables? И установится ли tcp соединение если я правилом перепишу порт?

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

Вопрос в том, чтобы не лезть в чужой проект. Сделать всё на уровне системы. Есть же фичи типа cgroups например(да, оно не умеет то, что мне надо). Ну и iptables хорош при правильном использовании. Да мало ли других способов вставить временный костыль.

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

не лезть в чужой проект
вставить временный костыль

Я конечно дико извиняюсь, если следующим выражением тебя обижу, не хочу учить кого-то делать работу, но тебе не кажется что ставить костыли вместо того чтобы поставить в известность авторов чужого проекта о проблеме - это немного неправильное решение?

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

Согласен, что решение неправильное, если оно постоянное. Но если ненадолго, то можно. Поэтому я собирался поставить именно временный костыль на несколько дней, пока разработчик не переключится на этот проект и не придумает решение. А если очень повезет - так вообще на той стороне железку пофиксят. Я убираю костыль, все довольны. Такие дела.

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

Оно и так в KVM виртуалке уже вертится.

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

Решено. Сделал быстрофикс в самом приложении:

if (...тот самый сервер) 
{
    curl_easy_setopt(curl, CURLOPT_LOCALPORT, 15000);
    curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 10000);
}
Что означает использовать исходящий порт только в пределах от 15,000 до 25,000.

tcpdump показал, что всё правильно сделал.
Всё работает, все довольны.

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