Motive
공공기관이나 학교 등의 경우 SSH 포트인 22번을 보안상의 이유로 게이트웨이 단에서부터 막아두는 경우가 있다. 기관에 정식으로 특정 IP 주소의 포트 오픈을 요청하거나 VPN 등을 사용하는 방법이 있으나, 그것이 귀찮은 경우 어떤 사정으로 항시 오픈되어 있는 다른 포트를 SSH 접속에 쓸 수 있다. (기관이 상시 개방할 가능성이 높은 포트 목록들: https://ko.wikipedia.org/wiki/TCP/UDP%EC%9D%98_%ED%8F%AC%ED%8A%B8_%EB%AA%A9%EB%A1%9D) 대표적으로 80번 포트, 443번 포트 등은 HTTP 프로토콜(사람들이 학교 홈페이지 정돈 접속할 수 있어야 하니)에 사용되므로 대개 항시 오픈되어 있다.
물론 보안상 권장할만한 방법은 아니지만 이러한 상시 개방 포트들을 나만의 포트로 사용하는 것은 유용하다. 접속하고자 하는 네트워크 내의 모든 터미널을 다 바꾸기는 찝찝하기도 하고 귀찮기도 하여 백도어용으로 사용할 노드 한 대만 포트를 열어두고 나머지는 그 노드를 경유하여 접속하는 것이 나의 일반적인 방식이다.
그마저도 귀찮을 때 백도어 노드에 iptables
를 통해 포트포워딩을 해주어 특정 포트를 사용하여 한 번에 원하는 서버 접속을 할 수 있게 하기 위한 방법을 소개한다.
위의 다이어그램에서 볼 수 있듯, 포워딩을 해줄 노드의 역할은 그냥 패킷을 스쳐지나가듯 흘려보내주기만 하면 되므로 그림상에서 PREROUTING, FORWARD, POSTROUTING 쪽의 규칙만 어떻게 잘 해주면 어찌어찌 돌아갈 것 같다고 대충 눈치를 챌 수 있다. 그렇다면 문제는 그걸 구체적으로 어떻게 하느냐…?
환경
작업 노드: 라즈베리 파이3
OS: Raspbian 8
Procedure
참고 링크: https://wikileaks.org/ciav7p1/cms/page_16384684.html
i) Enable IP Forwarding
sudo sysctl net.ipv4.ip_forward=1
의 커맨드를 입력한다. 혹은 config
파일을 직접 수정해도 된다.
sudo vi /etc/sysctl.conf
나의 경우에는 config
파일을 열어보았더니 이미 설정이 1로 되어 있어서 굳이 뭔가를 바꿀 필요는 없었다. 이는 운영체제마다 기본 설정이 다를 것이므로 체크를 해주어야 할 것이다.
ii) Forward traffic on port [port] to IP [server] on port 22
sudo iptables -t nat -A PREROUTING -p tcp --dport [port] -j DNAT --to-destination [server]:22
[port]
자리에 포워딩할 포트, [server]
자리에 라즈베리를 경유해 접속할 서버의 주소. 예를 들어 라즈베리의 1111
번 포트를 1.1.1.1
의 주소를 가진 서버로 포워딩하고 싶다면,
sudo iptables -t nat -A PREROUTING -p tcp --dport 1111 -j DNAT --to-destination 1.1.1.1:22
iii) Nothing for FORWARD
필터링 따위는 없이 모든 패킷이 이랏샤이마세이므로 FORWARD에 해당하는 규칙은 아무것도 정하지 않을 것이다. 물론 FORWARD chain의 기본정책은 ACCEPT여야 할 것이다. ACCEPT로 안되어 있다면,
sudo iptables -P FORWARD ACCEPT
iv) Ask iptables to Masquerade
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
클라이언트의 주소가 아니라 라즈베리의 주소로 패킷을 다시 써야 한다. (마스커레이딩은 나도 완벽하게 이해한 것은 아니므로 나중에 기회가 되면 다뤄보겠음.)
v) Test
아무 클라이언트에서 라즈베리파이의 1111
포트로 ssh 접속을 시도해본다. 정상적으로 세팅이 되었다면 ssh 접속이 라즈베리가 아닌, 포워딩된 서버로 될 것이다. 또한 호스트 입장에서는 ssh 세션을 외부 주소가 아닌 라즈베리 파이가 접속한 것으로 인식할 것이다.
vi) Save iptables rules
iptables
에 기록된 규칙들은 시스템을 리부트하면 다 사라져버린다. 매번 리부팅 할때마다 다시 위의 설정을 해주면 되지만, 귀찮은 사람이라면 자동으로 해주면 되는데 이건 위의 참고 링크에서 방법을 확인할 수 있다.
2019. 11. 8. 추가)
위의 링크는 좀 구닥다리 방식인 듯 하고 아래 링크가 더 나은 것 같음.
https://www.thomas-krenn.com/en/wiki/Saving_Iptables_Firewall_Rules_Permanently
iptables
로 이것저것 세팅하다보니 유무선공유기라는게 사실 별게 아니라 이런 식으로 동작하는건가 싶다.
0개의 댓글