홈 서버를 웹에서 접근하기


개요

홈 네트워크에서 제공하는 http 서비스를 웹에서 바로 쓰기 위한 설정

동기

어찌저찌 홈 서버를 그럴듯하게 설정하고 나니 여기 저장할 각종 파일들을 외부에서도 쉽게 접근할 수 있었으면 좋겠다는 생각이 들었다.

구조

참고자료

시스템 구조

  • 홈 서버를 외부 네트워크에 바로 올리지 않고, 웹 서버를 하나 거쳐가도록 했다. 홈 서버는 꺼질 수도 있고 집 인터넷이 잠깐 끊길 수도 있으니 웹 서버를 거쳐가는 것이 안정적이라고 생각했다.
  • 웹 서버는 nginx를 사용했다. caddy를 써볼까 해봤지만, 어차피 한번 하면 되는 설정이 조금 간단해지는 것만으로는 옮기기가 조금…
  • ssh 터널링을 했으니 서버 사이 통신은… 안전하겠지?

구현

ssh 터널 구축하기

참고자료: https://gist.github.com/drmalex07/c0f9304deea566842490

홈 서버에서 systemd 서비스를 만들어서 서버가 돌아가는 동안 항상 유지되는 ssh 터널을 만들 수 있다. 참고자료의 설정을 참조하면 되는데 다만 나는 서버의 포트를 로컬로 포워딩하는게 아니라 로컬 서버의 포트를 웹 서버로 포워딩할 것이기 때문에 -L이 아니라 -R을 써서 포워딩을 설정하면 된다.

Arch linux 기준으로 설정 파일은 다음과 같다.

[Unit]
Description=Setup a secure tunnel to target.example.com 
After=network.target

[Service]
ExecStart=/usr/bin/ssh -NT -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -R localhost:2283:localhost:2283 me@target.example.com

# Restart every >2 seconds to avoid StartLimitInterval failure
RestartSec=60
Restart=always

[Install]
WantedBy=multi-user.target

그리고 최초 한번은 root 계정으로 로그인 해서 known host에 등록해줘야 한다. (뭐, 굳이 root가 필요 없으면 sudo -u 로 해도 되겠지?)

사이트 certificate 받기

참고자료: https://certbot.eff.org/instructions

참고자료는 잠깐 접어두고, 그냥 certbot을 실행하면 절반은 먹고 들어간다. 이전에 인증서 설정했던 게 있어서 그런지 이미 내가 nginx를 쓰고있다는 걸 알고있네? 인증서 설정 목록을 보여주네? 새 사이트 추가는 그럼…?

server {
    server_name example.com;
}

딱 요것만 추가하고 certbot을 실행하면 된다. 웹사이트 목록에 example.com을 추가해준다. 그냥 그거 선택하고 10초만 기다리면 인증서가 뚝딱?!

nginx 설정

참고자료: https://immich.app/docs/administration/reverse-proxy

그냥 따라하시면 됩니다.

결론

어쨌든 원하는 대로 연결은 되게 되었는데, 집에서 홈 서버 접속할 때 편하게 웹 서버를 거쳐서 접속할지(집에서도, 밖에서도 동일한 설정으로 접속할 수 있다), 빠르게 로컬 네트워크로 바로 접속할지 고민이 시작되었다. DNS로 어찌저찌 하면 자동으로 스위칭할 수 있지 않을까???