양방향 스트림을 통해 여러 HTTP 연결 터널링

양방향 스트림을 통해 여러 HTTP 연결 터널링

네트워크가 아닌 단일 양방향 스트림(구체적으로 QEMU virtio 직렬 스트림이지만 중요하지 않음)을 통해 http 서버(Linux)를 전달하고 싶습니다. 기본적으로 내가 원하는 것은 다음과 같습니다.

[XXX listen @ 8080] <-> some bidirectional stream <-> [YYY listen on stream, forward to http] <-> [web server:80] 

아이디어는 일반 웹 브라우저(Linux)를 8080에서 수신 대기 중인 XXX로 지정하고 모든 것이 원격 웹 서버와 YYY 양방향으로 스트리밍되기를 원한다는 것입니다. 호스트 시스템에서 루트 액세스를 요청할 수 없습니다.

나는 XXX 및 YYY 프로그램이 socat(또는 다른 표준 터널링 관련 프로그램)일 것이라고 생각했지만 그것은 나를 피했습니다. 가장 쉬운 방법에 대한 아이디어가 있습니까?

답변1

직렬 링크를 통해 IP 패킷을 보내고 싶습니다. 좋습니다! 다행스럽게도 이 문제는 IP 패킷만큼 오래되었으며 "가장 좋은" 해결책이 있습니다.

  • 슬립자동 구성이 부족해도 괜찮다면 (또한:진짜구식. 아마도 이것을 사용하고 싶지 않을 것입니다. )
  • 구매력 평가양쪽 끝에 IP 주소를 할당할 수 있도록 하려면

두 프로토콜 모두 직렬 회선을 통해 IP 패킷을 캡슐화하도록 설계되었습니다. 이는 정확히 사용자가 원하는 것입니다. HTTP 연결은 실제로 TCP 연결이고 TCP는 IP 위에서 실행되어 네트워크를 통해 실행됩니다. 원하는 만큼 다양한 연결을 연결하세요.

따라서 PPP를 선택하는 방법이라고 가정합니다.

# on the host machine that has access to the internet
pppd lock proxyarp <host IP>:<VM IP> /path/to/specified/virtioserialsocket

# on the VM
pppd lock defaultroute <VM IP>:<host IP> /dev/virtio-port/<virtioserialdev>

# At this point, you should be able to ping <VM IP>
# from the host, and <host IP> from the VM. If not,
# check `ip route`.
#
# You will now want to set up routing / NAT such that
# either the VM appears as a "normal" computer on the
# network that your host is on, as well, or such that
# all connections to some port are transparently NAT'
# ed over /dev/ppp0 on your host.
# 
# Since that depends on what you're trying to achieve
# here, I can only point out this has been done in a
# lot of other places, and documented.

하지만 솔직해지자. virtio가 포함된 QEMU가 있는 경우 게스트에서 네트워크 카드를 에뮬레이트한 다음 에뮬레이트된 네트워크를 통해 IP 작업을 수행할 수도 있습니다. 더 쉽고 성능이 뛰어나며 추가 소프트웨어가 필요하지 않으며 구입 후 바로 사용할 수 있습니다!

답변2

PPP/SLIP을 사용하면 원래 문제가 어떻게든 해결될 수 있을 것 같지만 호스트에 너무 많은 구성이 필요하기 때문에 실제로는 내 요구 사항을 충족하지 못합니다. 이상적으로는 socat에 SLIP 옵션이 있고 이를 통해 로컬 포트를 전달할 수 있다면 좋을 것입니다. 잘.


HTTP 서버가 있는 호스트에 SSH 서버가 있다고 가정하면(제 경우에는 그렇습니다) 다음 솔루션이 원하는 작업을 수행합니다.

HTTP 서버가 있는 시스템에서 socat를 실행하여 가상 직렬 포트를 SSH 서버로 전달합니다(아마도 socat를 사용하여 실제 직렬 포트를 전달할 수도 있습니다).

socat file:/dev/vport1p1,ignoreeof tcp:127.0.0.1:22

ignoreeof옵션은 나에게 매우 중요합니다. 이 옵션을 사용하지 않으면 socat의 연결이 즉시 끊어집니다. 직렬 장치에 따라 이는 중요할 수도 있고 중요하지 않을 수도 있습니다.

스트림의 다른 쪽 끝에서 내 가상 직렬 포트는 호스트의 수신 대기 포트일 뿐이므로( -chardev socket,id=X,host=127.0.0.1,port=1234QEMU 옵션) 여기에 SSH를 통해 포트 전달을 수행할 수 있습니다.

 ssh -L 8080:127.0.0.1:80 -p 1234 user@localhost

SSH 터널이 설정되면 브라우저에서 localhost:8080을 가리키기만 하면 작동합니다.

관련 정보