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


9

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

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