Перенаправьте исходящий трафик к локальному серверу

Думаю, тебе стоит использовать это. Как я только что узнал, это стандартная утилита POSIX-specified .

du

Опции, указанные в POSIX, включают:

Утилита du должна соответствовать XBD Utility Syntax Guidelines .

Поддерживаются следующие опции:

  • -a. Кроме вывода по умолчанию, сообщите размер каждого файла, не относящегося к директории типа в файловой иерархии, корни которой лежат в указанном файле. Независимо от наличия опции -a, в списке всегда должны быть указаны недиректории, заданные в качестве файловых операндов.
  • -H Если в командной строке указана символическая ссылка, то du считает размер файла или иерархии файлов, на которые ссылается ссылка.
  • -k Запишите размер файлов в единицах измерения 1024 байта, а не в единицах измерения по умолчанию 512 байт.
  • -L Если символическая ссылка указана в командной строке или встречается во время обхода файловой иерархии, то du считает размер файла или файловой иерархии, на которые ссылается ссылка.
  • -s Вместо вывода по умолчанию сообщайте только общую сумму по каждому из указанных файлов.
  • -x При оценке размеров файлов оценивайте только те файлы, которые имеют то же устройство, что и файл, указанный файловым операндом. Указание более чем одной из взаимоисключающих опций -H и -L не считается ошибкой. Последняя указанная опция определяет поведение утилиты.

Проблема заключается в том, что она не сообщает о размере файла, а сообщает на disk-usage . Это разные понятия, и различия зависят от файловой системы. Если вы хотите получить размер файлов для набора файлов, вы можете использовать что-то вроде:

{   echo
    /usr/bin/ls -ndL .//*
} | sed '/\n/P;//D;N
\|//|s|\n|/&/|
$s|$|/|;s| .//|/\
/|;2!P;D'

Это довольно простой бит sed, который поддерживает двухстрочное адресное окно на выходе ls. Он работает, скользя по своему входу - всегда P прокручивая затем D поднимая самую старую из двух строк в своем шаблоне, а затем вытягивая Next input line, чтобы заменить его. По сути, это однострочный взгляд.

У него есть некоторые существенные недостатки в том виде, как они написаны. Например, для собственного удобства я избегал работы с ls -> linkpath и вместо этого использовал опцию -Ls, которая заставляет ls сообщать о цели соединения, а не о самом соединении. Она также предполагает только глобусы текущего каталога. Это зависит от / not происходящего в именах файлов - потому что это разделитель. На самом деле это довольно часто встречается - вы cd попадаете в каталог и cd - отступаете.

Все это может быть обработано, может быть, в несколько строк или больше, но это всего лишь демонстрация.

Ключевой компонент здесь - и причина просмотра - вот этот бит:

\|//|s|\n|/&/|

Когда самая новая линия в пространстве шаблонов содержит строку .// добавьте / к хвосту самой старой линии и вставьте / в голову самой новой. Затем я также заменяю .// на другой \n швеллер и еще два швеллера с линейным разделением.

И вот это:

drwxr-xr-x 1 1000 1000        6 Aug  4 14:40 .//dir*
drwxr-xr-x 1 1000 1000        0 Aug  4 14:40 .//dir1
drwxr-xr-x 1 1000 1000        6 Aug  8 17:34 .//dir2
drwxr-xr-x 1 1000 1000       22 Aug 10 18:12 .//dir3
drwxr-xr-x 1 1000 1000       16 Jul 11 21:59 .//new
-rw-r--r-- 1 1000 1000        8 Aug 20 11:32 .//newfile
-rw-r--r-- 1 1000 1000        0 Jul  6 11:24 .//new
file
-rw-r--r-- 1 1000 1000        0 Jul  6 11:24 .//new
file
link

становится таким:

/drwxr-xr-x 1 1000 1000        6 Aug  4 14:40/
/dir*/
/drwxr-xr-x 1 1000 1000        0 Aug  4 14:40/
/dir1/
/drwxr-xr-x 1 1000 1000        6 Aug  8 17:34/
/dir2/
/drwxr-xr-x 1 1000 1000       22 Aug 10 18:12/
/dir3/
/drwxr-xr-x 1 1000 1000       16 Jul 11 21:59/
/new/
/-rw-r--r-- 1 1000 1000        8 Aug 20 11:32/
/newfile/
/-rw-r--r-- 1 1000 1000        0 Jul  6 11:24/
/new
file/
/-rw-r--r-- 1 1000 1000        0 Jul  6 11:24/
/new
file
link/

Но что это за польза, верно? Ну, это все меняет:

IFS=/; set -f; set $(set +f
{   echo 
/usr/bin/ls -ndL .//*
}| sed '/\n/P;//D;N
\|//|s|\n|/&/|
$s|$|/|;s| .//|/\
/|;2!P;D'
)

unset IFS
while [ -n "$2" ]
do  printf 'Type :\t <%.1s>\tSize :\t %.0s%.0s%.0s<%d>%.0s%.0s%.0s\nFile :\t %s\n' \
        $2 "<$4>"
shift 4; done

OUTPUT

Type :       Size :   <6>
File :   
Type :       Size :   <0>
File :   
Type :       Size :   <6>
File :   
Type :       Size :   <22>
File :   
Type :       Size :   <16>
File :   
Type :   <->    Size :   <8>
File :   
Type :   <->    Size :   <0>
File :   
Type :   <->    Size :   <0>
File :   

1
26.12.2014, 20:14
2 ответа

Это не хорошая идея, чтобы использовать NetFilter для этого. Вам нужен обратный прокси [1], например, nginx или apache.

Если вы хотите использовать iPtable, вы можете отфильтровать от интерфейса в зависимости от поглощения:

iptables -t nat -A OUTPUT -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:4000

[1] http://nginx.com/resources/admin-guide/reverse-proxy/

1
27.01.2020, 23:51

Согласитесь с комментариями @Bratchley, мне удалось заставить его работать, добавив опцию --uid-owowner.

Эту команду я использую:

iptables -t nat -A OUTPUT -m owner --uid-owner 1000 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:4000

Так как на сервере apache есть определенный пользователь, перенаправляется только трафик с uid 1000.

0
27.01.2020, 23:51

Теги

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