Câu hỏi Với iptables Linux, có thể đăng nhập vào tên quy trình / lệnh để khởi tạo kết nối gửi đi không?


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

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

Thao tác này ghi lại uid / gid khởi tạo kết nối, nhưng không phải là quá trình / tên lệnh hoặc thậm chí là pid. Nếu tôi chỉ có thể nhận được pid, tôi có lẽ có thể whip lên một kịch bản mà kéo tên quá trình khi đăng nhập được viết, nhưng có vẻ như đó là không thể.

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

Bất kỳ ý tưởng làm thế nào điều này có thể có thể với iptables [hoặc bất cứ điều gì khác] trên một hộp Linux?


24
2018-04-07 20:08


gốc


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, nhìn nó lên. - niXar
Cá nhân, tôi sẽ sử dụng sysdig vì công việc này. - Charles Duffy


Các câu trả lời:


Bạn có thể viết một chương trình để giám sát / proc / net / tcp, có đầ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 inode, có thể liên quan ngược lại các quy trình và các bộ mô tả tệp bằng cách thực hiện readlink trên các bộ mô tả tệp được liệt kê cho mỗi quá trình:

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

Xem ở đây rằng inode 4847458 tương ứng với socket 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 một sự thay đổi trong / proc / net / tcp, phân tích cú pháp dữ liệu và xác định xem thay đổi có phải là một ổ cắm mới được mở hay không. Sau đó, bạn chỉ có thể liệt kê tất cả các bộ mô tả tập tin cho mỗi quá trình được liệt kê trong / proc, làm readlink trên mỗi ngày để tìm inode phù hợp. Một khi bạn thấy rằng, bạn có pid sở hữu, từ đó bạn có thể nhận được bất cứ điều gì khác mà bạn có thể muốn, đặc biệt nếu bạn có quá trình kế toán trên.

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


7
2018-04-08 15:27



Cảm ơn bạn đã cung cấp tùy chọn! Nhưng yêu cầu bỏ phiếu và truy vấn mỗi bộ mô tả tập tin mở mỗi lần không phải là rất mạnh mẽ và rất kém hiệu quả. Tôi vẫn hy vọng một người nào đó sẽ tìm thấy một 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 --cmd-chủ sở hữu được coi là unfixble. - nealmcb
Trừ khi hạt nhân thay đổi cách bố trí của nó / proc hoặc trừ khi netstat và readlink hoặc thay đổi ps (không), tôi muốn nói điều này là khá mạnh mẽ. Bạn lo lắng về loại vấn đề hiệu quả nào? Nếu bạn muốn xử lý tức thì, 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 sẽ bị hủy ngay lập tức bởi kernel, vì vậy tôi có rất ít cơ hội nhìn thấy nó trong / proc. Có lẽ chỉ thay đổi REJECT thành DROP để có thời gian kết nối ... - Marki555
Nó không giúp đỡ trong kịch bản này beause của cửa sổ thời gian siêu nhỏ, nhưng như xa như mong manh của phân tích / proc đi, người ta cũng có thể chỉ sử dụng "lsof -F -i" và nhận được một bãi chứa độc đáo trừu tượng của mạng dữ liệu. Điều đó cũng có thể được lọc (ví dụ, chỉ trên một cổng cụ thể), và đã thực hiện tất cả việc ánh xạ tên tệp / pid / người dùng cho bạn. - dannysauer


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

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

9
2018-04-07 20:12



Có thể một lệnh iptables đăng nhập thiết lập và nội suy một biến theo cách này? Nó dường như không hiệu quả với tôi. Ngoài ra, có vẻ như tùy chọn --cmd-owner đã bị xóa trong kernel> = 2.6.15. Điều này là không may, bởi vì nó có vẻ giống như một lựa chọn hữu ích.
Có, --cmd-owner đã bị xóa: "unfixable broken" - guettli
Cảm ơn vì thông tin, @guettli. Có nhiều chi tiết cụ thể hơn tại permalink.gmane.org/… báo giá nhiều hơn về thay đổi: "[NETFILTER]: Xóa bỏ việc lạm dụng tasklist_lock trong chủ sở hữu ipt {, 6}; Hãy loại bỏ kết hợp cmd / sid / pid vì nó không thể tách rời và đứng trong cách khóa các thay đổi đối với tasklist_lock."  Nhưng tôi vẫn muốn một số nền tảng hơn, hoặc lựa chọn thay thế tốt hơn. - nealmcb


Không có gì để làm với iptables hoặc đăng nhập; nhưng đây là giao diện "đầu" giống như 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/nethogs

"NetHogs là một công cụ 'net top' nhỏ. Thay vì phá vỡ lưu lượng truy cập 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ụ, 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 nạp."


5
2018-04-08 19:37



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


Khi tôi nhìn vào 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ờ chủ sở hữu pid-owner / cmd không còn được hỗ trợ trực tiếp trong iptables nữa; sau đó bạn sẽ cần phải phân tích cú pháp 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 hệ thống / khởi động lại, v.v. lưu số cổng / s vào tệp để tham khảo tại thời gian 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 đó cho mục đích của tôi, đơn giản nhất là thêm bộ lọc u32 tc theo số cổng, mục nhập iptables theo số cổng tương tự


1
2018-03-04 03:28