Press "Enter" to skip to content

[글쓴이:] comago

openVPN 설치 (on Ubuntu 18.04)

iptime 공유기와 우분투에 openVPN을 설치해서 VPN 서버를 만들어 보겠습니다.

apt를 업데이트하고 openvpn을 설치합니다.

$ sudo apt update
$ sudo apt install openvpn

인증서(CA)를 생성할 EasyRSA를 다운받고 압축을 해제합니다.
다운로드 주소 : https://github.com/OpenVPN/easy-rsa/releases

$ wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
$ tar xvf EasyRSA-3.0.8.tgz

EasyRSA의 설정정보를 수정합니다.
EasyRSA-3.0.8 디렉토리 안에는 vars.example라는 예제파일이 있습니다.
이걸 vars라고 새로 복사 한 후 vars에서 수정하겠습니다.

$ cd ~/EasyRSA-3.0.8/
$ cp vars.example vars
$ vim vars

사용자 정보 부분이 주석처리 (#) 되어 있는데, #을 지워 주석을 해제하고 맞는 정보로 수정합니다.

set_var EASYRSA_REQ_COUNTRY     "KR"
set_var EASYRSA_REQ_PROVINCE    "Seoul"
set_var EASYRSA_REQ_CITY        "DongdaemoonGu"
set_var EASYRSA_REQ_ORG         "My Company co.,Ltd."
set_var EASYRSA_REQ_EMAIL       "mycompany@mycompany.co.kr"
set_var EASYRSA_REQ_OU          "mycompany AI Lab"

EasyRSA-3.0.8 폴더 안에는 easyrsa 파일이 있습니다.
이걸 실행하면 vars에 수정한 정보로 CA 서버가 구축됩니다.
easyras의 초기화 옵션인 init-pki를 추가해 EasyRSA 서버를 구축합니다.

$ ./easyrsa init-pki

Note: using Easy-RSA configuration from: ./vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/ngle/EasyRSA-3.0.8/pki

이제 easyrsa로 인증서와 키 파일을 생성합니다.
매번 비번을 넣기 번거로우므로 nopass 옵션도 줍니다.

$ ./easyrsa build-ca nopass

명령을 실행하면 아래와 같이 Common Name을 묻습니다.

Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

Common Name은 인증서를 만들때 참조할 인증기관을 말합니다.
특별히 입력할게 없다면 그냥 엔터를 치고 넘어갑니다.
그런 기본 인증기관이 지정됩니다.

이번에는 openVPN에서 사용할 인증서와 key파일을 만들겠습니다.
이번에는gen-req 옵션을 주고 바로 다음에 인증서를 사용할 장비의 이름을 넣습니다.
장비이름은 그냥 예제를 따라서 server라고 하겠습니다. nopass 옵션도 줍니다.

$ ./easyrsa gen-req server nopass

명령을 실행하면 인증서를 사용할 이름을 묻습니다.
옵션에 server라고 줬기 때문에 그냥 엔터를 누르면 server라고 생성됩니다.

Common Name (eg: your user, host, or server name) [server]:

결과가 아래와 같이 리턴 되었습니다.
Keypair and certificate request completed. Your files are:
req: /home/ngle/EasyRSA-3.0.4/pki/reqs/server.req
key: /home/ngle/EasyRSA-3.0.4/pki/private/server.key

key 파일과 certificate request 파일이 생성되었습니다.
이제 openVPN 디렉터리에 key파일을 복사합니다.

openVPN 디렉터리는 /etc/openvpn/ 입니다.

$ sudo cp ~/EasyRSA-3.0.4/pki/private/server.key /etc/openvpn/

이제 인증서 파일을 만들 차례입니다.
easyras에 sign-req 옵션을 줍니다.
request 타입은 client와 server가 있는데 server로 줍니다.
아래 명령에서 첫번째 server를 말합니다.
마지막에 오는 server는 key파일의 이름입니다.

$ ./easyrsa sign-req server server

명령을 실행하면 아래와 같이 결과가 나타납니다.

Note: using Easy-RSA configuration from: ./vars


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 3650 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details:

Confirm request details에 yes라고 입력하고 엔터를 누릅니다.
인증서의 유효기간은 3650일 이네요.

실행이 완료되면 server.crt파일이 만들어 집니다.
Certificate created at: /home/ngle/EasyRSA-3.0.8/pki/issued/server.crt

생성된 server.crt 파일과 ca.crt 파일을 openVPN 폴더로 복사합니다.

$ sudo cp ~/EasyRSA-3.0.8/pki/issued/server.crt /etc/openvpn/
$ sudo cp ~/EasyRSA-3.0.8/pki/ca.crt /etc/openvpn/

이제 Diffie-Hellman key를 만들어 줍니다.

$ ./easyrsa gen-dh

생성한 dh.pem 파일과 ta.key 파일을 openvpn 폴더로 복사합니다.

$ sudo cp ~/EasyRSA-3.0.8/ta.key /etc/openvpn/
$ sudo cp ~/EasyRSA-3.0.8/pki/dh.pem /etc/openvpn/

생성해야 할 파일들이 많네요. 서버에 대한 인증서는 이제 준비되었습니다.
이번엔 client에서 사용할 인증서 파일을 만들겠습니다.
client 인증서는 VPN 유저 1명당 발급해야 합니다.
따라서 vpn 계정이 여러개일 경우 아래 명령을 반복해야 합니다.
스크립트로 간단히 만들어 놓으면 좋을 것 같습니다.

먼저 client 인증서를 모아둘 폴더를 하나 만들겠습니다.

$ mkdir -p ~/client-configs/keys
$ chmod -R 700 ~/client-configs

이제 EasyRSA에서 vpn 계정에 대한 인증서를 만들어 줍니다.
vpn 계정을 space4u로 할겁니다.
그럼 easyrsa 명령의 gen-req 옵션에 space4u 라고 common name을 줍니다.
nopass 도 옵션에 포함합니다.

$ cd ~/EasyRSA-3.0.8/
$ ./easyrsa gen-req space4u nopass

명령을 실행하면 아래와 같이 Common Name을 다시한번 확인합니다.

Common Name (eg: your user, host, or server name) [space4u]:

엔터를 치고 space4u로 계속 진행합니다.

Keypair 아 certificate request 파일이 아래와 같이 만들어 졌습니다.
req: /home/ngle/EasyRSA-3.0.4/pki/reqs/space4u.req
key: /home/ngle/EasyRSA-3.0.4/pki/private/space4u.key

생성한 space4u.key 파일을 클라이언트 keys 폴더(~/client-configs/keys)에 복사합니다.

$ cp pki/private/space4u.key ~/client-configs/keys/

space4u.key 파일로 인증서를 만들어 줍니다. request type은 client로 줍니다.

$ ./easyrsa sign-req client space4u

마찬가지로 인증서의 정보가 맞는지 확인합니다.

Note: using Easy-RSA configuration from: ./vars


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a client certificate for 3650 days:

subject=
    commonName                = space4u


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details:

Confirm request details: 에 yes를 입력하고 엔터를 누릅니다.
그럼 아래와 같이 인증서 파일이 만들어 집니다.

Certificate created at: /home/ngle/EasyRSA-3.0.4/pki/issued/space4u.crt

만들어진 인증서 파일(.crt)도 클라이언트 keys 폴더에 복사합니다.

$ sudo cp pki/issued/space4u.crt ~/client-configs/keys/

ca.crt 와 ta.key 파일도 클라이언트 keys 폴더로 복사합니다.

$ sudo cp ~/EasyRSA-3.0.8/ta.key ~/client-configs/keys/
$ sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

이제 openVPN 계정으로 사용할 space4u 계정의 인증서 준비가 되었습니다.

이번엔 openVPN에 대한 설정입니다.
먼저 openVPN에서 제공한 sample config files를 복사하고 압축을 해제합니다.

$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ sudo gzip -d /etc/openvpn/server.conf.gz

압축을 푼 server.conf 파일을 엽니다.

$ sudo vim /etc/openvpn/server.conf

HMAC Section의 tls-auth를 찾습니다.
tls-auth ta.key 0 이 주석이 제거되어 있는지 확인합니다. 그리고 바로 밑에 key-direction 0을 추가합니다.

# For extra security beyond that provided
# by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
#   openvpn --genkey --secret ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be '0'
# on the server and '1' on the clients.
tls-auth ta.key 0 # This file is secret
key-direction 0

다음으로 cryptographic cipher Section의 cipher를 찾습니다.
cipher AES-256-CBC가 주석이 제거되어 있는지 확인합니다. 그리고 바로 밑에 auth SHA256를 추가합니다.

# Select a cryptographic cipher.
# This config item must be copied to
# the client config file as well.
# Note that v2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
cipher AES-256-CBC
auth SHA256

이번에는 dh를 찾습니다.
dh의 파라메터에 dh2048.pem으로 되어 있을 것입니다.
EasyRSA가 생성하는 .pem파일이 이전에는 dh2048.pem이었는데 최근 버전에서는 dh.pem 파일로 생성되는 파일 이름이 변경되었습니다.
(앞서 인증서 생성할때 보셨을 겁니다.)
dh2040.pem에서 2048을 지우고 dh dh.pem 으로 변경합니다.

# Diffie hellman parameters.
# Generate your own with:
#   openssl dhparam -out dh2048.pem 2048
dh dh.pem

마지막으로, user와 group을 찾습니다.
user와 group 앞에있는 주석을 제거합니다.

# It's a good idea to reduce the OpenVPN
# daemon's privileges after initialization.
#
# You can uncomment this out on
# non-Windows systems.
user nobody
group nogroup

여기까지는 server.conf 파일의 기본 변경 설정이었으며 다음은 optional 설정입니다.
저는 아래 설명할 optional 설정도 모두 변경해 줬습니다.

(Optional) Push DNS Changes to Redirect All Traffic Through the VPN
VPN으로 접속한 Client의 DNS를 변경하게 합니다.

# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
push "redirect-gateway def1 bypass-dhcp"

push “redirect-gateway def1 bypass-dhcp” 앞의 주석을 제거합니다.
그리고 바로 밑에있는 dhcp-option 옵션도 주석을 제거합니다.

# Certain Windows-specific network settings
# can be pushed to clients, such as DNS
# or WINS server addresses.  CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
# The addresses below refer to the public
# DNS servers provided by opendns.com.
push "dhcp-option DNS 168.126.63.1"
push "dhcp-option DNS 168.126.63.2"

dhcp-option DNS에 opendns.com의 DNS 주소가 있었는데 저는 KT의 DNS를 사용했습니다.
이렇게 하면 LG나 다른 통신사 회선으로 VPN에 접속하더라도 클라이언트의 DNS를 config에 설정한 DNS로 변경하게 됩니다.

(Optional) Adjust the Port and Protocol
openVPN의 기본 port는 1194이고 UDP를 사용합니다.
이걸 Port는 443, 프로토콜은 TCP를 사용하도록 변경하겠습니다.

# Which TCP/UDP port should OpenVPN listen on?
# If you want to run multiple OpenVPN instances
# on the same machine, use a different port
# number for each one.  You will need to
# open up this port on your firewall.
port 443

# TCP or UDP server?
proto tcp
;proto udp

그리고 tcp를 사용하도록 수정했다면 explicit-exit-notify도 변경해 줘야 합니다.
explicit-exit-notify의 값을 0으로 변경합니다.

# Notify the client that when the server restarts so it
# can automatically reconnect.
explicit-exit-notify 0

(Optional) Point to Non-Default Credentials
만약 앞서 서버 인증서를 만들때 server가 아닌 다른 이름으로 만들었다면 .crt와 .key파일의 이름을 변경해 줘야 합니다.
저는 server로 만들어 줘서 기본 설정인 server.crt와 server.key가 정상적인지만 확인하겠습니다.

# SSL/TLS root certificate (ca), certificate
# (cert), and private key (key).  Each client
# and the server must have their own cert and
# key file.  The server and all clients will
# use the same ca file.
#
# See the "easy-rsa" directory for a series
# of scripts for generating RSA certificates
# and private keys.  Remember to use
# a unique Common Name for the server
# and each of the client certificates.
#
# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret

이제 수정해야 할 기본 설정은 되었습니다.
server.conf 파일을 저장합니다.

이번에는 openVPN server의 네트워크 설정을 변경해 줘야 합니다.
먼저 ip forwarding이 되도록 설정해야 합니다.
/etc/sysctl.conf 파일을 열어서 net.ipv4.ip_forward=1로 수정합니다.

$ sudo vim /etc/sysctl.conf

net.ipv4.ip_forward를 찾습니다.
주석처리 되어 있다면 주석을 해제합니다.

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

주석을 제거했다면 sysctl.conf 파일을 저장합니다.
그리고 현재 열려있는 session에서 변경 사항을 적용합니다.

$ sudo sysctl -p
net.ipv4.ip_forward = 1

이번에는 방화벽(Ubuntu) 설정입니다.
VPN 서버로 들어오는 불필요한 트래픽을 제거하는 목적입니다.
먼저 현재 네트워크의 인터페이스 이름을 확인해야 합니다.
아래 명령으로 확인할 수 있습니다.

$ ip route | grep default
default via 192.168.0.1 dev enp3s0 proto dhcp metric 100 

default gateway가 192.168.0.1로 되어 있네요. 인터페이스 이름은 dev 다음에 있습니다.
enp3s0가 네트워크 인터페이스 네임입니다.

이제 ufw(방화벽) 설정을 열고 openVPN에서 사용할 roule을 추가합니다.

$ sudo vim /etc/ufw/before.rules

UFW rule은 보통 ufw 명령을 사용해 추가합니다.
추가된 방화벽(ufw) rule은 before.rules 파일에 저장됩니다.
아래와같이 추가합니다.

# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
#   ufw-before-input
#   ufw-before-output
#   ufw-before-forward
#
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to enp3s0
-A POSTROUTING -s 10.8.0.0/8 -o enp3s0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
#

VPN으로 접속했을때 클라이언트에서 받는 ip는 10.8.0.1 부터 10.10.255.254까지 입니다.
ip를 다르게 해보려고 했는데 openVPN의 server.conf 파일에 모두 10.8.0.0으로 설정되어 있어서 변경하려면 수정할 부분이 많아집니다.
그래서 그냥 쓰도록 하겠습니다.

추가되는 rule은 START OPENVPN RULES 부터 END OPENVPN RULES까지 내용입니다.
추가되었다면 저장합니다.

UFW에도 추가해야 합니다.
/etc/default/ufw 파일을 열고 DEFAULT_FORWARD_POLICY찾아 ACCEPT로 수정합니다.

$ sudo vim /etc/default/ufw

DEFAULT_FORWARD_POLICY는 DROP이라고 되어 있는 것을 ACCEPT로 변경합니다.

# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="ACCEPT"

ufw 파일을 저장합니다.

앞서 openVPN의 port와 프로토콜을 변경해 줬기 때문에 방화벽(ufw)에도 적용해야 합니다.
openSSH도 추가해 줍니다.

$ sudo ufw allow 443/tcp
$ sudo ufw allow OpenSSH

방화벽 설정이 다 되었다면 ufw disable enable을 실행해 재시작 해줍니다.

$ sudo ufw disable
$ sudo ufw enable

sudo ufw enable 명령을 실행할때 아래와 같은 메시지가 나왔다면 y를 입력합니다.

Command may disrupt existing ssh connections. Proceed with operation (y|n)?

openVPN server를 시작할 준비는 거의 되었습니다.
이제 openVPN을 시작할 차례입니다.
systemctl 명령으로 openVPN을 시작합니다.
openVPN 실행시 설정 파일은 /etc/openvpn/server.conf 파일을 사용하기 위해 @server를 추가해 실행합니다.

$ sudo systemctl start openvpn@server

명령을 실행하면 리턴값이 없습니다.
systemctl status 옵션으로 확인해 봅니다.

$ sudo systemctl status openvpn@server

status 옵션으로 명령을 실행하면 아래와 같이 결과가 나옵니다.

openvpn@server.service - OpenVPN connection to server
   Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-08-30 16:08:10 KST; 6min ago
     Docs: man:openvpn(8)
           https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
           https://community.openvpn.net/openvpn/wiki/HOWTO
 Main PID: 11225 (openvpn)
   Status: "Initialization Sequence Completed"
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
           └─11225 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf --writepid /run/openvpn/server.pid

openVPN의 tun0 인터페이스도 확인해 줍니다.

$ ip addr show tun0
3: tun0:  mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::efXX:abXX:f2XX:a3XX/XX scope link stable-privacy 
       valid_lft forever preferred_lft forever

서버가 reboot되어도 자동으로 시작되도록 설정합니다.

$ sudo systemctl enable openvpn@server
Created symlink /etc/systemd/system/multi-user.target.wants/openvpn@server.service → /lib/systemd/system/openvpn@.service.

이제 openVPN이 모두 설정되었고 실행되었습니다.

여기서 끝이 아닙니다.
초기 사용자로 tongchun을 추가했었는데요.
사용자를 추가할때마다 인증서를 만들어줘야 하기 때문에 상당히 번거롭습니다.
그래서 Client 추가에 설정 구성을 잡도록 하겠습니다.

먼저 만들었단 clinet-configs 폴더 아래 files라고 하위 폴더를 만들어 줍니다.

$ mkdir -p ~/client-configs/files

그리고 client configuration 샘플파일을 client-configs 폴더에 복사합니다.

$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

복사한 base.conf 파일을 열고 수정하겠습니다.

$ sudo vim ~/client-configs/base.conf

remote를 찾아 openVPN 서버의 ip와 port를 추가합니다. (ip는 public ip 입니다.)
port도 기본 포트가 아닌 443으로 변경했으니 443으로 잡아줍니다.

$ # The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote 120.130.170.120 443

이번엔 proto를 찾고 tcp로 변경합니다.
앞서 udp에서 tcp로 변경했습니다.
주석을 변경하면 됩니다.

# Are we connecting to a TCP or
# UDP server?  Use the same setting as
# on the server.
proto tcp
;proto udp

다음으로 user와 group 앞의 주석을 제거합니다.

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

SSL/TLS parms. Section을 찾아 ca, cert, key 설정을 모두 주석 처리 합니다.

# SSL/TLS parms.
# See the server config file for more
# description.  It's best to use
# a separate .crt/.key file pair
# for each client.  A single ca
# file can be used for all clients.
#ca ca.crt
#cert client.crt
#key client.key

cipher와 auth를 찾아 server의 config와 동일하게 수정합니다.
cipher는 AES-256-CBC 그대로이며 auth SHA256은 추가해 줍니다.

# Select a cryptographic cipher.
# If the cipher option is used on the server
# then you must also specify it here.
# Note that v2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
cipher AES-256-CBC
auth SHA256

이번에는 key-direction 1 을 추가해 줍니다. auth 밑에 추가해 주면 됩니다.

key-direction 1

마지막으로 아래 항목을 주석처리 한 채 추가해 줍니다.
추가되는 항목은 리눅스 클라이언트에서 사용하는 항목들입니다
base.config 파일 제일 마지막 줄에 추가했습니다.

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

설정이 완료되었다면 파일을 저장합니다.

이제 simple script를 만들 차례입니다.
인증서와 key 파일들을 구성하고 ~/client-configs/files 경로에 생성하게 해줍니다.
~/client-configs 폴더 안애 make_config.sh 라고 파일을 만들어 줍니다.

$ sudo vim ~/client-configs/make_config.sh

make_config.sh 파일안에 아래와 같이 추가합니다.

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn

make_config.sh 파일을 저장하고 아래와 같이 권한을 줍니다.

$ chmod 700 ~/client-configs/make_config.sh

이제 사용자를 구성할 설정이 완료되었습니다.
client-configs 폴더로 이동해 tongchun 계정을 openVPN 계정으로 만들어 보겠습니다.

$ cd ~/client-configs
$ sudo ./make_config.sh space4u

make_config.sh <인증서를 만든 계정>을 실행하면
~/client-configs/files 안에 계정 이름으로된 .ovpn 파일이 생성됩니다.

저는 space4u.ovpn 파일이 생성되었습니다.

$ ls ~/client-configs/files/
space4u.ovpn

.ovpn 파일은 client에서 vpn 접속시 필요합니다.
VPN으로 접속하려는 로컬 컴퓨터나 모바일 디바이스에서 필요합니다.
.ovpn 파일은 암호화된 sftp나 scp를 이용해 전달되어야 합니다.

[추가]
Windows를 제외한 OS에서 VPN 연결을 하려면 ta.key 파일도 필요합니다.
ta.key 파일도 client-configs/files/ 로 복사하고 권한을 변경해 줍니다.

$ sudo cp ~/client-configs/keys/ta.key ~/client-configs/files/
$ sudo chmod 644 ta.key 

마지막으로 외부에서 내부 openVPN server로 접속할 수 있도록 공유기의 port forwarding 설정을 합니다.

Visual Studio C# 개발시 ActiveX(OCX) 추가하기

키움API로 자동거래 시스템을 만들어 보려고 하는데 OpenAPI가 Ocx로 제공되는데 추가 하는게 완전 헷깔려서 기록합니다.

1. 도구 상자에 OCX 를 추가하여 컨트롤 나오게하기

메뉴 -> 도구(T) -> 도구 상자 항목 선택(X) -> COM 구성 요소 탭 선택

간혹 크리스탈 리포트 베이직 어쩌구 하면서 설치 파일을 요구하지만 취소를 몇번 눌러준다.

저 같은 경우 삽입하려고 하는 것이 KHOpenAPI Control 인데.. 처음에는 안나타날 겁니다.

그럴경우에는 “찾아보기(B)…” 버튼을 클릭해서 삽입하고자 하는 ActiveX(OCX) 파일을 찾아서 지정합니다.

이제 폼 디자인화면으로 이동하면 도구 상자 -> 구성 요소 에 방금 추가한 ActiveX(OCX) 컨트롤이 보입니다.

2. OpenAPI의 경우 KHOpenAPILib를 참조 추가해줘야 한다.

솔루션 탐색기에서 참조 에서 마우스 우클릭 -> 참조추가(R) 를 선택한다.

참조 관리자가 뜨면 좌측에서 “COM” 선택 -> 우측 상단 검색에서 KH만 입력하면 검색되서 나온다.

KHOpenAPILib 체크박스를 체크해서 참조 추가 한다.

이제서야 OCX를 C# 프로젝트에서 사용할 수 있게 설정이 끝났다.

S/W 개발 관리도구 모음

출처 : http://blog.naver.com/PostView.nhn?blogId=wisestone2007&logNo=221105376720&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true

SW 테스트 지원 도구란?

단순하고 반복적인 테스트 작업을 위해 코드 분석, 테스트 케이스 생성, 테스트 환경 구축 등을 도와 테스트의 효율성을 향상 시키는 도구로써 업무 수행 시 수작업 보다 도구를 사용하여 빠르게 수행 가능하며 테스트 수행 시간을 줄여 감소된 시간을 다른 활동에 활용 할 수 있고, 항상 동일한 테스트가 가능하여 매번 완전하게 결과를 검사 할 수 있는 정확성과 정밀성을 제공 한다. 또한, 시뮬레이션을 이용하여 실제 환경과 비슷한 환경에서 작업을 수행하여 리소스 절감이 가능하고, 테스트 인력과 달리 지속적인 작업 수행이 가능 하도록 지원 하는 도구 이다.

SW 테스트 지원 도구의 종류

도구 유형의미
테스트 관리 도구테스트 관리와 수행된 활동에 대한 전반에 대한 지원 및 관리
결함 추적 관리 도구결함 관리, 결함 추적, 변경 요구 사항 및 작업 할당을 수행
정적 분석 도구SW를 실행 시키지 않고 소스코드에서 실행 시 발생할 수 있는 결함을 관리
성능/부하 테스트 도구가상 사용자를 인위적으로 생성하여 시스템 처리 능력 측정해 주는 도구
형상 관리 도구소스 코드에 대한 Branch 생성, Merge 등의 변경 관리와 다양한 산출물의 버전 및 이력 관리를 할 수 있는 도구
빌드&릴리즈 도구소스 코드를 빌드하여 바이너리를 생성하고 이를 배포해주는 도구
프로젝트 관리 도구요구사항을 충족 시키기 위해 프로젝트 관리 프로세스를 효과적으로 관리
CI 관리 도구자동으로 빌드하여 주기적으로 생산해주는 도구

위에서 도구의 유형별 의미를 확인 해 보았다. 그렇다면 각각의 도구 유형의 기능 및 특성에 대해서 확인하고, 오픈 소스 도구의 종류와 각 특징들을 알아 보자.

SW 테스트 관리 도구란?

테스트 케이스 설계, 테스트 계획 수립, 테스트 케이스 할당, 실행 결과 입력, 리포트 작성 등 테스트 전반을 지원하는 관리 도구로써, 다음 과 같은 활동을 지원 한다.

• 테스트의 관리와 수행된 활동에 대한 지원

• 테스트 실행 도구, 결함 추적 그리고 요구사항 관리도구와의 인터페이스 역할

• 별도의 버전 관리 기능을 가지거나 혹은 다른 형상 관리 툴과의 인터페이스 기능을 가짐

• 테스트, 테스트 결과 그리고 요구사항 명세와 같은 소스 문서에 대한 부가사항에 대한 추적성 지원

• 테스트 결과를 기록하고 진행상황 리포트를 생성

SW 테스트 관리 오픈 소스 도구

TestLinkGanttProjectOpenProjRedmine
라이센스GPL2GPL3CPAL1GPL2
특징• 다양한 언어 지원.
• 다양한 버그 시스템들과 연동 가능.
(Mantis, Trac, Bugzilla)
• 간트 차트, 리소스 차트 지원.
• 작업자 투입율과 연동하여 일정관리 가능.
• 간트 차트, 리소스 차트 지원.
• 작업자 투입율과 연동하여 일정 관리 가능.
• 상용프로그램과 호환 가능.
• 형상관리와 통합.
• 간트 차트와 달력기능 제공.
• 다중 프로젝트 지원
기타http://testlink.orghttp://www.ganttproject.bizhttps://www.openproject.orghttp://www.redmine.org/

결함 추적 관리 도구란?

결함 추적 관리 도구는 테스트 진행 중 발견되는 결함 및 인시던트 리포트 정보를 저장하고 관리하는 도구로써, 다음 과 같은 활동을 지원 한다.

• 보고된 인시던트 리포트 간의 우선순위를 정할 수 있음

• 담당자에게 수정하거나 확인 테스트하라는 등의 임무를 할당할 수 있음

• 결함 수정 거부, 수정되어 테스트할 준비 완료, 수정을 다음 릴리즈로 연기 등으로 결함의 상태를 변경하고 귀속할 수 있음

결함 추적 관리 오픈 소스 도구

MantisBugzillaTrac
라이센스GPLMozilla Public LicenseBSD License
특징• 각각의 작업이나 전체 프로젝트에 대해서 작업 진행 상태를 도식화 가능.
• 프로젝트 변경 이력에 대한 추적/관리 및 유지보수.
• 프로젝트 참여자들의 작업 내용을 추가/보고/관리.
• 버그를 지속적으로 관리/참조 가능.
• 버그의 심각도 와 우선순위 지정 가능.
• 엑셀 변환 가능.
• 웹 상에서 게시판 형태로 되어있어 사용하기 쉬움.
• 티켓 발향으로 구성원간 의사소통.
• 마일스톤과 시간이력을 통해 진행 상태를 시각화 하여 제공.
기타https://www.mantisbt.orghttps://www.bugzilla.orghttps://trac.edgewall.org

정적 분석 도구란?

정적 분석 도구는 개발자, 테스터, 그리고 품질 보증 관련자가 동적 테스팅 전에 결함을 발견하는 것을 돕는 도구로써, 다음 과 같은 활동을 지원 한다.

• 코드로부터, 예를 들어 계획이나 위험 분석에 대한 중요한 정보를 줄 수 있는 특성을 계산

• 코딩 표준의 강제

• 구조와 의존성의 분석 (e.g. 링크된 웹 페이지)

• 코드 이해의 지원

정적 분석 오픈 소스 도구

FindBugsCheckStylePMD
라이센스GNULGPLBSD
특징• Java 언어 지원• Java 언어 지원.
• ANT와 결합 가능.
• Java 언어 지원.
• 다양한 플러그인 제공
• 다양한 오픈 소스와 결합 가능.
기타http://findbugs.sourceforge.net/index.htmlhttp://checkstyle.sourceforge.net/https://pmd.github.io/

성능 부하 테스트 도구란?

성능 부하 테스트 도구는 시스템의 응답시간, 처리량, 속도 등에 대해 테스트 수행을 지원 하는 도구로써, 다음 과 같은 활동을 지원 한다.

• 주로 시스템의 부하와 트랜잭션 측정

• 부하 발생을 통해 다수의 사용자 또는 많은 양의 입력 데이터를 모의 테스트

• 테스트 수행 중에 선정된 트랜잭션으로부터 응답시간을 측정 및 기록

• 일반적으로 응답시간에 대한 부하 테스트 로그와 그래프 기반의 리포트 제공

성능부하 테스트 오픈 소스 도구

JMeterSoapUISelenium
라이센스ApacheLGPLApache
특징• HTTP를 사용하여 사이트의 부하를 테스트.
• 다양한 서버 타입 지원. (HTTP, HTTPS, SOAP, LDAP, JMS 등)
• 완벽한 멀티 쓰레딩 프레임워크를 지원하여 다수의 쓰레드가 동시에 데이터를 추출할 수 있음.
• 기능, 리그레이션, 부하 테스트 가능.
• 다양한 오픈 소수와 결합 가능. (Maven, Hudson, Junit, ANT)
• 다양한 리포트 기능 지원. (PDF, DOC, HTML)
• 다양한 플러그인. (IntelliJ, NetBeans, Eclipse)
• 상용버전인 SoapUI Pro 존재.
• 기록 및 재생.
• 지능형 필드 선택. (ID, 이름, Xpath)
• 디버그 및 중단지점 설정.
• 테스트 저장.
• 웹 브라우저 플러그인 지원.
기타http://jmeter.apache.org/ https://www.soapui.org/ http://www.seleniumhq.org

형상 관리 도구란?

형상 관리 도구는 시스템 형상 요소(개발소스, 산출물 문서 등)의 기능적 특성이나 물리적 특성을 문서화 하고 소스코드나 문서의 버전관리, 이력관리, 추적 등 변경 사항을 체계적으로 관리할 수 있는 기능을 제공하는 도구로써, 다음 과 같은 활동을 지원 한다.

• 이전 리 버전이나 버전에 대한 정보를 언제든지 접근할 수 있어야 함 (이력 정보의 필요성)

• 불필요한 사용자가 소스를 수정할 수 없도록 해야 함 (개발 환경의 보안)

• 동일한 프로젝트에 대해서 여러 개발자가 동시에 개발 할 수 있어야 함 (동시 개발의 예)

• 에러가 발생했을 경우 빠른 시간 내에 FIX할 수 있어야 함(생명 주기의 자동화)

• 사용자의 요구에 따라 적시에 최상의 소프트웨어를 공급 할 수 있어야 함 (적시에 소프트웨어 공급)

형상 관리 오픈 소스 도구

TortoiseSVNGitSubversion (SVN)Mercurial
라이센스GPLGPL2APL2GPL2
특징• Windows Explorer에서 바로 Subversion를 사용하여 버전 컨트롤 가능.
• 특정 파일의 변경 로그 확인 가능.
• Git사용자가 Git 저장소를 보유하고 원격과 동기화.
• 거의 모든 명령을 로컬에서 수행하며, branch의 생성/전환/폐기가 빠름.
• 파일이나 디렉토리를 이동해도 이력 보존.
• CVS에 비해 빠른 속도.
• Gzip압축을 통한 저장 공간 절약.
• 크로스 플랫폼, 서버가 불필요, 분산 버전 관리 시스템.
• 원격 저장소와 작업 디렉토리의 구분이 없음.
기타https://tortoisesvn.net/https://git-scm.com/https://subversion.apache.org/https://www.mercurial-scm.org

빌드&릴리즈 관리 도구란?

빌드&릴리즈 관리 도구는 소스코드를 빌드 하여 바이너리를 생성하고 이를 배포해주는 도구로써, 다음 과 같은 활동을 지원 한다.

• 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정을 말하거나 그에 대한 결과물을 의미

• 소프트웨어의 빌드/릴리즈의 자동화를 도와주는 도구

• 개발 완료된 소프트웨어를 모두 결합하여 고객 또는 테스트 팀에게 전달/인도 하기

• 빌드&릴리즈는 형상 관리 영역의 한 부분

빌드&릴리즈 오픈 소스 도구

AntGradleMaven
라이센스APL2APL2APL2
특징• Build 자동화 (컴파일, Javadoc 생성, 실행, FTP SCP, SFTP 연결, CVS연동, 다른 공학 도구와 연동), 배포, 유닛 테스트(Junit활용, HTML등) 테스트 결과 보고서 작성.• ANT의 유연성과 기능을 Maven의 의존성 관리와 조합하여 보다 효과적인 빌드 자동화 실현.
• Groovy에 기반한 DSL을 통해 모든 종료의 빌드를 선언적 방식으로 처리할 수 있고, 많은 부분 적절한 Default값이 제공되어 편리한 적용 가능.
• 프로젝트에 필요한 라이브러리를 POM 파일 만으로 쉽게 구성 가능.
• Convention over Configuration 개념으로 관례적인 프로젝트 폴더 구조 사용.
• Jenkins 같은 CI 도구와 연계하여 빌드 과정 자동화 가능.
기타http://ant.apache.org/ https://gradle.org/https://maven.apache.org/

프로젝트 관리 도구란?

프로젝트 요구사항을 충족시키기 위해 지식, 기술, 도구, 기법 등을 프로젝트 활동에 적용하는 것으로 이러한 지식을 적용하기 위해서 프로세스를 효과적으로 관리해 주는 도구로써, 다음 과 같은 활동을 지원 한다.

• 잠재적인 비즈니스 또는 프로젝트 관련 위험 및 문제를 방지, 식별 및 최소화 하는 기능 제공

• 사용 가능한 리소스를 확인하고 팀을 구성하고 리소스 참여를 요청 할 수 있는 기능 제공

• 일정 진행 상태를 추적하고 변경내용을 관리 하는 기능 제공

프로젝트 관리 오픈 소스 도구

GanttProjectMylynOpenProjRedmine
라이센스GPLEPLCPAL1GPL2
특징• 상용 프로젝트 관리 도구와는 다르게 간단한 인터페이스로 쉽게 사용.
• 작성한 Gantt Chart를 PERT Chart로 쉽게 전환 가능.
• 프로젝트 관리.
• 버그 및 이슈관리.
• 새 기능 관리.
• 저장소와 통합.
• 복잡한 상용 프로젝트 관리 도구와는 다르게 간단한 인터페이스로 쉽게 사용가능,
• 작성한 Gantt Chart를 PERT Chart로 쉽게 전환.
• 다양한 OS지원.
• 유연한 이슈 및 버그 추적,
• 간트 차트와 달력 기능 제공.
• 다중 프로젝트 지원.
• 형상 관리 소프트웨어와의 통합.
기타http://www.ganttproject.bizhttp://www.eclipse.org/mylyn/https://www.openproject.orghttp://www.redmine.org/

CI 관리 도구란?

CI (Continuous Integration) 지속적인 통합이라는 뜻으로 형상관리 시스템에 있는 Source 파일을 읽어 들여 자동으로 빌드하여 실행할 수 있는 결과물 (exe, jar, apk or war등) 형태로 주기적으로 생산해 주는 도구로써, 다음 과 같은 활동을 지원 한다.

• 프로젝트 관리, 버전관리, 시스템에 연결하여 변경사항 인지, 빌드 스크립트 실행, 실행 결과 확인

• 특정 이벤트 발생 시 빌드 스크립트 실행

• 프로젝트 빌드 후 생성되는 산출물과 연동할 수 있는 기능

• 빌드 스크립트의 실행 결과를 구성원에게 피드백 할 수 있는 기능

CI 관리 오픈 소스 도구

Cruise ControlHudsonJenkins
라이센스BSDEPLMIT License
특징• 다양한 Plug-in 제공, 설치 용이, 사용자 커뮤니티의 활성화.• 쉽고 빠르게 설치가능.
• 웹 기반의 UI로 Client에서는 별도의 SW설치가 필요 없음.
• 동시에 여러 project Build가능 / 팀 단위 통합 Build 기능 제공.
• 쉬운 설치 및 웹 기반으로 된 쉬운 UI 제공.
• 여러 Project 동시 Build 제공.
• 다양한 언어/OS 지원.
기타http://cruisecontrol.sourceforge.net/http://hudson-ci.org/https://jenkins.io/

오픈 소스 위주의 각각의 테스트 지원 도구들을 살펴 보았고, 이러한 오픈 소스의 테스트 지원 도구 도입 시 발생할 수 있는 업무 효율의 장점과 함께 단점들도 발생 할 수 있으며 그 내용은 아래와 같다.

장점으로는

• 오픈 소스 사용 시 비용이 절감되고, 많은 정보들이 인터넷상에 공개 되어 있음

• 프로젝트 상황에 맞는 도구를 도입하여 사용이 가능 함

• 프로그래밍 능력이 있는 경우, 원하는 대로 변형하여 사용이 가능 함

• 더 좋은 제품이 나올 경우 새롭게 도입하는데 부담이 적음

단점으로는

• 초기 환경 구축 및 테스트를 수행 하기 위해 많은 시간, 비용, 노력이 요구 됨

• 문제 발생시 기술지원이 되지 않고, 상황에 따라 추가 버전의 개발이 중단 될 수 있음

• 동일한 기능의 상용 도구 보다 기능 범위가 작을 수 있음

• 오픈 소스 도구로 수행한 결과물이 신뢰성을 인정 받지 못하는 경우가 있을 수 있음

테스트 지원 도구는 반복적인 업무를 자동화 하여 테스트 수행 시간을 줄여 주는 효과와 더불어 효율적으로 테스트를 할 수 있다는 것 이다. 그리고 누가, 언제 테스트 해도 똑같은 결과를 얻을 수 있고 프로젝트에 적합한 도구로 만들어가기 위해서는 지속적인 관리, 내부 교육, 유지보수와 같은 노력과 시간을 들여 프로젝트 전반에 걸쳐 체계적으로 적용 될 수 있도록 도입 이후 관리가 필요하다.

참고 Website

http://www.oss.kr/oss_intro13

https://www.swbank.kr/helper/tool/toolMain.do

https://ko.wikipedia.org/wiki