Cách dễ dàng để chỉnh sửa trực tuyến, lưu lượng truy cập đến từ máy chủ tcp (linux)


9

Tôi cần thực hiện một số sửa đổi nhỏ đối với lưu lượng truy cập đến từ máy chủ tcp đã biết: cổng trước khi xử lý kết nối nhận được luồng.

Ví dụ: đặt 192.168.1.88 là máy chủ từ xa chạy máy chủ web.
Tôi cần điều đó, khi một quá trình trên máy chủ lưu trữ cục bộ của tôi nhận được dữ liệu từ 192.168.1.88:80 (ví dụ: trình duyệt), dữ liệu được thay đổi đầu tiên thay thế text-Abằng text-B, như sau:

  • 127.0.0.1: ... kết nối với 192.168.1.88:80
  • 127.0.0.1: ... gửi tới 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 gửi tới 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • Dữ liệu đó phần nào bị hệ thống chặn và chuyển đến một chương trình có đầu ra là:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • hệ thống cung cấp dữ liệu đã thay đổi để xử lý quy trình 127.0.0.1: ..., giống như nếu nó đến từ 192.168.1.88:80.

Giả sử tôi có một cách dựa trên luồng để thực hiện thay đổi này ( sedví dụ sử dụng ), cách dễ nhất để xử lý trước luồng tcp đến là gì?

Tôi đoán điều này sẽ liên quan iptables, nhưng tôi không giỏi lắm.

Lưu ý rằng ứng dụng sẽ cảm thấy phải đối phó với máy chủ gốc, do đó, thiết lập proxy không phải là một giải pháp.


Đây có phải là những yêu cầu HTTP không?
đa thức

Câu hỏi của bạn không đủ rõ ràng. Bạn cần cung cấp thêm chi tiết.
Khaled

1
Bạn không thể làm điều đó ở cấp độ gói. Một gói có thể chứa "text-" và gói tiếp theo có thể chứa "A". Bạn sẽ phải phát triển một proxy vô hình theo giao thức. (Bạn phải tuân theo giao thức vì nếu bạn nhận được "văn bản-" và đó là một phần của "văn bản-A", bạn cần đợi đoạn tiếp theo trước khi chuyển qua hoặc bộ lọc của bạn sẽ không hoạt động. Nhưng nếu kết thúc về một thông điệp hợp lý, bạn không thể chờ đợi vì bạn sẽ chờ đợi mãi mãi.) Tôi tin rằng không có cách nào dễ dàng để làm điều này.
David Schwartz

Hiện đã có các hệ thống kiểm tra gói trạng thái có thể thực hiện, ví dụ như viết lại lưu lượng FTP để nó hoạt động trên toàn NAT. Đó là nơi để bắt đầu.
pjc50

Tôi cần nó để làm việc với phản hồi http là chủ yếu nhưng sẽ tốt nếu nó hoạt động trên bất kỳ lớp ứng dụng nào.
etuardu

Câu trả lời:


21

Sử dụng proxy và iptables proxy.

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

Sau đó chạy:

netsed tcp 10101 desthost 80 s/text-A/text-B

NetSED là một tiện ích nhỏ và tiện dụng được thiết kế để thay đổi, trong thời gian thực, nội dung của các gói được chuyển tiếp qua mạng của bạn. Nó thực sự hữu ích cho việc thay đổi, giả mạo hoặc thao tác gói mạng. Hỗ trợ NetSED:

  • kiểm tra giao thức hộp đen - bất cứ khi nào có hai hoặc nhiều hộp độc quyền giao tiếp bằng cách sử dụng một số giao thức không có giấy tờ. Bằng cách thực thi các thay đổi trong quá trình truyền đang diễn ra, bạn sẽ có thể kiểm tra xem ứng dụng đã kiểm tra có thể được yêu cầu bảo mật hay không.

  • tạo các thử nghiệm fuzz, kiểm tra tính toàn vẹn - bất cứ khi nào bạn thực hiện kiểm tra độ ổn định của ứng dụng để xem cách nó quan tâm đến tính toàn vẹn dữ liệu;

  • các trường hợp sử dụng phổ biến khác: chuyển giao lừa đảo, lọc nội dung, chuyển đổi giao thức - bất cứ điều gì phù hợp nhất với nhiệm vụ của bạn.


Điều đó thực sự đơn giản và tuyệt vời.
mbrownnyc

Tôi không biết netsed, nó phù hợp gần như hoàn hảo cho mục đích của tôi. Điều duy nhất tôi không nhận được là làm thế nào để thiết lập "proxy minh bạch cục bộ" (xem câu hỏi). Có lẽ tôi nên thiết lập một giao diện mạng (ảo) khác để có được điều đó. Nhân tiện, bây giờ đây là câu trả lời thỏa mãn nhất.
etuardu

Bạn đang chạy một kernel phân phối chung? Nếu bạn là iptables hỗ trợ có thể đã được biên dịch. Để thiết lập proxy trong suốt, bạn chỉ cần điền các chi tiết phù hợp cho máy chủ / cổng của bạn. Hãy xem readme và xem nếu nó điền vào một số chi tiết. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
dfc

Tôi nghĩ rằng lưới sẽ chỉ làm việc trên một gói tại một thời điểm? Vì vậy, nếu yêu cầu http được chia thành hai gói, biểu thức thay thế sẽ không khớp và yêu cầu sẽ được chuyển đến máy chủ không được sửa đổi.
paulos

1
ok bây giờ, chỉ trong trường hợp ai đó cần một ngày này: không phải là tôi hoàn toàn hiểu điều đó, nhưng đối với thực sửa đổi các gói dữ liệu đi (đó là những gì op KHÔNG muốn làm), bạn sẽ phải thay đổi OUTPUT, không phải PREROUTING. Ngoài ra, -Dtùy chọn phải -A dành cho tôi. Ngoài ra, đối với -jtùy chọn, tôi phải sử dụng DNAT --to-destination (ip) hoặc REDIRECT --to-port. Cuối cùng, tôi KHÔNG thể sửa lỗi phân đoạn của mạng. xem thêm: ubuntuforums.org/showthread.php?t=2337389
phil294


3

iptables+ việc sử dụng libnetfilter_qu là một tùy chọn khác sẽ làm những gì bạn muốn:

"... [reject] các gói đã thay đổi thành hệ thống con nfnetlink_queue kernel."

Nó có khả năng sẽ cung cấp cho bạn khả năng mở rộng nhất vì nó tùy thuộc vào bạn để mã hóa phần mềm.

một bọc python có sẵn là tốt.


2
Ứng dụng mẫu đang sử dụng netfilter_queue: github.com/rgerganov/nfqsed
rgerganov
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.