데비안 리눅스 OpenVPN 클라이언트의 자동 접속

데비안 리눅스에서 OpenVPN 클라이언트를 구성하고 부팅 시 자동으로 접속하는 방법을 정리한다. 서버에서 제공받은 OVPN 파일을 업로드하고 패키지를 설치한 뒤, 명령줄에서 VPN 접속을 시험한다. 이어서 설정 파일을 복사하고 systemd 서비스 파일을 직접 작성해 자동 실행을 등록한다. 마지막으로 재부팅 후 서비스 로그와 통신 경로를 확인하여 VPN 연결 상태를 점검한다.

데비안 리눅스에서 OpenVPN 서버에 접속하기

인터넷과 같은 공용 네트워크를 통해 가상의 사설망을 구축하는 기술을 VPN(Virtual Private Network)이라고 부른다. 멀리 떨어진 장비나 네트워크를 가상의 통신 경로로 연결하여, 동일한 내부 네트워크에 연결된 것처럼 통신할 수 있도록 하는 기술인데, 대충 다음과 같은 목적으로 사용할 수 있다.

  • 해외에서 국내 VPN 서버를 통해 게임에 접속하여, 국내 IP 주소를 사용하는 접속 환경을 구성할 수 있다.
  • 멀리 떨어진 두 사무실의 파일과 프린터 같은 공유 자원을 내부 네트워크에 연결된 것처럼 사용할 수 있다.
  • 두 지점 사이에서 전달되는 데이터를 암호화하여 통신의 보안성을 높일 수 있다.
  • 접속 국가나 네트워크에 따라 제한된 서비스를 다른 지역의 VPN 서버를 통해 이용할 수 있다.
  • 멀티캐스트 전송을 지원하지 않는 인터넷을 통해 멀티캐스트 스트림을 전송한다.
  • 기타 등등등

리눅스 시스템은 VPN 서버로 사용할 수도 있지만, 외부에 있는 VPN 서버에 접속하는 클라이언트로 사용할 수도 있다. 별도의 VPN 장비를 설치하는 대신, 접속이 필요한 리눅스 시스템 자체에 VPN 클라이언트를 구성하는 것이다.

OpenVPN은 이러한 VPN을 구축하는 데 널리 사용되는 오픈소스 솔루션이다. 서버와 클라이언트 구성을 모두 지원하며, 일부 IP 공유기에도 OpenVPN 서버나 클라이언트 기능이 탑재되어 있다. 접속할 서버에서 발급받은 설정 파일이 있다면, 리눅스에서도 이를 이용해 VPN에 접속할 수 있다.

본 글에서는 데비안 리눅스 시스템에 OpenVPN 클라이언트를 설치하고, 설정 파일을 적용해 최종적으로 통신 상태까지 확인하는 절차를 정리한다.

데비안 리눅스 시스템 OpenVPN 클라이언트 구성 절차

Step 1. .ovpn 파일 업로드

OpenVPN 서버에 접속하기 위해서는 접속 설정이 담긴 .ovpn 파일이 필요하다. 이 파일에는 접속할 서버의 주소와 포트, 암호화 및 인증 관련 설정 등이 포함되어 있다. 구성에 따라 인증서와 개인키가 파일 안에 포함되기도 하고, 별도의 파일을 참조하기도 한다. 본 예에서는 파일 하나에 모든 접속 정보와 키 정보가 들어있는 .ovpn 파일을 사용한다. (보통 모바일 기기용 설정 파일이라고 한다.)

이 파일은 OpenVPN 서버 운영자나 VPN 서비스에서 제공하는 파일이다. 인증서와 개인키가 포함되어 있는 경우, 파일을 가진 사람은 누구나 접속할 수 있으므로 관리에 주의해야 한다. 직접 구성한 서버에서 발급받았거나 신뢰할 수 있는 운영자가 제공한 파일만 사용하는 게 좋다.

WinSCP 등을 이용해 설정 파일을 리눅스 사용자 홈 디렉토리에 업로드한다. 본 필자는 VPNProfile.ovpn을 홈 디렉토리에 업로드했다. 별도의 인증서나 개인키 파일이 필요한 설정이라면 해당 파일도 함께 업로드한다.

다음은 본 필자가 사용한 .ovpn파일의 형식이다.

client
dev tun
proto tcp
remote  IP주소와 포트주소
resolv-retry infinite
nobind
persist-key
persist-tun
<ca>인증서 정보</ca>
<cert>
Certificate:
    Data:
        Version: 버전
        Serial Number: 일련번호
    Signature Algorithm: 서명 알고리즘
        Issuer: [발급자 정보]
        Validity
            Not Before: 인증 유효 개시일
            Not After : 인증 만료일
        Subject: 인증서 주체 정보
        Subject Public Key Info:
            Public Key Algorithm: 공개키 알고리즘
                Public-Key: (1024 bit)
                Modulus: [정보]
                Exponent: [Exp 정보]
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                Easy-RSA Generated Certificate
            X509v3 Subject Key Identifier: [키 정보]
            X509v3 Authority Key Identifier:
                keyid:[키 정보]
                DirName:[발급자 정보]
                serial:[발급자 정보]
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
            X509v3 Key Usage:
                Digital Signature
    Signature Algorithm: [서명 정보]
[인증 정보]
</cert>

<key>[개인키 정보]</key>
cipher AES 정보
comp-lzo
verb 5
WinSCP에서 로컬 PC와 원격 리눅스 서버에 VPNProfile.ovpn 파일이 표시된 화면
OpenVPN 접속 설정 파일 업로드

Step 2. OpenVPN 패키지 설치

apt 명령을 이용해 패키지 목록을 갱신하고 openvpn 패키지를 설치한다.

sudo apt update
sudo apt install openvpn

설치 과정에서 계속 진행할 것인지 물어보면 Y를 입력한다. 아래는 설치 과정의 출력 예시이며, 설치되는 의존성 패키지와 용량은 시스템 환경에 따라 달라질 수 있다.

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
(... 중략 ...)
After this operation, 7,802 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
(... 중략 ...)
Fetched 2,559 kB in 0s (56.1 MB/s)
Preconfiguring packages ...
Selecting previously unselected package libccid.
(Reading database ... 34281 files and directories currently installed.)
(... 생략 ...)

설치가 완료되면 다음 명령으로 OpenVPN의 실행 여부와 버전 정보를 확인한다.

user@TestDebian:~$ openvpn --version
OpenVPN 2.6.14 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
library versions: OpenSSL 3.0.22 25 Aug 2026, LZO 2.10
(... 생략 ...)

Step 3. OpenVPN 접속 테스트

앞서 업로드한 .ovpn 파일을 이용해 OpenVPN 서버에 접속이 되는지 확인해 본다. 파일을 업로드한 홈 디렉토리에서 다음과 같이 명령을 실행한다.

user@TestDebian:~$ sudo /usr/sbin/openvpn --config ./VPNProfile.ovpn
2026-09-26 02:52:38 WARNING: Compression for receiving enabled. Compression has been used in the past to break encryption. Sent packets are not compressed unless "allow-compression yes" is also set.
2026-09-26 02:52:38 us=329416 DEPRECATED OPTION: --cipher set to 'AES-128-CBC' but missing in --data-ciphers (AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305). OpenVPN ignores --cipher for cipher negotiations.
2026-09-26 02:52:38 us=329445 Note: '--allow-compression' is not set to 'no', disabling data channel offload.
( ... 중략 ... )
2026-09-26 02:52:39 us=534384 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2026-09-26 02:52:39 us=534391 Initialization Sequence Completed
2026-09-26 02:52:39 us=534395 Data Channel: cipher 'AES-256-GCM', peer-id: 0, compression: 'lzo'
2026-09-26 02:52:39 us=534397 Timers: ping 10, ping-restart 120

Initialization Sequence Completed가 출력되면 VPN 연결 초기화가 완료된 것이다. 이후 추가 메시지 없이 대기하는 것처럼 보일 수 있지만, OpenVPN 클라이언트는 터미널에서 계속 실행되며 연결을 유지하고 있다.

위 예시에는 압축 사용과 기존 암호 설정에 관한 경고도 포함되어 있다. 연결은 완료되었지만 서버 운영자와 접속 설정을 점검할 필요가 있다는 의미다. 실제 데이터 채널에 사용된 암호는 마지막 부분에 표시된 AES-256-GCM이다.

이 상태에서 추가 터미널을 열고 네트워크 인터페이스가 새로 생성되었는지 확인한다.

user@TestDebian:~$ ip a
( ... 중략 ... )
432: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
	link/none
	inet 192.168.254.2/24 scope global tun0
	   valid_lft forever preferred_lft forever
( ... 생략 ... )

위 예시에서는 tun0라는 인터페이스가 새로 생성되었고, IP 주소 192.168.254.2가 할당된 것을 확인할 수 있다. 이 인터페이스가 VPN 터널을 통해 데이터를 주고받는 가상의 네트워크 인터페이스다. 인터페이스 이름과 할당되는 IP 주소는 접속 설정에 따라 달라질 수 있다.

TUN 인터페이스에 state UNKNOWN이 표시되는 것만으로 오류라고 판단할 필요는 없다. 다만 인터페이스가 생성되었다는 사실만으로 목적지까지 정상적으로 통신된다고 단정할 수는 없으므로, VPN을 통해 이용하려는 내부 서버나 서비스에도 접속해 확인한다. 인터넷 통신까지 VPN을 거치도록 구성했다면 해당 통신 경로도 별도로 확인해야 한다.

접속 확인을 마쳤다면 추가 터미널을 닫고, OpenVPN을 실행한 원래 터미널에서 Ctrl + C를 눌러 클라이언트를 종료한다.

Ctrl + C
	2026-09-26 02:52:49 us=541173 event_wait : Interrupted system call (fd=-1,code=4)
	2026-09-26 02:52:49 us=541377 TCP/UDP: Closing socket
	( ... 중략 ... )
	2026-09-26 02:52:49 us=555673 SIGINT[hard,] received, process exiting

이것으로 명령줄에서 OpenVPN 서버에 접속하는 방법을 확인했다. 다만 이 방식은 사용할 때마다 명령을 실행해야 하며, 터미널을 닫거나 SSH 접속을 종료하면 실행 중인 클라이언트도 종료된다. 잠깐씩 접속하는 용도라면 여기까지로도 충분하지만, 부팅 시 자동으로 접속하거나 터미널과 관계없이 VPN 연결을 유지하려면 서비스로 등록해 실행하는 게 편하다.

아래에서는 systemd를 이용한 서비스 자동 실행 방법을 설명한다. 리눅스 시스템에서 systemd 등을 이용해 부팅 시 자동으로 명령을 실행하는 방법은 리눅스 부팅 자동 명령 실행: cron과 systemd를 참고하기 바란다.

Step 4. 접속 설정 파일 복사

.ovpn 파일을 설정 파일 디렉토리로 복사한다. 경로만 맞으면 어디에 있든 상관없지만, 설정 파일은 한데 모아 두는 것이 기억하기에도 편하다. 본 필자는 /etc/openvpn/client를 이용했다.

user@TestDebian:~$ sudo mkdir -p /etc/openvpn/client
user@TestDebian:~$ sudo cp ./VPNProfile.ovpn /etc/openvpn/client/254.ovpn
user@TestDebian:~$ sudo chmod 600 /etc/openvpn/client/254.ovpn

본 필자는 설정 파일을 /etc/openvpn/client/254.ovpn으로 복사했다. 여기서 254는 접속 설정을 구분하기 위한 이름으로, 이후 서비스 실행 명령에서도 같은 이름을 사용해야 한다.

Step 5. systemd 서비스 파일 생성

OpenVPN 클라이언트를 서비스로 실행하기 위해 /etc/systemd/system/vpn@.service 파일을 생성한다.

user@TestDebian:~$ sudo nano /etc/systemd/system/vpn@.service

다음 내용을 입력하고 저장한다.

[Unit]
Description=OpenVPN client %i
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/etc/openvpn/client
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/client/%i.ovpn
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
Description=OpenVPN client %i
서비스의 설명. vpn@254.service로 실행하면 %i가 254로 바뀌어 OpenVPN client 254로 표시된다.
Wants=network-online.target
이 서비스를 시작할 때 네트워크 활성화도 함께 요청한다.
After=network-online.target
네트워크가 활성화된 다음 서비스를 실행한다.
Type=simple
프로세스를 systemd가 직접 관리한다. OpenVPN 자체의 백그라운드 전환 기능은 사용하지 않으므로 .ovpn 파일에도 daemon 옵션을 넣지 않는다.
WorkingDirectory=/etc/openvpn/client
프로그램의 작업 디렉토리
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/client/%i.ovpn
서비스를 실행하는 명령이다. vpn@254.service로 실행하면 /etc/openvpn/client/254.ovpn을 이용한다.
Restart=always
OpenVPN 프로세스가 정상 또는 오류로 종료되면 자동으로 다시 실행한다. 단, systemctl stop으로 서비스를 중지한 경우에는 다시 실행하지 않는다.
RestartSec=5s
자동으로 다시 실행하기 전에 5초간 기다린다.
WantedBy=multi-user.target
systemctl enable로 등록하면 시스템 부팅 과정에서 이 서비스가 시작되도록 한다.

Step 6. 서비스 등록 및 재부팅

새로 작성한 서비스 파일을 systemd가 읽도록 설정을 갱신한다.

user@TestDebian:~$ sudo systemctl daemon-reload

부팅 시 자동으로 실행되도록 서비스를 등록한다. 앞서 설정 파일을 254.ovpn으로 저장했으므로 vpn@254.service를 지정하고 재부팅한다.

user@TestDebian:~$ sudo systemctl enable vpn@254.service
user@TestDebian:~$ sudo systemctl reboot

Step 7. 접속 상태 확인

재부팅 후 서비스가 정상적으로 실행되었는지 확인한다. sudo systemctl status vpn@254.service 명령을 이용해 서비스 상태를 확인한다.

서비스 상태가 active (running)인지 확인하고, 접속 로그에 Initialization Sequence Completed가 출력되었는지도 확인한다.

user@TestDebian:~$ sudo journalctl -b -u vpn@254.service -n 50 --no-pager

접속이 완료되었다면 실제로 VPN을 통해 통신이 이루어지고 있는지 확인한다. 아래는 인터넷 통신을 VPN으로 전달하도록 구성한 환경에서 구글의 DNS 서버인 8.8.8.8까지의 경로를 확인한 예다. 일부 주소는 설명으로 대체했다.

user@TestDebian:~$ sudo traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  192.168.254.1 (192.168.254.1)  2.020 ms  7.106 ms  7.902 ms
 2  VPN 서버 IP  7.912 ms  7.911 ms  7.912 ms
 3  VPN 서버 ISP 내부  7.904 ms  7.906 ms  7.904 ms
 4  VPN 서버 ISP 내부  7.902 ms  8.848 ms  8.846 ms
 (... 중략 ...)
 9  142.251.69.231 (142.251.69.231)  35.365 ms dns.google (8.8.8.8)  81.671 ms 142.250.57.75 (142.250.57.75)  81.642 ms

첫 번째 경유지가 VPN 내부 주소인 192.168.254.1로 표시되어, 해당 목적지로 가는 통신이 VPN을 경유하는 것을 확인했다.

데비안 리눅스 OpenVPN 클라이언트의 용도?

이렇게 구성한 OpenVPN 클라이언트는 여러 가지 용도로 활용할 수 있다. 라우팅과 방화벽 등을 추가로 설정하면 내부 네트워크의 게이트웨이 역할을 담당하면서 인터넷으로 나가는 트래픽을 VPN 서버로 전달할 수 있다. 또한 한 장소의 네트워크를 원격지의 다른 네트워크와 연결하여, 서로의 내부 자원을 이용하도록 구성할 수도 있다.

본 필자의 경우, OpenVPN을 이용해 회사가 이전하는 3개월 동안 양쪽 사무실에서 동일한 업무를 할 수 있도록 구성하거나, 무료 공공 와이파이 사용시 통신을 암호화하여 사용하는 용도로 활용했다.

이처럼 VPN 터널은 단순한 원격 접속을 넘어 다양한 네트워크 구성에 활용할 수 있다. 구체적인 용도와 쓰임은 독자 제위의 필요에 따라 달라질 것이다.

FAQ

OpenVPN은 무료인가?
본 글에서 사용하는 OpenVPN Community Edition은 무료로 사용할 수 있는 오픈 소스 소프트웨어이다. 다만 OpenVPN Access Server와 같은 상용 제품군도 있으며, 외부 업체의 VPN 서비스는 별도의 요금이 발생할 수 있다. 직접 서버를 운영하는 경우에도 서버와 인터넷 회선 등의 비용은 별개이다.
.ovpn 파일에는 어떠한 정보들이 담겨 있는가?
접속할 VPN 서버의 주소와 포트, TCP·UDP 등의 전송 방식, 가상 인터페이스 종류, 암호화와 인증 관련 설정 등이 담겨 있다. 구성에 따라 CA 인증서와 클라이언트 인증서, 개인키가 파일 안에 포함되기도 하고 외부 파일의 경로만 지정되기도 한다. 사용자 이름과 비밀번호 등의 추가 인증이 필요할 수도 있으므로, 모든 .ovpn 파일이 파일 하나만으로 접속되는 것은 아니다.
OpenVPN으로 암호화한 데이터는 안전한가?
일반적으로 적절한 암호화와 인증 설정을 사용하고 보안 업데이트를 적용한다면 안전하게 사용할 수 있다. 하지만 세상에 완벽은 없다. 오래된 암호 방식이나 취약한 설정, 개인키 유출, 서버 또는 단말의 침해까지 VPN이 해결해 주는 것은 아니다. 본문의 예처럼 접속에 성공했더라도 압축이나 암호 설정에 관한 경고가 있다면 서버 운영자와 함께 점검하는 것이 좋다.
VPN 터널을 구성하면 어디에서 어디까지 암호화되는가?
VPN으로 전달하도록 설정한 트래픽은 OpenVPN 클라이언트가 실행되는 장비에서 VPN 서버까지 암호화된다. PC에서 직접 접속하면 해당 PC와 VPN 서버 사이이며, 게이트웨이가 접속하면 해당 게이트웨이와 VPN 서버 사이이다. 내부 단말과 게이트웨이 사이, VPN 서버와 최종 목적지 사이는 OpenVPN 터널의 암호화 범위에 포함되지 않는다. 다만 HTTPS 등을 사용하면 해당 통신은 별도의 암호화로 보호될 수 있다.
OpenVPN과 SSL VPN의 차이는 무엇인가?
OpenVPN은 구체적인 VPN 소프트웨어와 프로토콜을 가리키며, SSL VPN은 SSL 또는 그 후속 기술인 TLS를 활용하는 VPN 방식을 통칭한다. 따라서 서로 완전히 별개의 기술이라고 보기는 어렵다. 본 글처럼 TLS 기반 인증과 키 교환을 사용하는 OpenVPN도 넓은 의미에서 SSL/TLS VPN 계열로 볼 수 있다. 다만 다른 제조사의 SSL VPN 장비와 OpenVPN 클라이언트가 자동으로 호환되는 것은 아니다.
PC가 VPN 서버에 접속하는 것과 게이트웨이가 접속하는 것은 어떻게 다른가?
PC에서 접속하면 해당 PC의 트래픽 가운데 VPN 경로로 지정된 통신이 터널을 사용한다. 게이트웨이에서 접속하면 라우팅과 방화벽, 필요한 경우 NAT를 설정하여 내부의 여러 단말이 같은 VPN 연결을 이용하도록 구성할 수 있다. 이때 VPN 연결을 유지하는 주체는 게이트웨이이며, 내부 단말마다 OpenVPN을 설치할 필요는 없다. 다만 게이트웨이가 VPN에 접속했다는 사실만으로 내부 단말의 통신까지 자동으로 전달되는 것은 아니다.
.ovpn 파일의 백그라운드 실행 설정은 어떻게 확인하는가?
텍스트 편집기로 .ovpn 파일을 열고, 주석 처리되지 않은 daemon 항목이 있는지 확인한다. 이 항목은 OpenVPN 자체가 백그라운드로 전환하도록 하는 설정이며, 실행 명령의 --daemon 옵션으로도 지정할 수 있다. 본 글의 Type=simple 서비스는 OpenVPN을 전면 실행 상태로 두고 systemd가 관리하므로 daemon 항목과 --daemon 옵션을 사용하지 않는다. persist-key와 persist-tun은 백그라운드 실행을 지정하는 옵션이 아니다.
tun0가 생성되면 VPN 접속이 정상적으로 완료된 것인가?
tun0의 생성만으로 정상 통신까지 완료되었다고 판단할 수는 없다. 로그의 Initialization Sequence Completed를 확인하고, 터널에 할당된 IP와 목적지로 향하는 경로를 살펴본 뒤 실제 서버나 서비스에 접속해 확인한다. systemd의 active (running)도 프로세스가 실행 중이라는 뜻이므로, VPN 연결 성공 여부는 접속 로그와 실제 통신 결과를 함께 보아야 한다.
OpenVPN에 접속하면 모든 인터넷 트래픽이 VPN을 통과하는가?
반드시 그렇지는 않다. 지정한 네트워크로 향하는 통신만 VPN을 사용하는 구성과 인터넷 통신까지 VPN으로 전달하는 구성이 모두 가능하다. 실제 동작은 클라이언트 설정, 서버가 전달하는 설정과 운영체제의 라우팅 정책에 따라 달라진다.