Với iptables Linux, có thể ghi nhật ký tên tiến trình / lệnh khởi tạo kết nối ra ngoài không?


27

Tôi muốn theo dõi các quá trình khởi tạo các kết nối ra ngoài trên máy tính để bàn Linux. Điều tốt nhất tôi có thể đưa ra là:

iptables -A OUTPUT -m state --state NEW -j LOG --log-uid

Điều này ghi lại uid / gid khởi tạo kết nối, nhưng không phải là tên tiến trình / lệnh hoặc thậm chí là pid. Nếu tôi có thể lấy được pid, có lẽ tôi có thể lấy ra một kịch bản kéo tên quy trình khi nhật ký được viết, nhưng có vẻ như điều đó thậm chí không thể.

Lý tưởng nhất là tôi cũng muốn đăng nhập các quy trình chấp nhận kết nối đến.

Bất kỳ ý tưởng nào có thể thực hiện được với iptables [hoặc bất cứ thứ gì khác] trên hộp Linux không?


Tôi tin rằng (không hoàn toàn chắc chắn) câu hỏi này đã được trả lời trên serverfault, hãy tìm nó.
niXar

Cá nhân, tôi sẽ sử dụng sysdig cho công việc này.
Charles Duffy

Câu trả lời:


7

Bạn có thể viết một chương trình để theo dõi / Proc / net / tcp, với đầu ra trông như thế này:

obi-wan ~ # cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847458 1 e6060560 300 0 0 2 -1
   1: 00000000:04D2 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847477 1 f2e64da0 300 0 0 2 -1
   2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7109 1 f2e65ac0 300 0 0 2 -1
   3: 0100007F:177A 00000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 4864457 1 d2726540 300 0 0 2 -1
   4: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847462 1 e60609c0 300 0 0 2 -1
   5: 6B00A8C0:0016 30F4B5CA:C3AB 01 00000044:00000000 01:00000031 00000000     0        0 4982752 3 f2e64940 55 4 0 2 -1
   6: 0100007F:B143 0100007F:BC5E 01 00000000:00000000 00:00000000 00000000  1000        0 2130283 1 d59cce40 21 4 1 2 -1
   7: 0100007F:BC5E 0100007F:B143 01 00000000:00000000 00:00000000 00000000  1000        0 2130285 1 d59cd2a0 21 4 0 2 -1
   8: 6B00A8C0:0016 3276C35B:8E11 01 00000000:00000000 02:000ADAB1 00000000     0        0 4982629 2 d2727260 40 4 8 2 2
   9: 6B00A8C0:0016 6500A8C0:DD5D 01 00000538:00000000 01:00000029 00000000     0        0 4864416 5 e6061b40 42 12 27 3 -1

Sau đó, bạn có thể liên kết các cổng đã mở với các nút, có thể liên quan trở lại các quy trình và mô tả tệp bằng cách thực hiện đọc liên kết trên các mô tả tệp được liệt kê cho mỗi quy trình:

obi-wan ~ # readlink /proc/28850/fd/3
socket:[4847458]

Xem ở đây rằng inode 4847458 tương ứng với ổ cắm tcp đầu tiên trong danh sách trên. Đầu ra của netstat -tapn xác minh điều này cho tôi (và nhớ lại rằng 0x50 == 80):

obi-wan ~ # netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     28850/cherokee-work

Khi chương trình giám sát nhận thấy sự thay đổi trong / Proc / net / tcp, hãy phân tích dữ liệu và xác định xem sự thay đổi đó có phải là ổ cắm mới mở không. Sau đó, bạn có thể liệt kê tất cả các mô tả tệp cho từng quy trình được liệt kê trong / Proc, thực hiện đọc liên kết trên mỗi để tìm inode phù hợp. Khi bạn tìm thấy điều đó, bạn có quyền sở hữu, từ đó bạn có thể nhận được bất cứ điều gì khác mà bạn muốn, đặc biệt nếu bạn có quy trình kế toán.

Nếu bạn không cần thông báo của mình là tức thời, thì chương trình màn hình của bạn có thể sử dụng cuộc thăm dò chậm (có thể là khoảng thời gian 50ms hoặc 100ms hoặc thậm chí 1000ms).


2
Cảm ơn đã cung cấp một tùy chọn! Nhưng yêu cầu bỏ phiếu và truy vấn mọi mô tả tệp mở mỗi lần không mạnh mẽ và rất không hiệu quả. Tôi vẫn hy vọng ai đó sẽ tìm ra giải pháp tốt hơn hoặc làm rõ lý do tại sao đây không phải là một phần của iptables nữa và tại sao - chủ sở hữu cmd được coi là không thể trộn lẫn.
nealmcb

Trừ khi kernel thay đổi bố cục / Proc hoặc trừ khi netstat và readlink hoặc ps thay đổi (không thể), tôi sẽ nói điều này khá mạnh mẽ. Bạn quan tâm đến loại vấn đề hiệu quả nào? Nếu bạn muốn xử lý tức thời, bạn sẽ phải viết một mô-đun hạt nhân để sử dụng với iptables.
Ben Collins

Nếu tôi đang đăng nhập các kết nối bị từ chối thì socket bị hủy ngay lập tức bởi kernel, vì vậy tôi có rất ít cơ hội để thấy nó trong / Proc. Có lẽ chỉ thay đổi
DỰ ÁN

Nó không giúp ích gì trong kịch bản này khi sử dụng cửa sổ thời gian siêu nhỏ, nhưng theo như sự mong manh của phân tích cú pháp / Proc, người ta cũng có thể chỉ cần sử dụng "lsof -F -i" và có được một mạng lưới trừu tượng độc đáo dữ liệu. Điều đó cũng có thể được lọc (giả sử, chỉ trên một cổng cụ thể) và đã thực hiện tất cả ánh xạ tên tệp / pid / người dùng cho bạn.
dannysauer

9

Bạn muốn mô-đun khớp chủ sở hữu, chỉ hoạt động trên chuỗi OUTPUT (và có thể BẮT ĐẦU ...?). Đọc tài liệu, nhưng nó sẽ hoạt động như thế này:

iptables --append OUTPUT -m owner --cmd-owner "$app" \
--jump LOG --log-level DEBUG --log-prefix "OUTPUT $app packet died: "

1
Một lệnh log iptables có thể thiết lập và nội suy một biến theo cách này không? Nó dường như không làm việc cho tôi. Ngoài ra, có vẻ như tùy chọn --cmd-own đã bị xóa trong kernel> = 2.6.15. Điều này thật đáng tiếc, vì nó có vẻ như là một lựa chọn hữu ích.

4
Có, chủ sở hữu --cmd đã bị xóa: "không thể sửa được"
guettli

1
Cảm ơn thông tin, @guettli. Có rất nhiều chi tiết cụ thể tại permalink.gmane.org/... mà trích dẫn nhiều changelog: "[netfilter]: Remove lạm dụng tasklist_lock trong ipt {6} chủ sở hữu; Rip ra cmd / sid / pid phù hợp với từ unfixable của nó bị phá vỡ và đứng ở cách khóa thay đổi thành tasklist_lock. " Nhưng tôi vẫn muốn có thêm một số nền tảng, hoặc lựa chọn thay thế tốt hơn.
nealmcb

5

Không có gì để làm với iptables hoặc đăng nhập; nhưng đây là giao diện "trên cùng" thăm dò thư mục / Proc / và hiển thị băng thông cho mỗi chương trình / pid:

http://sourceforge.net/projects/netooses

"NetHogs là một công cụ 'net top' nhỏ. Thay vì phá vỡ lưu lượng trên mỗi giao thức hoặc trên mỗi mạng con, giống như hầu hết các công cụ khác, nó nhóm băng thông theo quy trình. NetHogs không dựa vào mô-đun hạt nhân đặc biệt để được tải."


Tôi đã tìm thấy nethog cung cấp số liệu thống kê không đáng tin cậy, nhưng trên đỉnh 2 (+ netatop) làm tốt điều này.
Tobu

1

Khi tôi đang xem xét một câu hỏi tương tự, cố gắng giới hạn tốc độ skype, tôi đã tìm thấy

$ netstat -p | grep <mycmdname>

là một cách tốt để liên kết số cổng với pid / cmd, bây giờ pid-own / cmd-own không còn được hỗ trợ trực tiếp trong iptables; Sau đó, bạn sẽ cần phân tích kết quả, sau đó thêm quy tắc iptables theo cổng; tự nhiên bạn sẽ cần một số mã dọn dẹp sau đó / lúc tắt / khởi động lại hệ thống, v.v; lưu số cổng / s vào một tệp để tham khảo lúc dọn dẹp

trong thực tế, một câu trả lời tốt cho câu hỏi số cổng là

$ sudo netstat -p | grep "tcp.*<mycmdname>" | sed -r "s/.*<MYCOMPUTER>:([0-9]+).*/\1/"`

bạn có thể cần điều chỉnh phần tử grep tcp theo nhu cầu của bạn

sau đó, với mục đích của tôi, đơn giản nhất là thêm các bộ lọc tc u32 theo số cổng, mục nhập iptables theo số cổng tương tự

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.