Reverse proxy를 이용한 http tunneling 구현 문제

안녕하세요? C#으로 프로젝트 진행 중인데, 아래와 같은 기능 구현이 가능한 지 해서 우선 여기에 여쭤봅니다. 가능하다면, 외주 개발로 의뢰할 생각입니다.
고수님들의 고견 부탁드립니다. 일단 구성도 보여드리겠습니다.

결론적으로는 Server1에서 Server2로 접속하고 싶은 겁니다. 사실 공유기에서 Server2를 NAT설정을 해주면 간단하긴 한데, 그렇게는 할 수 없는 상황이어서 Reverse proxy로 일단 Server1과 Client를 연결 한 후, Client가 Server2의 80번 포트를 tunneling 해줘야합니다. 왜냐하면 Server2는 일반 PC가 아니고, 웹서버 기능이 내장된 장비이기 때문입니다.

제가 너무 두서없이 질문을 올린거 같네요ㅠ 혹시 더 궁금한점이나 개발 가능하신 분 의견 부탁드립니다. 감사합니다.

VPN이나 포트포워딩을 하는게 더 좋지 않을까요?
아니면 Cloudflare Tunnel 같은 것도 있고요

1개의 좋아요

꼭 http 프로토콜을 사용하셔야 한다면, nginx reverse proxy 를 Client에서 설정하는게 간편해 보이고, 프로토콜 사용에 제약이 없다면 ssh tunneling을 고려해 보시는건 어떤가요?


수정1) 아 헷갈렸네요… ssh tunneling으로 Server2 터널링이 될지 잘 모르겠네요.


수정2) GPT에 물어보니 가능은 하다고 하네요

네, SSH 터널링을 이용하여 같은 네트워크 내에서 다른 기기로 포워딩하는 것이 가능합니다. 이를 통해 SSH를 통해 안전한 터널을 생성하고, 특정 포트를 다른 기기로 전달할 수 있습니다. 기본적으로 로컬 포트 포워딩이나 리모트 포트 포워딩을 사용하여 이를 구현할 수 있습니다.

1. 로컬 포트 포워딩 (Local Port Forwarding)

로컬 포트 포워딩을 통해, 로컬 머신에서 특정 포트를 리모트 머신의 다른 기기로 포워딩할 수 있습니다. 예를 들어, 로컬 머신의 포트 8080을 같은 네트워크 내의 다른 기기 A의 포트 80으로 포워딩하는 방법은 다음과 같습니다.

ssh -L 8080:기기A_IP:80 사용자명@리모트서버_IP

이렇게 하면 로컬 머신에서 localhost:8080으로 접근할 때 기기 A의 포트 80으로 트래픽이 전달됩니다.

2. 리모트 포트 포워딩 (Remote Port Forwarding)

리모트 포트 포워딩을 통해 리모트 머신에서 특정 포트를 로컬 머신이나 다른 네트워크 기기로 전달할 수 있습니다. 예를 들어, 리모트 머신의 포트 8080을 로컬 네트워크 내의 기기 B의 포트 80으로 포워딩하는 방법은 다음과 같습니다.

ssh -R 8080:기기B_IP:80 사용자명@리모트서버_IP

이 경우 리모트 머신에서 localhost:8080으로 접근하면 기기 B의 포트 80으로 트래픽이 전달됩니다.

3. Dynamic 포트 포워딩

다른 네트워크 기기들로의 다중 포워딩이 필요한 경우, SOCKS 프록시를 설정할 수 있는 Dynamic 포트 포워딩을 사용할 수 있습니다. 이를 통해 SSH 터널을 통해 다양한 포트와 기기로 트래픽을 보낼 수 있습니다.

ssh -D 8080 사용자명@리모트서버_IP

이렇게 하면 localhost:8080에서 프록시 서버처럼 작동하게 되며, 브라우저 또는 기타 프로그램에서 SOCKS 프록시를 사용해 다양한 기기와 포트로 트래픽을 전달할 수 있습니다.

이러한 방법을 통해 같은 네트워크 내에서 SSH 터널링으로 포워딩이 가능합니다.

1개의 좋아요

Client에 YARP로 만든 웹서버 추가
https://microsoft.github.io/reverse-proxy/

공유기 네트워크에 컴터(SSH 클라이언트) 하나 설치하고, 그 컴에서 Remote Port Forwarding 하면 간단히 해결될 것 같은데요?

이때, Server1 호스트에 SSH Server 가 가능하다는 전제입니다.

[추가]
이렇게 하면, SSH 연결 관리를 꾸준히 해야 하는 문제가 있을 것 같습니다.

관리와 성능 측면에서, cloudflare tunnel 같은 유상 서비스를 도입하는 것도 고려해 보시는 게 좋을 것 같습니다.

윈도우에서는 다음과 같이 포트포워딩이 가능합니다

netsh interface portproxy add v4tov4 listenport=8080 connectport=80 connectaddress=192.168.0.123

80번 포트로 들어오는 수신을 192.178.0.123의 8080 포트로 전달하는 명령 예시입니다.

공유기 네트워크 컴퓨터에 SSH 클라이언트를 설치하는 것은, 리버스 프록시 개념과 같은거겠죠? 클라이언트에서 서버로 접속시키는…

감사합니다. 해보니 잘 되네요~ 그럼 리버스 프록시만 따로 해결하면 되는거겠죠?

감사합니다. 공부해봐야겠네요

상세한 답변 감사합니다.

리버스 프록시라기 보다는 터널링 브로커라고 보는 게 맞을 것 같습니다.
왜냐 하면, Server1 의 메시지는 터널을 통해 Server2에 바로 전달되니까요.

현재 필요한 부분은 Server1 이 보낸 요청이 Server2에 닿게 하는 것인데, 이 경우 Server1은 Server2에 대한 클라이언트입니다.

또한, Server2가 속한 네트워크의 외부 주소가 없고, 있어도 NAT 설정을 못하는 상황이라고 이해 했습니다.

이 경우 터널링이 대안이 되는데, Server2가 장비라서, 그 호스트 내부에서 SSH 니 뭐니 터널링 설정을 못한다는 가정도 했습니다.

그런 이유로 터널링 설정이 가능한 별도의 호스트가 Server2와 같은 대역에 있어야 하는 것이죠.

그 호스트는 Server1의 공인 IP와 Server2의 사설 IP를 연결해주는 Remote Port Forwarding 이 필요합니다.