안녕하세요!
시놀로지 NAS에서 Docker를 통해 여러 서비스를 운영하다 보면, 특정 서비스나 컨테이너에만 VPN을 연결해야 하는 경우가 생깁니다.
예를 들어, 특정 지역의 콘텐츠에 접근해야 할 때, 전체 네트워크를 VPN에 연결하는 대신 필요한 서비스만 VPN을 통해 트래픽을 전달하도록 설정하는 것이 효율적입니다.
이 포스팅에서는 시놀로지 Docker 환경에서 개별 컨테이너에 VPN을 적용하는 방법을 소개합니다.
이를 통해 원하는 서비스에만 VPN을 설정하고, 다른 서비스는 네트워크 성능 저하 없이 직접 연결을 유지할 수 있습니다.
해당 포스팅은 예시로 LANraragi의 컨테이너를 사용하겠습니다.
Gluetun을 사용하는 게 더 직관적이고 간단합니다!
하지만 해당 포스팅은 원시적인 방법으로 접근할 것이기에,
Gluetun을 사용하고자 하는 분들은 다른 가이드를 참고하시기 바랍니다.
컨테이너 수정
먼저, LANraragi (혹은 VPN을 걸고자 하는) 컨테이너를 제거해야 합니다.
그런 뒤에 SSH에서 명령어로 컨테이너를 설치해야 하는데,
Docker GUI로 세팅했을 경우, 해당 세팅 값을 Chat GPT한테 입력하여 docker -run 명령어를 만들도록 합시다.
혹은, 본인이 Docker Compose.yml이나 docker -run 명령어를 알고 있거나 만들 줄 안다면
Chat GPT를 이용할 필요는 없습니다.
바로 다음 파트로 넘어가시기 바랍니다.

먼저 SSH에서 sudo -i로 권한을 얻은 뒤,
다음 명령어를 입력하여 현재 실행중인 docker 컨테이너의 ID를 알아냅니다.
docker ps
해당 포스팅에서 예시로 든 것은 LANraragi이기 때문에,
9334bd376eea가 필요한 정보입니다.
해당 컨테이너 ID로 다음 명령어를 수정하여 SSH에 입력합니다.
docker inspect -f 'Image: {{ .Config.Image }} | Env: {{ .Config.Env }} | Volumes: {{ .Mounts }}' [컨테이너 ID]

입력할 경우 다음과 같은 결과가 나오는데

이를 전부 복사하여 (마우스 드래그로 자동 복사)
Chat GPT한테 docker -run으로 만들어 달라고 합시다.

필요 없는 부분이 있을 수도 있기에, 다시 한번 Chat GPT의 도움을 받습니다.

잘 읽어본다면 볼륨 부분에서 썸네일 경로가 필요 없음을 확인할 수 있습니다.
수동으로 썸네일 부분만 지웁니다.
필자의 상세 docker -run 코드는 아래에서 확인하실 수 있습니다.
조금 난해한 부분이지만, AI를 믿고 따라오신다면 큰 문제는 없을 것으로 예상됩니다.
docker -run
기존의 docker -run 코드에 추가로 들어가야 할 코드는 다음과 같습니다.
--cap-add=NET_ADMIN \
--device /dev/net/tun \
앞으로 모든 명령어는 SSH에서 sudo -i로 권한을 부여받고 진행합니다.
다음은 필자의 LANraragi를 설치하기 위한 docker -run 명령어입니다.
docker run -d --name LANraragi-4440.ovpn \
--cap-add=NET_ADMIN \
--device /dev/net/tun \
-e LRR_UID=1026 \
-e LRR_GID=100 \
-e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
-e LRR_NETWORK=http://*:3000 \
-p 3000:3000/tcp \
-v /volume1/docker/lanraragi/content:/home/koyomi/lanraragi/content \
-v /volume1/docker/lanraragi/database:/home/koyomi/lanraragi/database \
difegue/lanraragi \
- –cap-add=NET_ADMIN
- –device /dev/net/tun
위 두 옵션을 위해 SSH로 생성하는 것입니다.
반드시 포함시키기 바랍니다.
SSH 작업
screen / ovpn 설치
정상적으로 컨테이너가 생성되고 실행됐다면, SSH를 통해 해당 컨테이너의 새 터미널에 진입합니다.
먼저 docker ps 명령어로 컨테이너의 ID 혹은 컨테이너의 이름을 알아냅니다.
이후 다음 명령어로 컨테이너의 새 터미널에 진입합니다.
docker exec -it [컨테이너 ID] 혹은 [컨테이너 이름] /bin/sh
ovpn과, 편의성을 위한 screen을 사용하기 위해 필수 패키지를 설치합니다.
LANraragi는 alpine으로 apk이기에, 필자는 apk를 사용하겠습니다.
apt인 경우에는 apt 명령어를 사용하시기 바랍니다.
apt update
apt install screen
apt install openvpn
apk update
apk add screen
apk add openvpn
둘 중 정상 설치되는 명령어를 사용하시면 됩니다.
다음 명령어를 통해 경로를 생성하고 권한을 가져옵니다.
mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun
이제 본격적으로 ovpn을 사용하여 연결합니다.
먼저, ovpn 파일을 시놀로지에 업로드하고, 컨테이너에 맵핑한 경로에 이동합니다.
필자의 경우 volume1/docker/lanraragi/database에 업로드 했습니다.
Proton VPN ovpn 파일 다운로드
무료 VPN이면서도 속도 저하가 없는 Proton VPN을 추천드립니다.

위 링크를 통해 Proton VPN 홈페이지에 접속하여 Get Proton VPN now를 클릭하고,

스크롤을 내려 Proton Free를 선택합니다.

계정을 생성합니다.

로그인을 했다면, 좌측 상단에서 다운로드를 클릭합니다.

스크롤을 내려 Android / UDP / 무료 서버 구성을 선택합니다.
네덜란드, 미국, 일본 중에서 원하는 지역의 ovpn 파일을 다운로드합니다.
필자의 경우 일본으로 진행했습니다.

계정 항목을 클릭합니다.

스크롤을 내려, 사용자 이름과 비밀번호를 기록합니다.
이제 다운로드한 ovpn 파일을 시놀로지에 업로드할 것입니다.
예를 들면, 필자는 /volume1/docker/lanraragi/database 경로를 컨테이너가 인식할 수 있게끔 맵핑하였습니다.
따라서 해당 경로에 ovpn 파일을 넣을 것입니다.
중요해서 강조하지만, 현재 작업 공간은 컨테이너의 /bin/sh 입니다.
docker exec -it [컨테이너 ID] 혹은 [컨테이너 이름] /bin/sh
ovpn 적용
ovpn 파일을 이동하였다면, 다음 명령어를 통해 새 스크린을 생성하고, ovpn을 실행합니다.
screen -R screen_name
screen_name 부분에 원하는 이름을 입력합니다.
필자는 ovpn으로 입력했습니다.
- screen -R screen_name
- 기존 스크린을 부착하거나, 존재하지 않는다면 새 스크린을 생성한다.
- screen -ls
- 모든 스크린 리스트를 확인한다.
- screen -X -S [number] quit
- screen -ls를 통해 확인한 번호를 입력하여, 해당 스크린을 종료한다.
- Ctrl A D
- 스크린에서 빠져나온다.
다음 명령어를 개인 환경에 맞게 수정하여 입력합니다.
openvpn –config [ovpn 파일의 경로]

–config 뒤의 경로는 docker 컨테이너의 볼륨 탭에서
마운트 경로를 통하여 ovpn 파일을 찾아 입력하면 됩니다.
필자의 경우 volume1/docker/lanraragi/database에 업로드 했기에, 아래와 같습니다.
openvpn --config /home/koyomi/lanraragi/database/4440.ovpn
4440.ovpn은 필자의 ovpn 파일 이름입니다.

명령어를 정상적으로 실행한 경우, ovpn 파일의 아이디와 비밀번호를 입력해야 합니다.


정상적으로 입력된 경우, 더이상 해당 터미널에서 명령어를 입력할 수 없을 겁니다.

이제 CTRL A D를 통해 스크린에서 빠져나옵니다.
해당 키를 통해 빠져나올 경우, 백그라운드에서 계속 동작하게 됩니다.
VPN 동작 확인
다음 명령어를 통해, ovpn이 제대로 동작하고 있는지 LOG 파일을 생성하여 확인합니다.
openvpn --config [ovpn 파일의 경로] --log [ovpn 파일이 있는 경로]/openvpn.log
필자의 경우 다음과 같습니다.
openvpn --config /home/koyomi/lanraragi/database/4440.ovpn --log /home/koyomi/lanraragi/database/openvpn.log
LOG가 생성됐다면 CTRL Z 혹은 CTRL C와 같은 단축키로 해당 명령을 종료합니다.
제대로 종료되지 않았다면, 다음 명령어를 통해 찾아내어 종료합니다.
ps aux | grep openvpn
kill -9 [number]
kill을 할 때, 현재 실행중인 ovpn을 죽이지 않도록 주의합니다.
만약 tun 오류가 발생한다면
docker: Error response from daemon: error gathering device information while adding custom device "/dev/net/tun": no such file or directory.
만약 위와 같은 오류가 발생한다면, SSH에서 다음 명령을 입력하는 것으로 해결이 가능합니다.
modprobe tun
다만 매 재부팅마다 해당 명령어를 입력해야 하기에, 시놀로지의 스케줄러에 등록하는 것을 추천드립니다.

제어판 > 작업 스케줄러에 진입합니다.

생성 > 트리거된 작업 > 사용자 정의 스크립트를 클릭합니다.

일반 탭에서 사용자를 root로, 이벤트를 부트업으로 지정합니다.

작업 설정 탭에서 사용자 정의 스크립트에 아래 내용을 붙여 넣습니다.
sudo modprobe tun
만약 ovpn이 DNS 오류를 내뿜는다면
이 부분은 개인차가 클 것이기에, 참고만 하길 바랍니다.
대부분의 오류는 Chat GPT가 해결해 줍니다.
필자의 경우 아래의 작업을 통하여, 현재 IP 및 DNS를 구글 DNS인 8.8.8.8로 변경하고
실제로 통신이 되는지 확인해 보았습니다.
ipconfig
cat /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.conf
ping 8.8.8.8
이제 모든 작업이 끝났습니다! 수고 많으셨습니다.
사실 Gluetun을 이용하면 더 쉽게 가능하지만, 필자는 원시적인 방법을 좋아하여 이와 같이 진행하게 되었습니다.
글을 쓰고 보니 조금 난해하다는 생각이 안 들 수가 없네요.
사실 모든 진행 과정은 Chat GPT를 통해 대부분 해결할 수 있습니다.
과정 중에 제일 중요한 것은
mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun
이 명령어가 꼭 필요하다는 것입니다.
이러한 설정을 통해, 여러분은 원하는 컨테이너만 VPN을 통해 연결할 수 있으며,
다른 컨테이너는 기본 네트워크를 통해 외부와 소통할 수 있습니다.
마지막으로, VPN 설정 후 항상 정상적으로 작동하는지 확인하고, 필요한 경우 로그를 검토하여 문제를 해결하는 것이 좋습니다.
이를 통해 안정적이고 안전한 Docker 환경을 유지할 수 있습니다.
이 포스팅이 여러분의 Docker 및 VPN 설정에 도움이 되길 바랍니다.
감사합니다!