Как я могу вывести список всех подключений к моему хосту, включая подключения к гостевым LXC?

Вы могли сделать что-то вдоль этих строк:

file=/some/file
newtext='sol { mass = 42, start = 9.2 }'
tac -- "$file" | 
  NEWTEXT=$newtext awk -v size="$(wc -c < "$file")" '
    $1 ~ /^[^#]/ {
      system("dd bs=1 seek=" size - length(footer) " conv=notrunc if=/dev/null")
      printf "%s\n%s", ENVIRON["NEWTEXT"], footer
      exit
    }
    {footer=$0 "\n" footer}' 1<> "$file"

Это перезаписывает файл на месте и только хранит нижний колонтитул в памяти. Этому нужен нестандартный GNU tac команда. Файл должен быть файлом обычного текста.

5
16.05.2015, 03:09
4 ответа

В bash Ctl + alt + e выполняет расширение оболочки, таким образом вводя ! 1255 , а затем нажимая эту комбинацию, заменяет текущую строку содержимым записи истории 1255

-121--29567-

Нажатие клавиши Ctrl + R (которая представляет собой привязку ключа обратного инкрементного поиска emacs как @ gnp, переданную в комментариях) в терминале позволяет выполнять поиск конкретной команды в области. Команда будет показана и может быть отредактирована перед выполнением. Вы увидите что-то подобное:

enter image description here

Источник

-121--29565-

Пока мне повезло получить соединения контейнера, запустив netstat из контейнера:

sudo docker exec -it <containerIdOrName> netstat

Очевидно, контейнер должен быть установлен.

-2
27.01.2020, 20:41

Я думаю, вы можете использоватьsudo conntrack -L

conntrack is a userspace command line program targeted at system administrators. It enables them to view and manage the in-kernel connection tracking state table.

Если пакет не установлен, требуетсяconntrack-tools(в Fedora и т. д. )илиconntrack(в Debian, Ubuntu и т. д. ).

1
27.01.2020, 20:41

Аналогичным обходным решением является выполнение команды netstat/lsof для всего сетевого пространства имен с

sudo ip -all netns exec ss -p -ut 

или

sudo ip -all netns exec lsof -i

или

sudo ip -all netns exec netstat -ltup 
0
27.01.2020, 20:41

Ядро указывает состояние соединений на /proc/net/tcp, /proc/net/udpи т. д., но поскольку пространства имен разделяют сетевой стек, если приложение выполняется внутри контейнера (другое пользовательское пространство )и подключено к сети хост /proc/net/tcpне показывает свое соединение,

conntrackможно использовать для отображения всего соединения машины , но это не работает для некоторых интерфейсов, таких как wireguard...

ip -all netns exec commandможно использовать для запуска команд во всех пользовательских пространствах , но это ограничено пользовательскими пространствами, созданными с помощью команды ip.

С точки зрения приложения, работающего в контейнере, его состояние сетевого стека по-прежнему видно на хосте в расположении /proc/$pid/net/tcp, поэтому в качестве обходного пути, ожидающего написания надлежащего инструмента на языке c, я написал небольшой сценарий bash, который зацикливается. на /proc/$pid/net/tcp[udp]и объедините все состояния, чтобы иметь возможность перечислить все подключения к машине.

Скрипт сначала объединяет все /proc/$pid/net/tcpили /proc/$pid/net/udpсортирует их, удаляет дубликаты, переводит значение в читаемый текст и печатает их (скрипт требует find, grep, xargs, awk, strtonum, sortиuniq)

Для TCP

find /proc/ 2>/dev/null | grep tcp | grep -v task | grep -v sys/net | xargs grep -v rem_address 2>/dev/null | awk '{x=strtonum("0x"substr($3,index($3,":")-2,2)); y=strtonum("0x"substr($4,index($4,":")-2,2)); for (i=5; i>0; i-=2) x = x"."strtonum("0x"substr($3,i,2)); for (i=5; i>0; i-=2) y = y"."strtonum("0x"substr($4,i,2))}{printf ("%s\t:%s\t ----> \t %s\t:%s\t%s\n",x,strtonum("0x"substr($3,index($3,":")+1,4)),y,strtonum("0x"substr($4,index($4,":")+1,4)),$1)}' | sort | uniq --check-chars=25

Для UDP

find /proc/ 2>/dev/null | grep udp | grep -v task | grep -v sys/net | xargs grep -v rem_address 2>/dev/null | awk '{x=strtonum("0x"substr($3,index($3,":")-2,2)); y=strtonum("0x"substr($4,index($4,":")-2,2)); for (i=5; i>0; i-=2) x = x"."strtonum("0x"substr($3,i,2)); for (i=5; i>0; i-=2) y = y"."strtonum("0x"substr($4,i,2))}{printf ("%s\t:%s\t ----> \t %s\t:%s\t%s\n",x,strtonum("0x"substr($3,index($3,":")+1,4)),y,strtonum("0x"substr($4,index($4,":")+1,4)),$1)}' | sort | uniq --check-chars=25

Вывод выглядит следующим образом:(обратите внимание, что pid не является точным и используется только для идентификации контейнера)

127.0.0.1      :80       ---->   0.0.0.0        :0      /proc/10176/net/tcp:
192.168.0.2    :33882    ---->   192.30.253.125 :443    /proc/10176/net/tcp
192.168.0.2    :34020    ---->   192.30.253.125 :443    /proc/10176/net/tcp:
192.168.0.2    :34162    ---->   192.30.253.125 :443    /proc/10176/net/tcp:
192.168.0.2    :36242    ---->   192.30.253.124 :443    /proc/10176/net/tcp:
192.168.0.2    :37324    ---->   192.30.253.124 :443    /proc/10176/net/tcp:
192.168.0.2    :40122    ---->   216.239.38.21  :80     /proc/10176/net/tcp:
192.168.0.2    :40124    ---->   216.239.38.21  :80     /proc/10176/net/tcp:

Также я нашел отличный инструмент для управления пространством имен с некоторыми очень полезными командами, nsutils

9
27.01.2020, 20:41

Теги

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