Назад | Перейти на главную страницу

дамп tcp-соединений без tcpdump

В модуле centos мне нравится сбрасывать TCP-соединения - я хотел бы увидеть, пытается ли сервер отправлять запросы на определенный IP-адрес. Обычно tcpdump помогает, но tcpdump не устанавливается, и установка программного обеспечения не является вариантом (из-за политики компании). Боюсь, что netstat не покажет мне ни одного запроса.

Так что мне было интересно, какие еще варианты у меня есть. У меня есть root-доступ на сервере.

Я бы очень постарался получить tcpdump. При этом некоторые альтернативы, чтобы узнать, существует ли определенное соединение для IP:

strace:

[kbrandt@ny-kbrandt01: ~] strace -e trace=network nc 1.2.3.4 1234
...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("1.2.3.4")}, 16) = -1 EINPROGRESS (Operation now in progress)

lsof:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11434
[kbrandt@ny-kbrandt01: ~] lsof -p 11434
....
nc      11434 kbrandt    3u  IPv4 4543149      0t0     TCP 10.7.0.78:58886->1.2.3.4:search-agent (SYN_SENT)

netstat:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11486
[kbrandt@ny-kbrandt01: ~] sudo netstat -a -p | grep 11486
tcp        0      1 10.7.0.78:58891             1.2.3.4:search-agent        SYN_SENT    11486/nc

Конечно, у вас есть python?

from socket import * 
from struct import unpack 
import sys 

INTERFACE = "eth0"
TARGET = "8.8.8.8" 

if __name__ == "__main__": 
  sock = socket(AF_PACKET, SOCK_DGRAM, 0x0800) 
  sock.bind((INTERFACE, 0x0800)) 
  while True: 
    data = sock.recvfrom(1500, 0)[0] 
    ip = inet_ntop(AF_INET, data[12:16]) 
    if ip == TARGET: 
      print "GOT TARGET" 
      sys.exit(1)

Это приведет к выходу с "GOT TARGET", если IP-адрес будет совпадать. Поскольку TCP должен отправить что-то обратно во время рукопожатия, он должен перехватить что-либо с определенного целевого адреса. Впрочем, мне все равно, является ли протокол TCP или UDP (я тоже не проверяю).

Не забудьте изменить TARGET и INTERFACE.

Iptables имеет возможность отладки, которую также можно использовать для анализа трафика.

Решение описано по URL-адресу ниже.

Правила отладки в Iptables

Также стоит прочитать следующий URL-адрес, чтобы настроить ведение журнала вывода трассировки в файл по вашему выбору.

http://backreference.org/2010/06/11/iptables-debugging/

Я бы не стал считать это решение равным tcpdump, но это можно сделать с помощью минимальной установки Centos. Вам нужно быть осторожным, чтобы не заполнить диск журналами, потому что tcpdump намного эффективнее использует диск. Выключайте ведение журнала, когда оно не требуется.

Вы можете использовать следующий шаблон в качестве базового шаблона в своем скрипте.

# Logging
log(){
SOURCE=a.b.c.d (IP address)
$IPT -A INPUT   -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "In: "
$IPT -A OUTPUT  -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Out: "
$IPT -A FORWARD -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Fw: "
$IPT -t nat -A POSTROUTING -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Nat: "
}
#log  (remove comment to enable)

trace(){
iptables -t raw -A PREROUTING -p tcp  -j TRACE
iptables -t raw -A OUTPUT     -p tcp  -j TRACE
}
#trace (remove comment to enable)

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

Если бы мне было поручено что-то сделать и мне нужна была информация для отладки / устранения неполадок, которая вам нужна в этом случае, я бы использовал правильный инструмент. Это вероятно tcpdump или tshark. Да, это программы, но я бы счел их больше основные коммунальные услуги. Фактически, это утилиты, которые можно временно установить или загрузить в систему и удалить без происшествий (можно ли использовать съемный носитель? ...намек)

Но дело в том, что обходной путь к политике компании, вероятно, требует больше усилий, чем получение одобрения для этого варианта использования.

Кайл предложил несколько отличных вариантов. Еще один вариант - использовать iptables:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32
...
[james@server ~]$ sudo iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 105 packets, 35602 bytes)
 pkts bytes target  prot opt in  out  source      destination
   87 33484 LOG     all  --  *   *    0.0.0.0/0   1.2.3.4     LOG flags 0 level 4

По сути, это правило бухгалтерского учета. Он не разрешает и не запрещает трафик явно, поэтому используется политика по умолчанию для цепочки OUTPUT (по умолчанию ACCEPT). Однако любой соответствующий пакет увеличит счетчики для правила.

При желании вы также можете зарегистрировать подробную информацию о пакете с помощью -j LOG вариант:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 -j LOG
...
[james@server ~]@ dmesg | grep 1.2.3.4 | tail -1
IN= OUT=eth0 SRC=192.168.1.1 DST=1.2.3.4 LEN=100 TOS=0x10 PREC=0x00 TTL=64 ...

Журналы будут поступать в средство ведения журнала ядра, поэтому они должны отображаться в / var / log / messages для производных от Red Hat и /var/log/kern.log для производных от Debian. Это также будет видно на выходе dmesg, как показано. в отличие tcpdumpоднако он не будет регистрировать все содержимое пакета, а будет регистрировать только содержимое заголовка пакета.

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

В любом слючае, netstat или ss созданы, чтобы делать то, что вы хотите. Вы можете сделать то же самое с любой командой:

netstat -n -t | awk '{print $5}' | grep A.B.C.D:n
ss      -n -t | awk '{print $5}' | grep A.B.C.D:n

где A.B.C.D представляет IPv4-адрес, а n представляет номер порта, к которому ваш сервер подключается на удаленной стороне. Например:

ss      -n -t | awk '{print $5}' | grep 10.137.54.22:3389

Или, если вы просто хотите знать, что соединение установлено:

ss      -n -t | awk '{print $5}' | grep -q 10.137.54.22:3389 && echo "CONNECTION MADE"

Если вы не знаете номер порта, к которому вы пытаетесь подключиться, задача будет более сложной, поскольку TCP откроет порт на обеих сторонах диалога для пакетов данных и ACK. В этом случае вы можете просто ввести IP-адрес с помощью команды grep, чтобы показать, что было установлено любое соединение, будь то к или от.

Наконец, вы можете зациклить это на свое усмотрение, чтобы использовать его в качестве инструмента мониторинга:

while true; do
    ss -n -t | awk '{print $5}' | grep -q A.B.C.D:n && \
        echo "CONNECTION MADE" && \
        exit 0
    sleep 1
done