SSH tunneling: 어디까지 할 수 있는 건가?

보안이 중요시 되는 곳에서 외부로 접속이 되는 것은 가능하지만, 반대로 밖에서 그 안으로 접속하는 것은 불가능하도록 만들어져있다.

이것을 가능하게 하려면 다음을 생각해볼 수 있다.

  1. 내가 속한 네트워크를 A라고 하고 B라는 네트워크로 접속하고 싶다고 하자.
  2. A에서 B로의 접속은 가능하나 B에서 A로는 불가능한 상태라고 가정하자.
  3. B와 A가 양방향으로 접속을 가능하게 하는 장치를 흔히 bridge라고 부른다.
  4. bridge의 역할은 주소대역이 다른 두 개의 네트워크를 터널(또는 물리적 연결통로)로 연결해두고 이 사이의 routing을 하게 하거나 필요에 따라서 주소 변환 (masquerading)을 해주는 것이다.
  5. 즉, A에서 B로 접속하여 터널을 뚫고, 그 터널로 B에서 A로 접속하게 하는 것이다. 이 과정에서 routing (packet forwading: 주소 대역을 봐서 해당 네트워크에 속한다 싶으면 해당 패킷들을 그 네트워크로 넘기는 일)/masquerading을 해주는 것이다.
  6. 외부에서 항상 이 네트워크로 접속 가능하게 하려면 A에서 B로 상시 접속이 가능하게 하는 브릿지용 호스트가 양쪽에 존재해야 한다.

인텔리전트한 공유기라면 사용자가 적당히 명령을 내려서 이 과정을 손쉽게 해치울 수 있지만, 대부분의 공유기는 사용자가 직접 shell을 써서 뭔가를 하도록 내버려두지 않으므로, 라스베리파이처럼 저렴한/저전력의 장치를 써서 상시 켜두고 사용하는 방법이 바람직하다 싶다.

또 한가지의 경우는 호스트 별로 접속 가능 주소대역을 제한하는 경우이다.

호스트 A에서는 주소 X의 호스트로 접속이 불허된 상황임에도 같은 네트워크에 속한 호스트 B에서는 그게 가능하다고 하면 (GatewayPorts), 호스트 A는 B를 경유하여 X로 접속할 수 있다. 이 경우 sshd가 remote tunneling이 가능하도록 설정되어있다면 (그렇게 설정되어있지 않은 것이 대부분이다.) 명령 한번에 가능하게 할 수 있지만, 그렇지 않은 경우 2 단계로 해야한다. 즉, 호스트 B의 local port로 호스트 X의 로컬 포트로 연결되게끔 특정 포트로의 포워딩을 해주고 다시 호스트 A에서 local port 중 하나를 호스트 B의 local port로 포워딩해야 한다.

새로운 virtual network device (tunneling device)가 생성되게끔 해서 포트별로 포워딩을 하는 게 아니라 아예 네트워크를 통째로 터널링하려면 sshd 설정(PermitTunnel)이 그렇게 되어있어야 하는데 마찬가지로 그렇게 설정되어있지 않은 것이 정상이니까 기대하지 않는 것이 좋다.