dump tcp-з'єднання без tcpdump


17

У вікні centos я люблю скидати з'єднання tcp - я хотів би дізнатися, чи сервер намагається надсилати запити до певного IP. Зазвичай tcpdump зробив би свою справу - але tcpdump не встановлюється, а встановлення програмного забезпечення не є варіантом (через політику компанії). Я боюсь, що netstat не покаже мені жодного запиту.

Тож мені було цікаво, які у мене інші варіанти. У мене є кореневий доступ до сервера.


У вас є кореневий доступ на сервері?
користувач9517

Так, у мене є кореневий доступ.
Ісаак

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, хоча (і я не перевіряю).

Не забудьте змінити ЦІЛУ та ІНТЕРФЕЙС.


Як би ви змінили це, щоб також спіймати пакет синхронізації tcp? Тому що якщо ціль недосяжна, спробу, але не вдалося з'єднання, не з’явиться.
Ісаак

3
Чи не цей сценарій є новим програмним забезпеченням (тому його не слід встановлювати в системі)?
Ві.

@Vi з цією логікою ви можете стверджувати, що будь-який скрипт оболонки - це «нове програмне забезпечення». Це залежить від того, як ви визначаєте "програмне забезпечення".
Метью Іфе

1
-1 Вибачте, це жахливе рішення. Це не тільки вбивство курки з кулемета (написання програми для виконання того, що вже є рішення), але це нескінченна петля - зайве споживання ресурсів процесора (запустіть напругу в процесі python ... але стежте за клавіші Control-C!), він не зможе правильно вирішити питання користувача: він відповість "ДОБАВИТИ ЦЕЛЬ" як на вхідні, так і на вихідні TCP-з'єднання (користувач запитав "намагається надсилати запити ..."). Нарешті, він закінчується з 1 (свідчить про збій оболонки) після успіху.
Mike S

1
дуже круто, але для цього все ж потрібні підвищені дозволи. Я отримавsocket.error: (1, 'Operation not permitted')
Грант Боуман

17

Я б дуже спробував отримати tcpdump. Зважаючи на це, деякі альтернативи, щоб дізнатися, чи існує певне з'єднання для ІР, є:

шлейф:

[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
Така відповідь я сподівався. На жаль, також не встановлено пробіл: /
Ісаак

Я спробую lsof
Ісаак

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

Прекрасний спосіб контролювати, не потребуючи підвищених привілеїв ядра.
Грант Боуман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.