kết nối tcp mà không có tcpdump


17

Trên hộp centos, tôi muốn kết xuất các kết nối tcp - Tôi muốn xem liệu máy chủ có cố gửi yêu cầu đến một IP nhất định không. Thông thường tcpdump sẽ thực hiện thủ thuật - nhưng tcpdump chưa được cài đặt và cài đặt phần mềm không phải là một tùy chọn (vì chính sách của công ty). Tôi sợ netstat sẽ không hiển thị cho tôi một yêu cầu.

Vì vậy, tôi đã tự hỏi những gì tôi có lựa chọn khác. Tôi có quyền truy cập root trên máy chủ.


Bạn có quyền truy cập root trên máy chủ?
user9517 được hỗ trợGoFundMonica

Vâng, tôi có quyền truy cập root.
Isaac

11
Bạn cũng nên làm việc để có được chính sách công ty cố định. Khi nó ngăn bạn thực hiện công việc của mình, chính sách bị phá vỡ.
Michael Hampton

1
Chà, thay đổi kiểm soát về cơ bản là một yêu cầu của FDA - vì vậy tôi sẽ không thay đổi gì trong cuộc sống này :)
Isaac

Câu trả lời:


15

Chắc chắn là bạn có 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)

Điều này sẽ thoát với "GOT TARGET" cung cấp địa chỉ IP trở lại trùng khớp. Vì TCP phải gửi lại một cái gì đó trong khi bắt tay, điều này sẽ bắt bất cứ thứ gì từ một địa chỉ mục tiêu cụ thể. Nó không quan tâm nếu giao thức là TCP hoặc UDP mặc dù (tôi cũng không kiểm tra).

Đừng quên thay đổi MỤC TIÊU và Giao diện.


Làm thế nào bạn sẽ sửa đổi điều này để cũng bắt một gói đồng bộ tcp? Bởi vì nếu mục tiêu không thể đạt được, một kết nối đã thử nhưng không thành công sẽ không hiển thị.
Isaac

3
Tập lệnh này không phải là một phần mềm mới (vì vậy không được cài đặt trong hệ thống)?
Vi.

@Vi với logic đó, bạn có thể lập luận rằng bất kỳ tập lệnh shell nào là 'phần mềm mới'. Nó phụ thuộc vào cách bạn định nghĩa 'phần mềm'.
Matthew Ife

1
-1 Xin lỗi, đây là một giải pháp khủng khiếp. Nó không chỉ giết một con gà bằng súng máy (viết chương trình để làm những gì đã có giải pháp), mà còn là một vòng lặp vô hạn - tiêu tốn tài nguyên CPU một cách không cần thiết (chạy một bước trên quy trình python ... nhưng đứng bên cạnh khóa Control-C!), không giải quyết đúng câu hỏi của người dùng: Nó sẽ trả lời "GOT TARGET" cho cả kết nối TCP đến và đi (người dùng yêu cầu "cố gắng gửi yêu cầu ..."). Cuối cùng, nó thoát với 1 (biểu thị sự thất bại của vỏ) khi thành công.
Mike S

1
rất tuyệt, nhưng bạn vẫn cần quyền nâng cao cho việc này. Tôi đã nhậnsocket.error: (1, 'Operation not permitted')
Grant Bowman

17

Tôi thực sự cố gắng để có được tcpdump. Điều đó đang được nói, một số lựa chọn thay thế để xem nếu một kết nối nhất định tồn tại cho một IP là:

bước đi:

[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
Đó là loại câu trả lời tôi đã hy vọng. Sải bước không may không được cài đặt: /
Isaac

Tôi sẽ thử lsof
Isaac

1
Tôi đoán người đăng ban đầu thích câu trả lời, nhưng kỳ lạ là nó không thực sự trả lời câu hỏi của anh ấy ("... kết nối tcp - Tôi muốn xem liệu một máy chủ có cố gửi yêu cầu đến một IP nhất định không ...). cung cấp cho bạn thông tin kết nối mạng cho một quy trình cụ thể ... có thể anh ta muốn điều đó? Đối với những người như tôi đến đây tìm kiếm thông tin về các kết nối TCP từ máy này sang máy khác thì điều này có thể không thực hiện được. các ví dụ lệnh shell khác nhau cho phép bạn thu thập thông tin về các kết nối mạng của mình.
Mike S

15

Iptables có khả năng gỡ lỗi và cũng có thể được sử dụng để phân tích lưu lượng.

Giải pháp được mô tả trên URL dưới đây.

Quy tắc gỡ lỗi trong Iptables

Bạn cũng nên đọc URL sau để thiết lập ghi nhật ký đầu ra theo dõi vào một tệp bạn chọn.

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

Tôi sẽ không xem xét giải pháp này bằng với tcpdump, nhưng nó có thể được thực hiện bằng cách sử dụng cài đặt tối thiểu của Centos. Bạn cần cẩn thận để không lấp đầy đĩa với các bản ghi, bởi vì tcpdump hiệu quả hơn nhiều trong việc sử dụng đĩa. Tắt ghi nhật ký khi không cần thiết.

Bạn có thể sử dụng như sau làm mẫu cơ bản trong tập lệnh của mình.

# 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

Nếu bạn cần phần mềm cụ thể để thực hiện công việc của mình và không được phép, bạn sẽ không tạo ra một trường hợp kinh doanh tốt hoặc bán ý tưởng của mình cho đúng người ... hoặc bạn không kiểm soát hệ thống này .. .

Nếu tôi được giao nhiệm vụ làm một cái gì đó và cần loại thông tin gỡ lỗi / xử lý sự cố mà bạn yêu cầu trong trường hợp này, tôi sẽ sử dụng đúng công cụ. Điều đó có khả năng tcpdumphoặc tshark. Vâng, đó là những phần mềm, nhưng tôi cho rằng chúng là những tiện ích thiết yếu hơn . Trong thực tế, họ những tiện ích mà có thể được cài đặt hoặc nạp vào hệ thống tạm thời và loại bỏ mà không cần cố (là phương tiện di động một lựa chọn? ... gợi ý )

Nhưng vấn đề là một cách giải quyết chính sách của công ty có lẽ cần nhiều nỗ lực hơn là phê duyệt cho trường hợp sử dụng này.


Tôi hoàn toàn đồng ý về việc sử dụng đúng công cụ cho đúng công việc. Trên thực tế, tôi có thể cài đặt phần mềm, nhưng chúng tôi phải sử dụng kiểm soát thay đổi, vì vậy quá trình này mất vài ngày - tôi cần kết xuất ngay bây giờ, vì vậy cài đặt không phải là một tùy chọn. Tôi chỉ tự hỏi nếu tôi bỏ qua một số tùy chọn chưa nghĩ đến.
Isaac

:( về quản lý thay đổi. Có cách nào để chơi một trò chơi chính trị và khiến mọi người / các bên được hưởng lợi từ bãi rác để theo dõi nhanh quá trình quản lý thay đổi không?
ewwhite

1
Tôi không sợ - nhưng vì khách hàng yêu cầu quản lý thay đổi và cả tcpdump, anh ta sẽ phải chấp nhận sự thật. Tôi đã hy vọng tôi có thể làm cho anh ta hạnh phúc dù sao đi nữa.
Isaac

3
@ewwhite: Bất kỳ chính sách quản lý thay đổi tốt nào cũng cần có khả năng miễn trừ cụ thể hoặc các lớp thay đổi để trải qua toàn bộ quá trình. Nếu cái này không ....
Scott Pack

2
Bạn không thể biên dịch một liên kết tĩnh tcpdumpở nơi khác, và chỉ cần sao chép nó vào / tmp và chạy từ đó?
che

5

Kyle đưa ra một số lựa chọn tuyệt vời. Một cái nữa sẽ được sử dụng 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

Đây thực chất là một quy tắc kế toán. Nó không cho phép hoặc từ chối rõ ràng lưu lượng truy cập, do đó, chính sách mặc định cho chuỗi OUTPUT được sử dụng (mặc định là CHẤP NHẬN). Tuy nhiên, bất kỳ gói phù hợp sẽ tăng các bộ đếm cho quy tắc.

Bạn có thể tùy chọn đăng nhập chi tiết về gói cũng với -j LOGtùy chọn:

[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 ...

Nhật ký sẽ đi đến cơ sở ghi nhật ký kernel, vì vậy nó sẽ hiển thị trong / var / log / message trên các dẫn xuất Red Hat và /var/log/kern.log trên các dẫn xuất Debian. Nó cũng sẽ được nhìn thấy trong đầu ra của dmesg, như được hiển thị. tcpdumpTuy nhiên, không giống như nó sẽ không ghi lại toàn bộ nội dung của gói, chỉ có nội dung của tiêu đề gói.


Tôi đã nghĩ về iptables, nhưng cũng không được cài đặt: /. Dù sao, giải pháp tốt đẹp.
Isaac

3

Vì máy chủ của bạn đang kết nối với một IP nhất định, tôi đoán nó sẽ đến một cổng mà bạn cũng có kiến ​​thức về?

Trong mọi trường hợp, netstathoặc ssđược thiết kế để làm những gì bạn muốn. Bạn có thể làm tương tự với một trong hai lệnh:

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

trong đó A.B.C.Dđại diện cho một địa chỉ IPv4 và n đại diện cho một số cổng mà máy chủ của bạn đang kết nối ở phía xa. Ví dụ:

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

Hoặc, nếu bạn chỉ muốn biết rằng kết nối được tạo:

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

Nếu bạn không biết số cổng mà bạn đang cố gắng kết nối, thì công việc sẽ khó khăn hơn vì TCP sẽ mở một cổng ở cả hai phía của cuộc hội thoại cho các gói dữ liệu và ACK. Trong trường hợp đó, bạn có thể chỉ cần grep cho địa chỉ IP để hiển thị rằng bất kỳ kết nối nào đã được thực hiện, cho dù đó là hoặc từ.

Cuối cùng, bạn có thể lặp nội dung này với nội dung trái tim của bạn để sử dụng làm công cụ theo dõi của bạn:

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

Cách tuyệt vời để giám sát mà không cần đặc quyền kernel nâng cao.
Grant Bowman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.