OpenWrt openvpn 설치 및 설정

사전준비

  • 설치에 앞서 vpn firewall 정책설정이 선행되어야 합니다.
  • ddns 설정을 하지 않았다면 ddns설정을 참고하세요. (아래 예시는 myhost.duckdns.org를 사용합니다.)

설치구성

  • vpn 네트워크는 10.8.0.0/24 , udp 포트는 21194 사용
  • 클라이언트의 dns는 서버(OpenWrt 라우터)의 dns 사용 (DoT로 구성한 192.168.1.1)

openvpn 설치

openvpn-easy-rsa및 openvpn-openssl. OpenWrt GUI(luci)를 사용하는 경우 luci-app-openvpn도 설치하세요.

opkg update
opkg install openvpn-easy-rsa openvpn-openssl luci-app-openvpn

키생성

디폴트 키 크기는 2048비트입니다. 2048비트면 충분하지만 4096비트로 비트를 늘리려면 export EASYRSA_KEY_SIZE=4096 로 수정하세요.

# 변수 설정
export EASYRSA_KEY_SIZE=2048
export EASYRSA_PKI="/etc/easy-rsa/pki"
export EASYRSA_REQ_CN="[whatever]"
export EASYRSA_REQ_COUNTRY="[2-letter country code]"
export EASYRSA_REQ_PROVINCE="[whatever]"
export EASYRSA_REQ_ORG="[whatever]"
export EASYRSA_REQ_ORG="[whatever]"
export EASYRSA_REQ_EMAIL="[whatever]"
export EASYRSA_REQ_OU="[whatever]"
export EASYRSA_BATCH="1"

# pki 디렉토리를 제거하고 초기화
easyrsa init-pki

# DH parameters 생성
easyrsa gen-dh

# CA 생성 (인증기관 키 생성)
easyrsa build-ca nopass

# 서버키 생성 및 자체서명 (server 라는 서버키가 생성됩니다)
easyrsa build-server-full server nopass

# 클라이언트키 생성 (client1 라는 클라이언트키가 생성됩니다)
easyrsa build-client-full client1 nopass

생성된 키 복사

생성된 다음 키를 /etc/openvpn으로 복사합니다.

cp /etc/easy-rsa/pki/ca.crt /etc/openvpn/
cp /etc/easy-rsa/pki/dh.pem /etc/openvpn/
cp /etc/easy-rsa/pki/issued/server.crt /etc/openvpn/
cp /etc/easy-rsa/pki/private/server.key /etc/openvpn/

luci 설정

/etc/config/openvpn 을 다음과 같이 편집합니다.

config openvpn 'custom_config'
        option config '/etc/openvpn/my-vpn.conf'
        option enabled '1'
...

서버 구성

/etc/openvpn/my-vpn.conf 을 수정해 openvpn 서버 설정을 합니다.

verb 4
user nobody
group nogroup
dev tun0
server 10.8.0.0 255.255.255.0
proto udp
port 21194
txqueuelen 1000
keepalive 10 120
ncp-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC
cipher AES-256-GCM
comp-lzo no
client-to-client
#client-config-dir /etc/openvpn/ccd
push "route 192.168.1.0 255.255.255.0"
push "dhcp-option DNS 192.168.1.1"
#push "redirect-gateway def1"
push "redirect-gateway autolocal def1"
push "persist-tun"
push "persist-key"
persist-tun
persist-key
topology subnet
ca /etc/easy-rsa/pki/ca.crt
dh /etc/easy-rsa/pki/dh.pem
cert /etc/easy-rsa/pki/issued/server.crt
key /etc/easy-rsa/pki/private/server.key
status-version 2
status /var/run/openvpn.status 10
log-append /var/log/openvpn.log

인터페이스 생성

openvpn 네트워크 인터페이스 생성을 위해 /etc/config/network 다음과 같이 추가합니다.

...
config interface 'tun0'
        option ifname 'tun0'
        option proto 'none'

방화벽 설정

udp 포트 21194를 통해 들어오는 연결 허용합니다.

...
config rule
        option name 'Allow-openvpn'
        option src 'wan'
        option proto 'udp'
        option dest_port '21194'
        option target 'ACCEPT'

서비스 재시작

/etc/init.d/firewall restart
/etc/init.d/network restart
/etc/init.d/openvpn restart

클라이언트 설정

client1.ovpn 화일을 아래와 같이 생성하고 위에서 생성한 키를 클라이언트에 복사합니다.

  • ca.crt
  • client1.crt
  • client1.key
remote myhost.duckdns.org
port 21194
proto udp
comp-lzo no
dev tun
cipher AES-256-GCM
client
remote-cert-tls server
ca ca.crt
cert client1.crt
key client1.key
verb 3
status status
auth-nocache
; log /var/log/openvpn.log

참고사이트

8 Comments

  1. 익명

    아이피타임 공유기에서 Openvpn 클라이언트로 등록하려면
    어떻게 해야 할까요?

    아이폰에서는 Client1.ovpn에
    ca.crt
    client1.crt
    client1.key를
    .....
    ....
    ......
    를 넣어서 연결 성공하였습니다.

    • qquack

      client1.ovpn 화일을 편집기로 열어서
      ca.crt
      client1.crt
      client1.key 내용을 아래와 같은 형식으로 넣어주고 iptime 공유기에서 불러오면 됩니다.

      remote myhost.duckdns.org
      port 21194
      proto udp
      comp-lzo no
      dev tun
      cipher AES-256-GCM
      client
      remote-cert-tls server
      ; ca ca.crt
      ; cert client1.crt
      ; key client1.key
      verb 3
      status status
      auth-nocache
      ; log /var/log/openvpn.log

      <ca>
      -----BEGIN CERTIFICATE-----
      ...
      </ca>
      <cert>
      -----BEGIN CERTIFICATE-----
      ....
      </cert>
      <key>
      -----BEGIN RSA KEY-----
      ...
      </key>

  2. 익명

    iptime 공유기에서는 이상하게 안되네요. 다른 것들에서는 다 됩니다.

    • qquack

      문의하신 내용이 iptime 공유기에서 openvpn client 설정이 안되시는거라면
      먼저 vpngate.net에서 openvpn client 설정화일을 다운받아 iptime 공유기에 테스트를 해보세요.
      (서버가 운영중이라고는 되어 있지만 돌아가지 않는 경우도 많이 있습니다. 안되더라도 몇개정도 해보세요.)
      vpngate 서버와 연결이 된다면 설정화일을 편집기로 열어서 님께서 설정하시려는것과 비교해 보시기 바랍니다.

  3. 익명

    vpngate.net의 클라이언트 설정파일에는
    comp-lzo no 가 없네요.
    vpngate.net의 설정파일에 comp-lzo no를 넣으면 아이폰에서도 접속은 안됩니다.

    알려주신 위의 설정파일에는
    comp-lzo no 를 빼면 아이폰에서는 접속이 안되고요. (반대의 경우네요)

    [ps]님의 블로그보고 많이 배우고 있습니다. 들어올 때마다 늘 감사하게 생각하고 있습니다.

    • qquack

      comp-lzo 옵션은 openvpn 2.4부터 보안을위해 더이상 지원이 중단된 옵션인데 호환성을 위해 2.5에서도 유지되는것으로 알고있습니다.
      아마 그러한 이유로 vpngate의 설정화일엔 빠져있는것 같네요.
      comp-lzo 속성을 제거하면 해당 속성이 있는 클라이언트가 중단되지만 추가하면 그렇지 않은 클라이언트가 중단될수 있습니다.
      따라서 서버설정 및 클라이언트 설정에서 comp-lzo no 를 삭제하고 테스트 해보세요.
      그래도 어떤 문제가 있다면
      ncp-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC
      cipher AES-256-GCM
      도 삭제해 보세요.
      그러나 슬프게도 이게 해결방법이 아닐수 있습니다. 테스트 후 댓글 부탁합니다.

  4. 익명

    comp-lzo, ncp-ciphers, cipher 다 해봤는데
    아이폰에서는 어느 경우에도 잘 되지만, 아이피타임 공유기에서는 안되네요.
    아아피타임 공유기가 지원하는 클라이언트 lt2p나 pptp로 연결해야 할 듯합니다.

    • qquack

      도움 못드려 죄송합니다.
      iptime 공유기에 에러로그를 볼 수 있는 기능이 있으면 도움이 될텐데...
      테스트해볼 iptime 공유기가 없어 뭐라 말씀을 못드리네요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다