Как использовать IP_TRANSPARENT, чтобы избежать слишком много-TIME_WAIT

Нет разбиения слов (, как в функции, которая разбивает переменные при раскрытии без кавычек )в этом коде, поскольку $myvarне заключен в кавычки.

Однако существует уязвимость, связанная с внедрением команд, поскольку $myvarрасширяется перед передачей в bash. Таким образом, его содержимое интерпретируется как код bash!

Пробелы в нем вызовут передачу нескольких аргументов в cdне из-за разбиения слов , а потому, что они будут проанализированы как несколько токенов в синтаксисе оболочки. При значении bye;rebootпроизойдет перезагрузка!¹

Вот вам бы:

sudo bash -c 'cd -P -- "$1"' bash "$myvar"

(где вы передаете содержимое $myvarв качестве первого аргумента этого встроенного скрипта; обратите внимание, как $myvarи $1были заключены в кавычки для соответствующей оболочки, чтобы предотвратить разбиение IFS -слова -(и подстановку )).

Или:

sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'

(где вы передаете содержимое $myvarв переменную окружения ).

Конечно, вы не добьетесь ничего полезного, запустив толькоcdво встроенном скрипте (, кроме как проверив, может ли rootcdтуда ). Предположительно, вы хотите, чтобы этот скрипт cdтут же делал что-то еще, например:

sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"

Если намерение состояло в том, чтобы использовать sudo, чтобы иметь возможность cdв каталог, к которому у вас иначе нет доступа, то это не может работать.

sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"

запустит интерактивный bashс текущим каталогом в $myvar. Но эта оболочка будет работать как root.

Вы могли бы сделать:

sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"

Чтобы получить непривилегированный интерактив bashс текущим каталогом $myvar,но если у вас изначально не было прав доступа cdк этому каталогу, вы не сможете ничего делать в этом каталоге, даже если это ваш текущий рабочий каталог.

$ myvar=/var/spool/cron/crontabs
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ ls
ls: cannot open directory '.': Permission denied

Исключением будет, если у вас есть разрешение на поиск в самом каталоге, но не в одном из компонентов каталога его пути:

$ myvar=1/2
$ mkdir -p "$myvar"
$ chmod 0 1
$ cd 1/2
cd: permission denied: 1/2
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ pwd
/home/stephane/1/2
bash-4.4$ mkdir 3
bash-4.4$ ls
3
bash-4.4$ cd "$PWD"
bash: cd: /home/stephane/1/2: Permission denied

¹ Строго говоря, для значений $myvar, таких как$(seq 10)(буквально ), при расширении этой подстановки команд оболочкой bash, запускаемой как root

, будет происходить разбиение слов.
0
02.01.2020, 14:55
2 ответа

Обратите внимание: поскольку вы не упомянули, с какой ОС вы работаете, я предполагаю, что это GNU/Linux (, что может быть неверным предположением, поскольку это «UNIX и Linux» ).

Настройка поведения ядра

Под Linux настройка стека TCP во время выполнения обычно достигается с помощью sysctlи/или procfs.

Итак, вам, вероятно, следует начать с просмотра:

  • TCP (7 )справочная страница
  • Файлы под Documentation/sysctl/в исходном коде вашего ядра. (Вы также можете использовать этот сайт).

Чтобы узнать, есть ли какие-либо опции/параметры, которые позволяют это сделать.

Еще один шаг

Беглый взгляд на исходный код ядра(net/ipv4/tcp.c)показывает, что использование флага FIN для завершения работы "запрограммировано" и не может быть изменено... извините.

Может быть, вы можете попытаться написать патч, чтобы изменить это поведение... но я бы не стал устанавливать такой патч на рабочем сервере;-)

В заключение

Похоже, сделать то, что вы просили, невозможно.

Тем не менее, возможно, вы сможете смягчить проблему «слишком много ВРЕМЕНИ _WAIT», настроив некоторые другие параметры, такие как net.ipv4.tcp _fin _timeout (, также доступные в/proc/sys/net/ipv4/tcp_fin_timeout).

Обратите внимание: если у вас есть доступ к исходному коду приложения, вы также можете настроить его поведение, используя setsockopt()для созданного сокета.

0
28.01.2020, 02:58

Не IP _ПРОЗРАЧНЫЙ, но здесь может быть другое решение вашей проблемы.

(Публикация как ответ, а не как комментарий, чтобы блок кода был читабельным)

Если ваш Linux-компьютер является клиентом, а не сервером, вы можете поэкспериментировать со следующим в /etc/sysctl.conf по одному или вместе, а затем sysctl -p. Пожалуйста, посмотрите, что каждый из них делает, чтобы увидеть, подходит ли каждый из них для вашего использования.

net.ipv4.ip_local_port_range = 2000 65535
net.ipv4.tcp_tw_reuse = 1

Отличная статья, объясняющая кровавые подробности:https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux

0
30.03.2020, 06:12

Теги

Похожие вопросы