SSH를 쓰다 보면 프록시를 타야 할 경우가 가끔 생긴다. 공유기 밑에 여러 호스트가 물려 있다든지 최종 목적지가 특정한 IP로부터의 접속만 허용한다든가 하는 이유로 말이다.
그런 경우엔 방법이 몇 가지 존재하는데 프록시로 쓸 호스트를 A, 최종 목적지 호스트를 X라고 하자.
1. A에 접속한 후 거기에서 X에 접속
[email protected]$ ssh A
[email protected]$ ssh X
[email protected]$
1.1 이걸 한 번에
[email protected]$ ssh A -t ssh X
2대의 호스트를 거쳐 갈 경우에도 가능하다
[email protected]$ ssh A -t ssh B -t ssh X
2. 프록시 설정
1의 방법은 좀 문제가 있는데 SSH를 여러 번 타면 괜히 암호화를 여러 번 거치게 된다. scp도 쓰기에 굉장히 불편하고.
그래서 ~/.ssh/config
를 수정해서 아예 프록시 설정을 만들어버리자.
ControlMaster auto
ControlPath ~/.ssh/tmp/%h_%p_%r
Host X
ProxyCommand ssh -q A -W X:%p
ControlMaster
, ControlPath
부분은 굳이 적지 않아도 되는 부분이지만 X 호스트에 여러 커넥션을 만들 때 굳이 A에 커넥션을 여러 개 만들지 않게 하는 옵션이다. 이 옵션을 쓰려면 ControlPath에 해당하는 디렉터리를 수동으로 만들어 줘야 한다. 디렉터리가 없다면 스스로 만들어 주지 않고 에러를 뱉는다.
ProxyCommand 옵션은 말 그대로 프록시를 만드는 커맨드를 적는 옵션인데 %p는 X에 접속할 때의 포트를 뜻하는 이스케이프 시퀀스이고 나머지는 그냥 평범하게 netcat을 이용해서 커넥션을 여는 것이다.
-W
옵션을 이용하여 nc 없이도 커넥션을 열 수 있다.
2.1 보너스
가끔 포트포워딩이 전혀 동작하지 않는 환경에서 SSH를 열어 둬야 할 때가 있는데 이 때는 Tor를 이용하면 편하다(Tor가 그러라고 있는 건 아니지만..). 참고
SSH를 Tor의 Hidden service로 열어 두고 ssh 설정에 이 ProxyCommand를 쓰면 된다.
# ~/.ssh/config
Host *.onion
ProxyCommand /usr/bin/nc -xlocalhost:9050 -X5 %h %p
# Tor config on server
HiddenServiceDir [directory]
HiddenServicePort 22 127.0.0.1:22
HiddenServiceAuthorizeClient stealth clientname1,clientname2,clientname3