TCP 호스트 (Linux)에서 오는 트래픽을“편집”하는 쉬운 방법


9

연결을 처리하는 프로세스가 스트림을 가져 오기 전에 알려진 tcp 호스트 : 포트에서 들어오는 트래픽을 약간 수정해야합니다.

예를 들어, 192.168.1.88을 웹 서버를 실행하는 원격 호스트로 설정하십시오.
내 로컬 호스트의 프로세스를 교체, 데이터가 먼저 변경 192.168.1.88:80 (예 : 브라우저)로부터 데이터를 수신 할 때 나는 그것을 필요 text-A로 text-B다음과 같이 :

  • 127.0.0.1:...192.168.1.88:80에 연결
  • 127.0.0.1 : ... 192.168.1.88:80으로 전송 :

    GET /
    
  • 192.168.1.88:80은 127.0.0.1로 전송 :::

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • 이 데이터는 시스템에 의해 다소 가로 채서 출력이 다음과 같은 프로그램으로 전달됩니다.

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • 시스템은 이렇게 변경된 데이터를 192.168.1.88:80에서 오는 것처럼 127.0.0.1 : ...을 처리하는 프로세스에 제공합니다.

이 변경을 수행하는 스트림 기반 방법이 있다고 가정하면 ( sed예 : 사용 ) 들어오는 TCP 스트림을 사전 처리하는 가장 쉬운 방법은 무엇입니까?

나는 이것과 관련이 있다고 생각 iptables하지만, 나는 그것에 능숙하지 않다.

응용 프로그램은 원래 호스트를 처리해야하므로 프록시 설정이 해결책이 될 수 없습니다.


이 HTTP 요청입니까?
— 다항식

귀하의 질문이 명확하지 않습니다. 자세한 내용을 제공해야합니다.
— Khaled

1
패킷 수준에서는 수행 할 수 없습니다. 하나의 패킷은 "text-"를 포함하고 다른 하나는 "A"를 포함 할 수 있습니다. 프로토콜을 따르는 보이지 않는 프록시를 개발해야합니다. "text-"를 받고 "text-A"의 일부인 경우 다음 덩어리를 전달하기 전에 기다려야합니다. 그렇지 않으면 필터가 작동하지 않기 때문에 프로토콜을 따라야합니다. 논리적 메시지의 경우, 당신은 영원히 기다리고 있기 때문에 기다릴 수 없습니다.) 나는 이것을 할 수있는 쉬운 방법이 없다고 생각합니다.
— David Schwartz

NAT를 통해 작동하도록 FTP 트래픽을 다시 쓰는 등의 상태 저장 패킷 검사 시스템이 이미 존재합니다. 그것은 시작하는 곳입니다.
— pjc50

http 응답을 주로 사용하려면 필요하지만 응용 프로그램 계층에서 작동하면 좋을 것입니다.
— etuardu

답변:


21

netsed 및 iptables 프록시를 사용하십시오.

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

그런 다음 다음을 실행하십시오.

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

NetSED 는 네트워크를 통해 전달되는 패킷의 내용을 실시간으로 변경하도록 설계된 작고 편리한 유틸리티입니다. 네트워크 패킷 변경, 단조 또는 조작에 실제로 유용합니다. NetSED는 다음을 지원합니다.

  • 블랙 박스 프로토콜 감사-문서화되지 않은 프로토콜을 사용하여 통신하는 둘 이상의 독점적 인 박스가있을 때마다. 진행중인 전송에 변경 사항을 적용하면 검사 된 응용 프로그램의 보안을 주장 할 수 있는지 테스트 할 수 있습니다.

  • 퍼즈 생성 실험, 무결성 테스트-애플리케이션의 안정성 테스트를 수행하여 데이터 무결성을 관리하는 방법을 확인할 때마다;

  • 기타 일반적인 사용 사례 : 사기성 전송, 콘텐츠 필터링, 프로토콜 변환-작업에 가장 적합한 것


정말 간단하고 멋지다.
— mbrownnyc

몰랐어요 netsed. 내 목적에 거의 완벽하게 맞습니다. 내가 얻지 못하는 유일한 것은 "로컬 투명 프록시"를 설정하는 방법입니다 (질문 참조). 아마도 그것을 얻기 위해 다른 (가상) 네트워크 인터페이스를 설정해야 할 것입니다. 그건 그렇고, 현재로서는 이것이 가장 만족스러운 답변입니다.
— etuardu

일반 배포 커널을 실행하고 있습니까? iptables 인 경우 지원이 이미 컴파일되어있을 수 있습니다. 투명 프록시를 설정하려면 호스트 / 포트에 대한 적절한 세부 정보 만 입력하면됩니다. 읽어보기를보고 일부 세부 사항이 채워져 있는지 확인하십시오. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
— dfc

netsed는 한 번에 하나의 패킷에서만 작동한다고 생각 했습니까? 따라서 http 요청이 두 패킷으로 분할 된 경우 대체에 대한 정규식이 일치하지 않고 요청이 수정되지 않은 서버로 전달됩니다.
— paulos

1
이제 누군가가 하루를 필요로하는 경우를 대비하여 알 수 있습니다. 완전히 이해하지는 않지만 실제로 나가는 패킷을 수정하려면 (작동하고 싶지 않은 작업) OUTPUT,하지 말고 수정해야합니다 PREROUTING. 또한 -D옵션은 -A 저를위한 것이 었습니다. 또한 -j옵션을 위해 DNAT --to-destination (ip) 또는 을 사용해야했습니다 REDIRECT --to-port. 마지막으로, netsed의 세그먼테이션 오류를 수정할 수 없습니다. 참조 : ubuntuforums.org/showthread.php?t=2337389
— phil294


3

iptables+ libnetfilter_qu 의 사용은 원하는 것을 수행하는 또 다른 옵션입니다.

"... [reinject] 커널 nfnetlink_queue 서브 시스템으로 패킷을 변경했습니다."

소프트웨어를 코딩하는 것은 당신에게 달려 있기 때문에 가장 확장 성이 좋습니다.

거기에 래퍼 파이썬 뿐만 아니라이 없습니다.


2
netfilter_queue 사용하는 샘플 응용 프로그램 : github.com/rgerganov/nfqsed
— rgerganov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.