홈 서버를 웹에서 접근하기
개요
홈 네트워크에서 제공하는 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로 어찌저찌 하면 자동으로 스위칭할 수 있지 않을까???