쉴 틈이 없는 나의 서버..

주말에 친구랑 같이 카페에서 각자 일하고 있는데 핫스팟을 켜달라는 것이다...
아니 갑자기...??
회사 일을 지금 해야할 것 같은데 카페라 공개 IP로는 작업하기 어렵다는게 이유였다 (다시 말하지만 '주말' 이었다 ㅠ)
간절해보이길래 일단 핫스팟을 켜주면서 '홈서버도 있는데 미뤄뒀던 VPN이나 만들어볼까?' 싶었다
어차피 해보고 싶은 목록에 있기도 해서 이번에 만들어보았음...

(진짜 의식의 흐름대로...)
0. VPN 서버란?
- VPN은 문자 그대로 Virtual Private Network, 공용망 위에서 사설망처럼 동작하는 가상 네트워크 기술이다
- 대학생 시절 이딴 것만 읽고 이해된 적은 단 한번도 없으니 조금 더 쉽게 설명해보자면 다음과 같다
- 보안이 위험한, 공개된 카페 wifi에 접속해서 보안이 중요한 업무를 봐야한다고 가정해보자
- 이 때 내 집에 VPN 서버가 있으면, 공개된 카페 wifi를 통해서 내 집의 VPN 서버로 접속한다
- 이후 접속한 내 노트북의 모든 네트워크 패킷은 내 VPN 서버(안전함을 검증받은 내 집의 네트워크)를 통해 나가게 된다
- 그러면 공개된 wifi에 접속했지만? 그 안에서 내가 주고 받는 모든 요청은 VPN 서버를 통해 보안을 챙길 수 있게 되는 것이다
- 여기서 들 수 있는 의문은 '결국 공개된 wifi를 통해서 VPN 서버까지 가는데 어떻게 안전하다는거지?'라는 것
- 이에 대한 대답은 'VPN이 암호화 해주기 때문에 안전하다'이다
- 결국 VPN은 내가 안전하게 드나들 수 있는 '암호화된 터널'을 만드는 것이다
- 물론 이로 인해 [카페 - VPN - 인터넷 접속]이라는 세가지 단계와 암호화 과정 때문에 속도는 약간 손해보게 된다
- 보안 vs 속도 어느쪽에 가중치를 두냐의 차이랄까
- 더 자세한 내용이 궁금하시다면 예전에 VPN 구축하려고 공부해뒀던 포스팅을 참고해보시면 좋겠다
https://ratatou2.tistory.com/167
VPN이 뭔데.. 그거 써야하나? (feat. WireGuard 구축 전의 호기심)
일해라 핫산어쩌다보니 여러 서버를 가지고 있는데 그중에 NAS가 제일 오래됐고, 그만큼 잘 쓰고 있다그냥 클라우드처럼 필요한 것들 업로드 해놓고 편하게 쓴다근데 이제 슬슬 여러가지를 공부
ratatou2.tistory.com
1. WireGuard 설치 및 홈서버 설정
1) WireGuard 설치
sudo apt update
sudo apt install wireguard -y
2) 키 발급
wg genkey | tee privatekey | wg pubkey > publickey
- 근데 보통 키는 안전한 곳에 두곤하니까 쉽게 접근하기 어렵게, 권한도 바꿔서 저장해두자
sudo mkdir -p /etc/wireguard
sudo mv privatekey publickey /etc/wireguard/
sudo chmod 600 /etc/wireguard/privatekey
sudo chmod 644 /etc/wireguard/publickey
- 권한 600은 root 사용자만 읽을 수 있는 파일이다 (privatekey니까 필요한 과정)
- 권한 644는 누구나 읽을 수 있지만, 쓸 수는 없는 파일이다 (publickey니까 편집은 X, 읽기는 O)
3) 포트 오픈 및 네트워크 설정
- 51820 포트는 WireGuard의 디폴트 포트번호다
- 그래서 처음엔 포트포워딩할 때 포트 번호를 바꿀까 했다
- 사실상 WireGuard는 유저가 인증이 안되면 접속조차 안되기 때문에 보안적으로 무의미 하다고 판단하여 그냥 변경없이 진행했음
sudo ufw allow 51820/udp
- 아래 명령어는 리눅스의 '라우터 기능'을 켜는 명령어이다
- 기본적으로 리눅스는 자기으로 들어오고 나가는 패킷만 처리하지 '전달'하진 않는다
- 근데 우리는? VPN 서버로 쓸거고 그러면 전달이 필요하니까 켜주는 것이다
sudo sysctl -w net.ipv4.ip_forward=1
- 이건 재부팅하면 초기화되니까 영구히 적용할 것이라면 아래 과정까지 적용해주면 된다
sudo nano /etc/sysctl.conf
- 'net.ipv4.ip_forward=1'를 추가하거나 주석 해제를 한다

- 적용
sudo sysctl -p
ps. IPv6도 켜주고 싶으면 아래 옵션도 추가하거나 주석 해제를 해주자
net.ipv6.conf.all.forwarding=1
- UFW를 사용 중이라면 아래 과정도 필요하다
- VPN 인터페이스인 wg0 트래픽 허용을 허용해둬야 UFW가 차단하지 않는다
- 또한 wg0로 들어오고 나가는 것이 인터넷을 사용하는 것을 허용해줘야 함
- 이것을 깜빡하면 연결은 됐는데 전혀 통신이 되지 않는 모습을 볼 수 있음 ㅠㅠ
# 클라이언트 -> 서버 / 서버 -> 클라이언트 트래픽 허용
sudo ufw allow in on wg0
sudo ufw allow out on wg0
# VPN -> 인터넷 / 인터넷 -> VPN 허용
sudo ufw route allow in on wg0 out on <<홈서버 네트워크 인터페이스 이름>>
sudo ufw route allow in on <<홈서버 네트워크 인터페이스 이름>> out on wg0
sudo ufw reload
- 네트워크 인터페이스 이름을 확인할 때는 아래 명령어로 확인할 수 있다
- 이때 외부 네트워크 또는 로컬 네트워크 IP를 가진 이름을 쓰면 된다
- 아래 예시에서는 192.~에 물려있는 'enpls0'가 인터페이스 이름이 되겠다
ip route show

4) 설정 세팅
- 아래 명령어로 설정 세팅해둘 파일을 만들거나 수정하자
sudo vim /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <<서버의 PrivateKey>>
PostUp = iptables -t nat -A POSTROUTING -o <<홈서버 네트워크 인터페이스 이름>> -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o <<홈서버 네트워크 인터페이스 이름>> -j MASQUERADE
DNS = 1.1.1.1
# MacBook
[Peer]
PublicKey = <<맥북의 PublicKey>
AllowedIPs = 10.8.0.2/32
# Galaxy
[Peer]
PublicKey = <<갤럭시의 PublicKey>>
AllowedIPs = 10.8.0.3/32
- Peer의 PublicKey는 밑에서 설정하고 얻은 값이 있어야 적을 수 있다 (일단 패스)
- 키 값 확인이 필요하면 간단히 cat 명령어로 확인할 수 있다
# 템플릿
sudo cat <<private키 경로>>
# 예시
sudo cat /etc/wireguard/privatekey
5) 재시작 필요시
- 수정을 했다거나 가상 네트워크를 재시작이 필요하면 아래 명령어로 진행
sudo wg-quick down wg0
sudo wg-quick up wg0
6) 정상동작 체크
- 네트워크가 잘 떴는지 확인해보자
sudo wg show
- 잘 떠있으면 아래같은 화면을 볼 수있음

7) 서버 재부팅 시 VPN 자동 시작
- 아래 명령어로 등록하면 새로 생성한다
sudo systemctl enable wg-quick@wg0

- 기존에 생성된게 있으면 아무것도 안나옴

2. 접속 기기 설정
- 여기서 얻은 PublicKey 값들을 서버에 적어두면 VPN 서버에 접속할 수 있게 된다
1) 맥북 (노트북)
(1) WireGuard 설치
- 맥북은 app store에 가서 설치하면 된다

- 마지막 업데이트가 2년전이라 돌아가긴 하나? 생각했는데 잘되더라 ㅇㅅㅇ
(2) 설정
- '+' 클릭 & Add Empty Tunnel 클릭

- 이제 아래처럼 각자의 환경에 맞는 값을 적어주면 된다

- 홈서버 때는 Interface에 홈서버 정보를 적어뒀다
- 이번엔 맥북이라서 Interface에 맥북 정보를 적으면 되는 것이다
- Address는 홈서버의 wg0.conf에 적어줄 IP를 그대로 적으면 된다
(3) 적용
- 이제 WireGuard를 키면 activate라는 버튼이 생겼을텐데 그것을 누르면 된다

(4) 결과
- VPN 켜기 전 후 사진


- VPN 적용하면 IPv6가 안나오는 것을 볼 수 있는데 나는 IPv6 옵션은 켜두지 않았기 때문이다
- 이것은 위에서 말한 것처럼 /etc/sysctl.conf에서 옵션을 켜줘야 쓸 수 있다
2) 안드로이드 (스마트폰)
(1) 설치
- 똑같이 어플을 설치한다

(2) 설정
- 노트북 설정할 때랑 크게 다를 것 없다

(3) 적용
- 저장하고 나면 WireGuard 어플에서 토글로 켜고 끌 수 있다

(4) 결과
- 정상적으로 내 홈서버 IP로 바뀐 것을 확인할 수 있었다

번외
- 체감 안되던 장점이 VPN을 쓰면 내부망에 들어가 있는 것이나 마찬가지다
- 즉, 외부망 접속을 위해 열어뒀던 외부용 포트들(e.g. SSH, SFTP 용도)을 죄다 닫아도 된다는 것!
- VPN을 켜두니 내부망 주소인 192.~로 시작하는 SSH부터 SFTP까지 다 정상 접속되더라...
- 좀 적응되고 무리 없다면 외부망은 전부 닫는 것도 고려해봐야겠다
[2025.11.24] 1달 후기
- 일단 테스트 겸 내 NAS에 적용해봤는데 굉장히 좋았다
- 로그를 찍어보면 외부에서 공격들어오는 횟수가 현저히 적어졌음
- 그래서 그냥 라즈베리파이 서버는 아예 내부망 + VPN 체제로 100% 전환하기로 했다
- 홈서버는 외부 서비스가 있으니 그냥 둘 예정!
[2025.12.12] 1.5달 후기
- 일단 모든 외부망 접근 방법을 차단해두는 것은 권장하지 않는다...
- VPN에 문제 생기면 내가 매번 서버와 0m까지 접근해야하는 이슈가 생기기 때문..
- 혹시 모를 방법 하나 더 남겨두는건 꽤 괜찮은 아이디어이다
- 그리고 맥북에서만 발생하는 이슈가 하나 있는데 이건 어처구니가 없고 나중에 또 까먹을 것 같아서 따로 포스팅 예정이다 포스팅 완료
https://ratatou2.tistory.com/312
맥북에서 VPN 사용 시 주의할 점 (feat. WireGuard)
이 중에 배신자가 있다맥북에게 통수 맞았다VPN 고친 뒤에 사용하는데 이상하게 맥북에서만 VPN을 켜줘도 아래 두가지 이슈가 생겼다1. 내부망의 다른 서버로 접속 불가2. 심지어 VPN 서버의 로컬 I
ratatou2.tistory.com
- nft, iptables 이런거 수정하거나 건들면 그냥 처음부터 다시 설치하는 마음으로 처음부터 진행하는게 정신건강에 이로웠다 ㅎㅎ..
'Infra > DevOps' 카테고리의 다른 글
| Fail2Ban 돌연사 사건 및 해결방법 (feat. 그지같은 nftables) (0) | 2025.11.15 |
|---|---|
| SSH 22번 포트 자동 복구 시스템 구축하기 (feat. 서버 잃고 뇌 약간 고치기 ㅠ) (0) | 2025.10.24 |
| 서버 부하 테스트 해보기 (feat. K6 스트레스 테스트 & 분산 구조 튜닝) (0) | 2025.10.23 |
| 홈서버 4대로 분산 시스템 구축 해보기 (feat. 생각보다 겁나 쉬움!) (0) | 2025.10.21 |
| 서버 CPU 과부하 시 알림 보내기 (feat. Grafana 알림 설정 방법) (0) | 2025.10.13 |