VPN 설치 · 9 min read · Dec 21, 2025

우분투 16.04 LTS에서 Tinc으로 VPN 설치하기

가상 사설망(VPN)은 인터넷과 같은 더 큰 공공 네트워크를 통해 운영되는 안전한 사설 네트워크입니다. VPN은 최근 몇 년 동안 점점 더 인기를 얻고 있으며, 이는 주로 비싼 복잡한 새로운 하드웨어를 설정할 필요 없이 보안과 개인 정보를 강화할 수 있기 때문입니다. 또한 네트워킹 및 지원 비용 절감 등 여러 가지 다른 장점도 제공합니다.

VPN은 공공 네트워크를 통해 암호화된 터널을 생성하여 서버와 단말 간에 데이터를 안전하게 전송하는 방식으로 작동합니다. 이러한 연결은 다양한 방식으로 암호화될 수 있으며, 아키텍처, 예산 및 경험 수준에 맞는 다양한 VPN 클라이언트와 데몬이 있습니다.

Tinc은 이러한 솔루션 중 하나입니다 (1). 오픈 소스 VPN 데몬으로, 현재 다양한 플랫폼에서 사용할 수 있으며 유사한 VPN 클라이언트에 비해 여러 가지 장점이 있습니다. 안전하고 신뢰할 수 있는 암호화, 선택적 압축을 제공하며 네트워크가 성장함에 따라 쉽게 확장할 수 있습니다. 자동 전체 메시 라우팅은 VPN 트래픽이 항상 (가능한 경우) 중간 전송 없이 목적지 기계로 직접 전송되도록 하여 데이터 도난 가능성을 제한함으로써 보안을 크게 향상시킵니다 (3). 또한 Tinc VPN은 IP 수준 네트워크 코드에서 일반 네트워크 장치로 보이기 때문에 Tinc VPN을 설정한 후 기존 소프트웨어를 조정할 필요가 없습니다. 이는 Tinc VPN이 본질적으로 확장 가능하다는 것을 의미합니다.

Tinc의 유일한 사소한 문제는 일부 사람들이 설정하기가 약간 까다롭다고 느꼈다는 것입니다. 만약 당신이 그런 사람이라면 걱정하지 마세요 – 오늘은 서버에서 Tinc VPN을 설정하는 (대체로) 번거롭지 않은 방법을 안내해 드리겠습니다.

사전 요구 사항

이 튜토리얼을 완전히 따르려면 최소한 세 대의 우분투 16.04 서버와 각 기계에 대한 루트 액세스가 필요합니다. 만약 이것이 없다면 또는 이것이 무엇을 의미하는지 확실하지 않다면, 이 튜토리얼은 당신을 위한 것이 아닙니다 – 먼저 우분투를 사용하여 서버를 설정하는 방법을 확인해야 합니다 (2).

서버 시스템을 처음부터 구축하는 경우, 기계들이 서로 어떻게 통신할 것인지 먼저 생각해야 합니다. 이 튜토리얼에서는 대부분의 사람들이 선택할 것이라고 생각되는 변수 이름을 사용할 것이지만, 자신의 설정에 맞게 일부 변수 이름을 조정해야 할 수도 있다는 점을 인지해야 합니다.

이 튜토리얼을 정확히 따르려면 먼저 동일한 데이터 센터에 두 개의 VPS를 설정한 다음, 두 번째 데이터 센터에 세 번째 VPS를 만들어야 합니다. 제 데이터 센터는 NYC2라고 하며, 두 개의 VPS가 있고, AMS2는 세 번째 VPS가 있습니다. 이 VPS는 다음과 같이 명명됩니다:

externalnyc – 모든 VPN 노드가 이 서버에 연결되므로 네트워크가 제대로 작동하도록 연결되고 사용 가능해야 합니다. 나중에 설정에 추가 서버를 추가하려면 externalnyc와 동일한 방식으로 설정해야 합니다.

internalnyc – 이 VPS는 개인 네트워크 인터페이스를 사용하여 externalnyc VPN 노드에 연결됩니다.

ams1 – 이것은 우리의 공용 VPN 연결입니다. 공용 인터넷을 사용하여 externalnyc에 연결됩니다.

목표

우리가 달성하고자 하는 것은 다음과 같습니다:

우리의 사설 네트워크는 초록색 선으로 표시되며, 세 개의 서버를 연결합니다. 주황색은 두 개의 NYC2 서버를 연결하는 사설 네트워크입니다. 세 개의 서버 모두 VPN을 통해 연결할 수 있지만, 사설 네트워크는 AMS1에 접근할 수 없습니다.

이를 위해 다음 단계를 따르세요:

Tinc 설치

먼저 Tinc을 설치해야 합니다. 항상 그렇듯이, 다음 명령어를 실행하여 모든 apt 저장소가 최신인지 확인하세요:

sudo apt-get update

그런 다음 표준 방법으로 apt를 통해 Tinc을 설치하세요:

sudo apt-get install tinc

그게 전부입니다! 이제 기계가 Tinc과 필요한 모든 사전 요구 사항을 다운로드합니다. 이제 구성 파일을 살펴봐야 합니다.

구성

Tinc 구성은 당신이 익숙한 다른 VPN과 약간 다를 수 있습니다. Tinc은 서로 다른 VPN을 구별하기 위해 “netname”을 사용합니다. 이는 Tinc을 통해 여러 VPN을 실행할 때 매우 유용하지만 처음에는 약간 직관적이지 않을 수 있습니다. 이것이 우리의 첫 번째 Tinc 네트워크이므로 간단하게 VPN을 “netname”이라고 부르겠습니다.

이제 각 서버에 대해 구성해야 합니다. 각 서버는 세 가지 구성 요소가 필요합니다:

구성 파일: tinc.conf, tinc-up, tinc-down 및 선택적으로 다른 파일들.

공개 및 개인 키 쌍: 이는 암호화 및 인증을 위한 것입니다.

호스트 구성 파일: 여기에는 공개 키 및 기타 VPN 구성 요소가 포함됩니다.

이제 각 서버를 차례로 구성해 보겠습니다. 먼저 externalnyc입니다.

externalnyc 구성

좋습니다, 이제 본격적으로 시작하겠습니다. externalnyc에서 VPN netname을 위한 구성 디렉토리 구조를 생성합니다. 다음 명령어를 실행하세요:

sudo mkdir -p /etc/tinc/netname/hosts

이제 선택한 텍스트 편집기로 tinc.conf를 엽니다:

sudo vi /etc/tinc/netname/tinc.conf

파일이 열리면, 파일의 맨 아래에 다음을 추가하세요:

Name = externalnyc
AddressFamily = ipv4
Interface = tun0

여기서 하는 일은 externalnyc라는 노드를 구성하고, 서버에 네트워크 인터페이스가 ipv4를 사용하고 “tun0”이라고 불린다고 알려주는 것입니다. 파일을 저장하고 닫습니다.

다음으로, externalnyc에 대한 호스트 구성 파일을 생성해야 합니다. 이를 위해 텍스트 편집기로 호스트 구성 파일을 엽니다:

sudo vi /etc/tinc/netname/hosts/externalnyc

다시 한 번, 이 파일의 맨 아래에 몇 줄을 추가하고 첫 번째 줄에 VPS의 공용 IP 주소를 대체하세요:

Address = externalnyc_public_IP
Subnet = 10.0.0.1/32

이 파일은 다른 서버가 externalnyc에 연결하는 데 사용할 것입니다. 주소는 다른 노드가 이 서버에 어떻게 그리고 어디에서 연결할지를 알려주며, 서브넷 주소는 이 데몬이 작동할 서브넷입니다. 다시 한 번, 이 파일에 대한 변경 사항을 저장하고 닫습니다.

이제 이 호스트에 대한 공개/개인 키 쌍을 생성해야 합니다. 이는 충분히 간단하며, 다음 명령어를 실행하세요:

sudo tincd -n netname -K4096

이 명령어는 개인 RSA 키를 생성하고, 방금 생성한 구성 파일 끝에 공개 키 쌍을 추가합니다. 원하신다면 다시 열어 확인할 수 있습니다.

이제 tinc-up을 만들어야 합니다. 이는 VPN이 시작될 때 실행될 작은 스크립트입니다. 다음 파일을 편집하기 위해 엽니다:

sudo vi /etc/tinc/netname/tinc-up

그리고 다음을 추가하세요:

#!/bin/sh
ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0

VPN netname이 시작될 때마다 이 스크립트가 실행됩니다. 이 스크립트는 VPN에서 사용할 네트워크 인터페이스를 만들고, 이 VPN에서 externalnyc는 10.0.0.1의 IP를 갖게 됩니다.

하지만 VPN이 중지될 때 이 네트워크 인터페이스가 사라지기를 원하므로, 하나의 스크립트를 더 만들어야 합니다. 이는 tinc-down에 추가해야 합니다. 다음을 엽니다:

sudo vi /etc/tinc/netname/tinc-down

그리고 다음을 추가하세요:

#!/bin/sh
ifconfig $INTERFACE down

다시 한 번 저장하고 종료합니다. 이제 스크립트가 준비되었지만 작동하려면 실행 가능으로 플래그가 지정되어야 합니다. 이는 명령줄을 사용하여 쉽게 할 수 있습니다:

sudo chmod 755 /etc/tinc/netname/tinc-*

저장하고 종료하면 이 서버의 구성이 완료됩니다. 다음은 internalnyc와 ams1입니다.

internalnyc 및 ams1 구성

나머지 두 서버를 구성하려면 각 기계에서 동일한 명령어를 실행해야 합니다. 몇 가지 사소한 변형이 있지만, 과정은 기본적으로 동일합니다.

위에서 externalnyc와 같이 먼저 구성 파일을 위한 디렉토리 구조를 만들어야 합니다. 각 서버에서 다음을 실행한 후 Tinc 구성 파일을 편집합니다:

sudo mkdir -p /etc/tinc/netname/hosts  
sudo vi /etc/tinc/netname/tinc.conf

그런 다음 이 파일의 맨 아래에 몇 줄을 추가하고 “node_name”을 각 노드의 이름으로 바꿉니다:

Name = node_name
AddressFamily = ipv4
Interface = tun0
ConnectTo = externalnyc

이제 두 서버가 모두 externalnyc에 연결을 시도하도록 구성되었습니다. 이 파일을 저장하고 닫습니다.

이제 호스트 구성 파일을 만들어야 합니다. 다음을 실행하세요:

sudo vi /etc/tinc/netname/hosts/node_name

그런 다음 internalnyc의 경우 다음 줄을 추가합니다:

Subnet = 10.0.0.2/32

그리고 ams1의 경우 다음 줄을 추가합니다:

Subnet = 10.0.0.3/32

여기서 유일한 차이점은 주소가 다르므로 서버를 구별할 수 있다는 것입니다. 이 파일을 저장하고 닫습니다.

이제 이전과 마찬가지로 공개/개인 키 쌍을 생성하고 네트워크 인터페이스 시작 스크립트를 만들어야 합니다. 각 서버에서 다음을 실행하세요:

sudo tincd -n netname -K4096

그런 다음:

sudo vi /etc/tinc/netname/tinc-up

이제 각 서버에 대해 이전에 지정한 주소를 사용해야 합니다. 저를 정확히 따라오셨다면, internalnyc의 경우 다음을 추가해야 합니다:

ifconfig $INTERFACE 10.0.0.2 netmask 255.255.255.0

그리고 ams1의 경우:

ifconfig $INTERFACE 10.0.0.3 netmask 255.255.255.0

하지만 위에서 다른 주소를 지정했다면, 여기에서도 변경해야 합니다. 이 파일을 저장하고 종료합니다. 거의 다 왔습니다.

이제 이전과 마찬가지로 네트워크 인터페이스 중지 스크립트를 만들어야 합니다:

sudo vi /etc/tinc/netname/tinc-down

그리고 두 서버 모두에 대해 다음 줄을 추가합니다:

ifconfig $INTERFACE down

마지막 구성은 새 스크립트를 실행 가능으로 만드는 것입니다:

sudo chmod 755 /etc/tinc/netname/tinc-*

저장하고 종료합니다. 휴. 모든 것이 잘 진행되었다면, 이제 세 개의 서버가 모두 구성되었습니다. 이제 암호화 구현으로 넘어갑니다.

키 배포

이미 구성 관리 시스템을 사용하고 있다면 운이 좋습니다. 이상적인 상황에서는 이제 만든 각 노드가 공개/개인 키 인터페이스를 사용하여 다른 노드와 직접 통신할 수 있어야 합니다. 위에서 보았듯이, 키는 이제 각 서버의 호스트 구성 파일에 있습니다. 우리가 만드는 간단한 네트워크에서는 실제로 externalnyc만 다른 노드와 키를 교환할 필요가 있습니다.

따라서 가장 쉬운 방법은 각 공개 키를 다양한 노드의 모든 구성원에게 복사하는 것입니다. 이는 실제로 매우 간단하며, 복사할 때 externalnyc의 구성 파일에서 “주소” 값을 자신의 개인 IP 주소로 변경하는 것만 주의하면 됩니다. 그렇게 하면 연결이 사설 네트워크를 통해 설정됩니다.

저를 따라오셨고 VPN을 “netname”이라고 부르셨다면, 호스트 구성 파일은 다음 위치에 있습니다: /etc/tinc/netname/hosts

externalnyc와 internalnyc 간 키 교환

이는 간단합니다. internalnyc에서 호스트 구성 파일을 찾아 externalnyc로 복사합니다:

scp /etc/tinc/netname/hosts/internalnyc user@externalnyc_private_IP:/tmp

그런 다음 externalnyc에서 동일한 파일을 올바른 위치로 복사합니다:

cd /etc/tinc/netname/hosts; sudo cp /tmp/internalnyc .

이제 반대 절차를 수행합니다. externalnyc에서 호스트 구성 파일을 internalnyc로 복사합니다:

scp /etc/tinc/netname/hosts/externalnyc user@internalnyc_private_IP:/tmp

그런 다음 internalnyc에서 파일을 올바른 위치로 복사합니다:

cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .

이제 internalnyc에서 externalnyc의 호스트 구성 파일을 열어 주소가 올바른지 확인해야 합니다. 이는 노드가 사설 네트워크를 통해 VPN에 연결되도록 하기 위함입니다. 따라서 internalnyc에서 externalnyc의 호스트 구성 파일을 엽니다:

sudo vi /etc/tinc/netname/hosts/externalnyc

그리고 주소 값을 externalnyc의 개인 IP 주소로 변경합니다:

Address = externalnyc_private_IP

파일을 저장하고 종료합니다. 이제 이 두 키는 완료되었습니다. 이제 남은 노드와 키를 교환해야 합니다.

externalnyc와 ams1 간 키 교환

여기서 과정은 매우 유사합니다. ams1을 사용하여 호스트 구성 파일을 externalnyc로 복사합니다:

scp /etc/tinc/netname/hosts/ams1 user@externalnyc_public_IP:/tmp

그런 다음 다시 올바른 위치로 복사합니다. externalnyc에서:

cd /etc/tinc/netname/hosts; sudo cp /tmp/ams1 .

externalnyc에 머물면서 파일을 반대 방향으로 ams1으로 복사합니다:

scp /etc/tinc/netname/hosts/externalnyc user@ams1_public_IP:/tmp

그리고 다시 한 번 ams1에서 이 파일을 올바른 위치로 복사합니다:

cd /etc/tinc/netname/hosts; sudo cp /tmp/externalnyc .

이제 키 교환이 완료되었습니다. 이론적으로, 이제 Tinc을 통해 작동하는 암호화된 VPN이 있습니다. 이 튜토리얼을 정확히 따르셨다면, 설정을 테스트할 수 있습니다. 그러나 추가 노드를 추가할 기회를 잡았다면, 이제 필요한 모든 키를 교환할 좋은 시점입니다.

중앙 노드를 사용하는 경우, 모든 서버에 모든 키를 복사할 필요는 없습니다. 그러나 노드가 서로 직접 통신할 수 있도록 하려면 키를 직접 교환해야 합니다. 이 과정은 제가 위에서 설명한 것과 동일합니다 – 원하는 연결성을 달성하기 위해 필요한 만큼 반복하세요.

테스트

이제 테스트할 준비가 되었습니다. 이를 위해 Tinc을 디버그 모드로 시작하는 것이 좋습니다. 이렇게 하면 오류를 잡고 문제가 발생할 경우 더 많은 정보를 얻을 수 있습니다. 잘못 구성된 VPN은 실제로 보안 위험이 될 수 있으므로, 중요한 작업을 위해 VPN을 사용하기 전에 모든 것이 제대로 작동하는지 확인하세요.

각 노드에서 Tinc을 디버그 모드로 시작하려면, externalnyc부터 시작하여 다음을 실행하세요:

sudo tincd -n netname -D -d3

VPN의 이름을 다르게 지정했다면, 물론 “netname” 변수를 적절한 이름으로 변경하세요.

각 노드에서 데몬이 시작되면 연결되는 각 노드의 이름을 제공하는 출력을 반환해야 합니다. 이것이 발생하지 않으면 어딘가에서 실수를 한 것입니다.

이제 VPN을 테스트할 수 있습니다. ams1의 새 창에서 internalnyc의 IP 주소를 사용하여 ping을 실행합니다. 우리는 이전에 10.0.0.2로 할당했으므로 다음을 입력하세요:

ping 10.0.0.2

희망적으로 ping이 작동할 것입니다. 다른 창에서도 방금 만든 연결을 설명하는 디버깅 출력을 볼 수 있어야 합니다. Ams1은 이제 새로운 VPN을 통해 externalnyc에 연결되었으며, 이를 통해 internalnyc에 연결할 수 있습니다. CTRL-C를 눌러 ping을 중지합니다.

이제 안전한 VPN 연결이 있으므로, 이를 사용하여 다른 유형의 네트워크 통신 – 애플리케이션 연결, 파일 복사, SSH 또는 원하는 모든 것을 사용할 수 있습니다.

ping이 작동하지 않았다면 모든 것을 올바르게 수행했다고 생각하지만 방화벽이 방해했을 수 있습니다. 방화벽 설정을 확인하고 다시 시도하세요.

부팅 시 Tinc

마지막으로 한 가지 더. 이제 Tinc VPN을 모든 네트워킹에 사용할 계획이라면 부팅 시 시작되도록 설정할 수 있습니다. 각 노드에서 nets.boot 구성 파일을 편집하여 이 작업을 수행해야 합니다. 다음을 사용하여 파일을 엽니다:

sudo vi /etc/tinc/nets.boot

그런 다음 이 파일에 새 VPN의 이름을 추가합니다. 저와 같이 “netname”을 선택했다면, 다음과 같이 보일 것입니다:

# 이 파일에는 시스템 시작 시 시작될 네트워크의 모든 이름이 포함되어 있습니다.
netname

저장하고 종료하면 완료입니다. Tinc이 이제 작동하며 부팅 시 시작됩니다. 잘 하셨습니다.

Tinc을 제어해야 하는 경우, 이제 “service” 명령어를 실행하여 이를 수행할 수 있습니다. 각 노드에서 다음을 실행하세요:

sudo service tinc start

그리고 마음껏 사용해 보세요. 기본적인 제어는 이 명령어를 통해 수행할 수 있습니다.

결론

이제 모든 기계에서 Tinc을 통해 안전한 VPN 연결이 실행되고 있어야 합니다. 이 VPN은 추가 네트워크 기능을 구축하는 기반으로 사용될 수 있습니다.

앞으로 추가 노드를 추가하거나 Tinc을 다른 VPN과 결합하려는 경우, Tinc이 이를 허용합니다. 각 추가 노드에 대한 과정은 제가 위에서 설명한 것과 동일하며, 변경해야 할 변수와 주소를 쉽게 확인할 수 있어야 합니다. 노드가 서로 직접 연결할 수 있도록 하려면 키를 직접 교환해야 한다는 점만 기억하세요. 이렇게 Tinc은 메시 VPN으로 작동하며, 이는 제 접근 방식보다 더 안전합니다. 그렇지 않으면 제가 한 것처럼 네트워크를 설정하고 모든 것을 중앙 노드를 통해 진행할 수 있습니다.

어쨌든 이제 마음껏 실험할 수 있습니다. 행운을 빕니다!

자료

(1) https://www.tinc-vpn.org/

(2) https://www.howtoforge.com/tutorial/ubuntu-lts-minimal-server/

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.