SSH 프록시 설정

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

Cannot start docker daemon on systemd

우분투 버전을 올린 후에 Docker 서비스를 시작할 수 없는 문제가 있는데 해결 방법이 좀 기괴해서 나중에 삽질을 또 하지 않기 위해 블로그에 글로 남긴다.

sudo service docker startsudo systemctl start docker든 시작을 할 수 없다는 메시지가 나오고 로그를 살펴보면 -H fd:// 라는 옵션이 붙어 실행이 되는데 이 옵션이 붙으면 실행이 안 된다.
문제는 /etc/default/docker 파일을 봐도 DOCKER_OPTS는 그렇게 설정이 안 되어 있다는 거다.

결론부터 말하자면 /lib/systemd/system/docker.service 얘를 수정하면 된다. 쓸데없이 붙어있는 옵션을 지워 준 후 다음 명령을 실행하자

$ sudo systemctl daemon-reload
$ sudo systemctl start docker

Tasker를 이용해 자취방 숨 쉬게 하기

나는 거의 매일 아침 폰을 열어 날씨를 확인하고 필요한 경우 음성으로 알람을 설정하고 (음성으로 설정해야만 일회용 알람이 만들어진다) 아무튼 구글 나우를 굉장히 좋아한다. 하지만 여기에도 단점이 있는데 음악 재생을 원할 경우 “Google Play Music”이라는 앱 이외에는 동작을 안 한다는 것이다. 난 라즈베리 파이에 MPD를 설치해서 쓰고 있는데 안드로이드용 클라이언트인 MPDroid를 구글 나우에서 어떻게 건드릴 방법이 없었다. 그래서 다들 유용하게 쓴다는 Tasker를 받아봤다.
Play Store에 들어가면 4444원 하는 유료 버전만 있고 체험판이 없는데 공식 홈페이지에 가면 체험판 APK를 받을 수 있다.

일단 나는 밤에 침대에 누웠는데 다시 폰을 열어서 MPDroid를 열고 음악을 끄는 게 귀찮았기에 이것부터 해결하기로 했다.
사실 MPDroid도 Tasker와 연동을 할 수 있는데 난 이걸 몰라서 약간 삽질을 했다. 폰을 좌우로 흔드는 이벤트를 트리거로 해서 Task를 만들었는데 시스템 셸 명령을 실행하게 했고 명령은 다음과 같다.

echo 'password <password>
pause
' | busybox nc <hostname> 6600

아주 변태스럽게 MPD 프로토콜 명세를 읽고 그걸 netcat을 이용해 전달할 뿐이다.

나는 잠 자기 전에 항상 Sleep이라는 플레이리스트를 틀어두고 밤이니까 볼륨을 줄이고 잔다. 그래서 앞의 코드를 응용해 다음과 같이 만들었다.

echo 'password <password>
clear
load Sleep
random 0
consume 1
setvol 70
play
' | busybox nc <hostname> 6600

아까 MPDroid에서도 Tasker를 지원한다고 했는데 기능이 너무 적어서 이런 복잡한 건 못 한다. 그래서 그냥 이렇게 했다. 하지만 이래서는 구글 나우를 대체하지 못 한다. Commandr for Google Now라는 앱을 받아서 “I’m going to sleep”이라는 음성을 받으면 저게 실행되게 했다.
조금만 삽질을 해 보면 음성으로 MPD의 재생을 멈추고 시작하고 하는 것도 쉽게 가능하다.

하는 김에 내가 집에 오면 (폰이 집의 Wi-Fi에 연결 되면) 음악을 틀어주는 것도 해 봤다.

echo 'password <password>
clear
load Streaming
random 1
play
' | busybox nc <hostname> 6600

밤이 되면 내 방 불도 꺼주고 하고 싶은데 이건 스위치 앞에 서보모터를 달거나 릴레이스위치를 달아야 하는 거라 일단 보류해 두고 두 대나 있는 노트북 화면이나 끄게 해봐야겠다. 우분투는 명령어로 화면보호기를 들어갈 수 있으니 어떻게든 될 것 같고 OSX는 아직 모르겠다.

아침에 “Good morning”하고 말을 걸면 오늘의 날씨 등을 알려주는 것도 만들어 봤는데 이건 Tasker 내장의 HTTP GET을 이용해서 야후 날씨를 얻어오고 이걸 다시 셸 스크립트 마법을 이용해 파싱해서 최고/최저 기온, 날씨 등을 얻어 온 뒤 다시 Tasker에서 Google TTS를 이용해 요일과 함께 읽어주게 했다.
이 정도면 충분히 Jarvis 느낌이 나는 것 같기도 하고.

날씨는 http://weather.yahooapis.com/forecastrss?w=< 지역 코드>&u=c 에서 받아 오면 되고

echo '%HTTPD' |
grep yweather:forecast |
head -1

이렇게 오늘에 관한 정보를 얻어 와서 이걸 다시 sed를 이용해 하나하나 분리해서 변수에 저장하면 된다.

echo '%today' |
sed -n 's/.*text="([^"])".*/1/p'

이런 식으로 사용하면 된다.