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

17

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

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

Исаак
источник
У вас есть root-доступ на сервере?
user9517
Да, у меня есть root-доступ.
Исаак
11
Вам также следует поработать над исправлением политики компании. Когда это мешает вам выполнять свою работу, политика нарушается.
Майкл Хэмптон
1
Что ж, контроль над изменениями - это в основном требование FDA - поэтому я ничего не буду менять в этой жизни :)
Исаак

Ответы:

15

Конечно, у вас есть 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.

Мэтью Ифе
источник
Как бы вы изменили это, чтобы также поймать пакет синхронизации TCP? Потому что, если цель не достижима, попытка, но неудачное соединение не будет отображаться.
Исаак
3
Разве этот скрипт не является новым программным обеспечением (поэтому его нельзя устанавливать в системе)?
Ви.
@ Используя эту логику, вы можете утверждать, что любой сценарий оболочки является «новым программным обеспечением». Это зависит от того, как вы определяете «программное обеспечение».
Мэтью Ифе
1
-1 Извините, это ужасное решение. Мало того, что он убивает курицу с помощью пулемета (пишет программу, которая делает то, для чего уже есть решение), но это бесконечный цикл, который излишне потребляет ресурсы ЦП (запускает процесс python ...) клавиша Control-C!), он не может правильно решить вопрос пользователя: он ответит «GOT TARGET» как на входящие, так и на исходящие TCP-соединения (пользователь запросил «пытается отправить запросы ...»). Наконец, он завершается с 1 (указывает на сбой оболочки) в случае успеха.
Майк С
1
очень круто, но вам все еще нужны повышенные разрешения для этого. Я получилsocket.error: (1, 'Operation not permitted')
Грант Боуман
17

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

Трассирование:

[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
Кайл Брандт
источник
1
Это был тот ответ, на который я надеялся. К сожалению, strace также не установлен: /
Исаак
Я попробую Исофа
Исаака
1
Полагаю, оригинальному постеру понравился ответ, но, как ни странно, на самом деле он не отвечает на его вопрос («... tcp соединения - я хотел бы посмотреть, попытается ли сервер отправить запросы на определенный IP ...). дать вам информацию о сетевом соединении для определенного процесса ... может быть, он хочет этого? Для тех, кто, как я, приезжает сюда в поисках информации о соединениях TCP от одной машины к другой, это может не сработать. Но реквизит для показа ряда различные примеры команд оболочки, которые позволяют вам собирать информацию о ваших сетевых подключениях
Mike S
15

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)
Джон Олд
источник
8

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

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

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

ewwhite
источник
Я полностью согласен с использованием правильного инструмента для правильной работы. На самом деле, я могу установить программное обеспечение, но мы должны использовать контроль изменений, поэтому процесс занимает несколько дней - мне нужен был дамп прямо сейчас, поэтому установка не была возможной. Мне было просто интересно, если я пропустил некоторые варианты, о которых еще не думал.
Исаак
:( о менеджменте изменений. Есть ли способ сыграть в политическую игру и заставить людей / партии, которые извлекут выгоду из свалки,
ускорить
1
Боюсь, что нет, но, поскольку клиент, которому требуется управление изменениями, а также tcpdump, должен будет принять факты. Я надеялся, что смогу сделать его счастливым в любом случае.
Исаак
3
@ewwhite: Любая хорошая политика управления изменениями должна иметь возможность освобождать определенные или классы изменений от прохождения полного процесса. Если этот не ....
Скотт Пак
2
Разве вы не можете скомпилировать статически связанные ссылки в tcpdumpдругом месте, просто скопировать их в / tmp и запустить оттуда?
Че
5

Кайл предложил несколько отличных вариантов. Еще один будет использовать 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Однако, в отличие от этого, он не будет регистрировать полное содержимое пакета, а только содержимое заголовка пакета.

Джеймс Снерингер
источник
Я сам думал о iptables, но тоже не установил: /. Во всяком случае, хорошее решение.
Исаак
3

Поскольку ваш сервер подключается к определенному 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-адреса, чтобы показать, что было установлено любое соединение, будь то с или с.

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

while true; do
    ss -n -t | awk '{print $5}' | grep -q A.B.C.D:n && \
        echo "CONNECTION MADE" && \
        exit 0
    sleep 1
done
Майк С
источник
Отличный способ для мониторинга без необходимости повышенных привилегий ядра.
Грант Боуман