Docker 컨테이너 내부에만 VPN 연결하기
해당 문서에서는, DSM 전체가 아닌, 특정 Docker 컨테이너 내부에만 ovpn으로 우회하는 방법에 대해 기재한다.
예시로 LANraragi 컨테이너를 사용하겠다.
먼저, LANraragi의 컨테이너를 제거해야 한다.
그런 뒤에 SSH에서 명령어로 컨테이너를 설치할 것인데,
Docker GUI로 세팅했을 경우, 해당 세팅 값을 Chat GPT한테 입력하여 docker -run 명령어를 만들도록 하자.
필자는 Docker GUI에서 장치 추가라는 기능을 찾지 못하겠어서, SSH로 생성하였다.
docker -run
다음은 필자의 LANraragi를 설치하기 위한 docker -run 명령어이다.
앞으로 모든 명령어는 SSH에서 sudo -i로 권한을 부여받고 진행한다.
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 \
- -d --name 뒤에 나오는 것은 컨테이너의 이름이다.
개인 기호에 따라 설정하자. - --cap-add=NET_ADMIN은 Docker GUI에서도 설정할 수 있는 부분이다.
- --device /dev/net/tun 이 옵션을 위해서 SSH로 생성하는 것이다.
ovpn을 사용하기 위해 필요하다. - UID, GID는 기본 값인 9001을 사용하거나, 본인의 UID, GID를 알아내어 입력하자.
- -e PATH (이하 생략)은 LANraragi의 기본 환경 변수 값이다.
- -p 3000:3000/tcp는 LANraragi의 기본 포트이다.
맵핑하고 싶은 포트를 전자에 입력하면 된다. (ex 5472:3000)
혹은 호스트를 원할 경우, Chat GPT를 사용하여 바꾸어달라고 하자. - -v 이후에 나오는 문자열은 맵핑 경로이다.
전자에는 'File Station으로 내가 접근할 수 있는 docker 내의 경로'여야 하고,
후자에는 반드시 위에 입력된 문자열을 입력해야 한다.
따라서, 변경해야 할 부분은 /volume1/docker/이하 경로이다.
:/home/koyomi/lanraragi 부분은 변경하여선 안 된다. - difegue/lanraragi는 사용할 이미지를 선택하는 명령어이다.
이렇게 Docker GUI를 사용하여 정상 설치할 수 있는 상태를, Chat GPT를 통해 docker -run 명령어로 만드는 작업을 반드시 진행해야 한다.
SSH 터미널 작업
정상적으로 컨테이너가 생성되고 실행됐다면, SSH를 통해 해당 컨테이너의 새 터미널에 진입한다.
docker exec -it LANraragi-4440.ovpn /bin/sh
docker exec -it 뒤의 LANraragi-4440.ovpn 부분은, 현재 실행중인 컨테이너의 이름이다.
따라서 작업자의 컨테이너 이름에 맞게 변경해주어야 한다.
ovpn과, 편의성을 위한 screen을 사용하기 위해 필수 패키지를 설치한다.
apt를 사용해야하는 경우, apt 명령어를 입력한다.
필자는 alpine이기 때문에, apk로 진행하겠다.
apk update
apk add screen
apk update
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 경로를 컨테이너가 인식할 수 있게끔 맵핑하였다.
따라서 해당 경로에 ovpn 파일을 넣을 것이다.
ovpn 파일을 이동하였다면, 다음 명령어를 통해 새 스크린을 생성하고, ovpn을 실행한다.
screen -R screen_name
screen_name 부분에 원하는 이름을 입력한다.
필자는 ovpn으로 입력했다.
기본적인 screen 명령어
- screen -R screen_name
- 기존 스크린을 부착하거나, 존재하지 않는다면 새 스크린을 생성한다.
- screen -ls
- 모든 스크린 리스트를 확인한다.
- screen -X -S [number] quit
- screen -ls를 통해 확인한 번호를 입력하여, 해당 스크린을 종료한다.
- Ctrl A D
- 스크린에서 빠져나온다.
openvpn --config /home/koyomi/lanraragi/database/4440.ovpn
--config 뒤의 경로는, docker exec -it LANraragi-4440.ovpn /bin/sh 이 명령어를 통해 컨테이너에 진입한 곳에서,
맵핑된 경로를 통하여 ovpn 파일을 찾아 입력하면 된다.
명령어를 정상적으로 실행한 경우, ovpn 파일의 아이디와 비밀번호를 입력해야 한다.
정상적으로 입력된 경우, 더이상 해당 터미널에서 명령어를 입력할 수 없을 것이다.
Ctrl A D를 통해 스크린에서 빠져나온다.
다음 명령어를 통해, ovpn이 제대로 동작하고 있는지 LOG 파일을 생성하여 확인한다.
openvpn --config /home/koyomi/lanraragi/database/4440.ovpn --log /home/koyomi/lanraragi/database/openvpn.log
계속 강조하지만, /home/koyomi/lanraragi는 필자의 경로이다.
본인의 경로에 맞게 수정해야 한다.
LOG가 생성됐다면, Ctrl Z 혹은 Ctrl C와 같은 단축키로 해당 명령을 종료한다.
제대로 종료되지 않았다면, 다음 명령어를 통해 찾아내서 종료한다.
ps aux | grep openvpn
kill -9 [number]
kill을 할 때, 현재 실행중인 ovpn을 죽이지 않도록 주의한다.
만약 OVPN이 DNS 오류를 내뿜는다면
이 부분은 개인차가 클 것이기에, 참고만 하길 바란다.
대부분의 오류는 Chat GPT가 해결해 줄 것이다.
필자의 경우
ifconfig
cat /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.conf
ping 8.8.8.8
위 작업을 통하여, 현재 IP 및 dns를 구글 dns인 8.8,8,8로 변경,
실제로 통신이 되는지 확인하였다.
이제 모든 작업이 끝났다.
사실 모든 진행 과정과 오류는 Chat GPT를 통해 해결할 수 있다.
여기서 제일 중요한 것은
mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun
이 명령어가 꼭 필요하다는 것이다.