OpenVPN - 윈디하나의 솔라나라
|
라우팅을 담당한다.
네트워크 브릿지를 담당한다.
tun/tap 드라이버
# wget https://github.com/kaizawa/tuntap/archive/v1.3.3.tar.gz # tar xvfz tuntap-1.3.3.tar.gz # cd tuntap-1.3.3 # ./configure # make # sudo make install
tun 컨트롤러
# wget https://github.com/kaizawa/tunctl/archive/v0.1.1.tar.gz # tar xvfz tunctl-0.1.1.tar.gz # cd tunctl-0.1.1 # ./configure # vi Makefile CC = cc CFLAGS = -O2 -I. # make # sudo make install
bridge 드라이버
# wget https://github.com/kaizawa/bridge/archive/v0.1.3.2.tar.gz # tar xvfz bridge-0.1.3.2.tar.gz # cd bridge-0.1.3.2 # ./configure # make # sudo make install
# wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
# tar xvfz lzo-2.10.tar.gz
# cd lzo-2.10
# ./configure 1)
# make
# sudo make install
1) 64비트로 빌드하려면 CFLAGS="-m64" LDFLAGS="-m64"
을 붙인다.
OpenVPN을 설치할 차례다.
windy@wl ~/src $# wget https://swupdate.openvpn.org/community/releases/openvpn-2.6.12.tar.gz windy@wl ~/src $ tar xvfz openvpn-2.6.12.tar.gz windy@wl ~/src $ cd oopenvpn-2.6.12 windy@wl ~/src/openvpn-2.6.12 $ ./configure \ CFLAGS="-I/usr/local/ssl/include -I/usr/local/include -m64" \ LDFLAGS="-lxnet -lnsl -lsocket -lpam -m64" windy@wl ~/src/openvpn-2.6.12 $ make windy@wl ~/src/openvpn-2.6.12 $ sudo make install
make install
전에 아래와 같이 테스트해볼 수 있다.
# 첫번째 셸 windy@wl ~/src/openvpn-2.6.12/sample $ ../src/openvpn/openvpn --config sample-config-files/loopback-client
# 두번째 셸 windy@wl ~/src/openvpn-2.6.12/sample $ ../src/openvpn/openvpn --config sample-config-files/loopback-server
성공적으로 진행되면 Initialization Sequence Completed
메시지를 볼 수 있다.
Static Key를 사용해 빠르게 OpenVPN 을 사용해 접속할 수 있다. 이 방법은 몇가지 제한이 있지만, 공개키 인프라를 사용하지 않기 때문에 간단하게 사용할 수 있다. 이 방법의 가장 큰 단점은 하나의 커넥션만 허용된다는 것이다. Static Key Mini-HOWTO 에 나와있는 방법이다.
openvpn(1)을 사용해 정적 키를 생성한다.
root@wl ~ # /usr/local/sbin/openvpn --genkey --secret /usr/local/etc/openvpn_static.key root@wl ~ # /usr/local/sbin/openvpn --test-crypto --secret /usr/local/etc/openvpn_static.key ... Tue Feb 01 00:00:00 2015 OpenVPN crypto self-test mode SUCCEEDED.이 키 파일을 서버와 클라이언트에 복사해야 한다. 키가 유출되면 보안상 큰 위협이 되기 때문에, 키를 전달할 때에는 반드시
보안상 안전한방법을 사용해야 한다.
서버 설정은 아래와 같이 한다.
root@wl ~ # vi /usr/local/etc/openvpn_static_server.conf dev tun ifconfig 192.168.0.101 192.168.0.102 secret /usr/local/etc/openvpn_static.key #comp-lzo #keepalive 10 60 #ping-timer-rem #persist-tun #persist-key #user nobody #group nobody #daemon #route 192.168.0.0 255.255.255.0 root@wl ~ # chown root:root /usr/local/etc/openvpn_static_server.conf root@wl ~ # chmod 600 /usr/local/etc/openvpn_static_server.conf root@wl ~ # /usr/local/sbin/openvpn /usr/local/etc/openvpn_static_server.conf Tue Jul 12 00:00:00 2016 OpenVPN 2.3.11 i386-pc-solaris2.10 [SSL (OpenSSL)] [LZO] [IPv6] built on Jul 12 2016 Tue Jul 12 00:00:00 2016 library versions: OpenSSL 1.0.2h 3 May 2016, LZO 2.09 Tue Jul 12 00:00:00 2016 open_tun: got dynamic interface 'tun0' Tue Jul 12 00:00:00 2016 TUN/TAP device tun0 opened Tue Jul 12 00:00:00 2016 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0 Tue Jul 12 00:00:00 2016 /usr/sbin/ifconfig tun0 192.168.0.101 192.168.0.102 mtu 1500 up Tue Jul 12 00:00:00 2016 /usr/sbin/ifconfig tun0 netmask 255.255.255.255 Tue Jul 12 00:00:00 2016 UDPv4 link local (bound): [undef] Tue Jul 12 00:00:00 2016 UDPv4 link remote: [undef]이후에 서버에서 아래와 같이 작업해야 한다.
클라이언트 설정은 아래와 같이 한다.
root@wl2 ~ # vi /usr/local/etc/openvpn_client.conf remote 서버공인IP주소 dev tun ifconfig 192.168.0.102 192.168.0.101 secret /usr/local/etc/openvpn_static.keyl root@wl2 ~ # /usr/local/sbin/openvpn /usr/local/etc/openvpn_client.conf
안드로이드/iOS용 OpenVPN 클라이언트 설정은 각 클라이언트를 참고한다. (하지만 Static Key를 사용한 접속은 대부분 지원하지 않는것으로 알려져 있다. 현 시점에서 필자가 알고 있는 안드로이드용 클라이언트는 없다)
OpenVPN을 브릿지 모드를 사용할지 라우트 모드에서 사용할지를 먼저 결정해야 한다. 브릿지 모드가 설정하기 쉽고 성능도 더 좋지만, 브릿지모드를 지원하지 않는 OpenVPN 클라이언트가 있다. 이 챕터에서는 라우트 모드를 사용하는 예를 보였다.
만약 VPN을 사용해 TCP/IP 프로토콜 이외의 것을 라우팅 해야 하는 경우 브릿지모드를 사용해야 한다. 단 서버 운영체제에서 브릿지모드를 지원해야 하며, 클라이언트 역시 브릿지 모드를 지원해야 한다. 특히 안드로이드용 OpenVPN 클라이언트에서 브릿지 모드를 지원하는지 확인해보자.
ca.key
, ca.crt
, server.key
, server.crt
, dhparam.2.2048.pem
이다.
서버는 아래와 같이 설정한다.
root@wl ~ # vi /usr/local/etc/openvpn_server.conf port 1194 proto udp dev tun ca /usr/local/ssl/certs/ca.crt cert /usr/local/ssl/certs/server.crt key /usr/local/ssl/certs/server.key dh /usr/local/ssl/certs/dhparam.2.2048.pem topology subnet server 192.168.1.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 192.168.1.0 255.255.255.0" push "redirect-gateway def1 bypass-dhcp" client-to-client duplicate-cn keepalive 10 120 comp-lzo max-clients 100 persist-key persist-tun status /var/log/openvpn-status.log log /var/log/openvpn.log verb 4 management localhost 7505 cipher AES-256-GCM auth SHA-256 #tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256 ~
서버에 아래와 같이 넷 마스크를 추가하고, 라우팅과 IP 포워딩을 활성화한다.
root@wl ~ # vi /etc/netmasks ... 192.168.1.0 255.255.255.0 root@wl ~ # svcadm enable route:default root@wl ~ # routeadm -u -e ipv4-forwarding
웹 서버에 .ovpn 파일에 대한 MIME 타입을 지정해준다. 아파치의 경우 아래와 같이 수정하면 된다.
root@wl ~ # vi /usr/local/apache2/conf/httpd.conf <IfModule mime_module> AddType application/x-openvpn-profile .ovpn </IfModule> root@wl ~ # apachectl restart
클라이언트용 인증서를 생성해야 한다. 클라이언트용 인증서(client.key, client.crt)는 서버용 인증서(server.key, server.crt)와 동일한 CA에서 인증 받아야 하며, 생성시 CN
부분을 각 클라이언트마다 다르게 발급해줘야 한다.
만약 CN이 동일한 인증서로 두개이상의 클라이언트에서 접속하려면 서버에 duplicate-cn
를 설정해야 한다.
root@wl ~ # cd /usr/local/ssl/certs
root@wl /usr/local/ssl/certs # openssl req -newkey rsa:4096 -nodes -out client.csr -keyout client.key \
-subj "/C=KR/ST=GyungGiDo/L=Suwon/O=Solanara/OU=SolanaraTeam/CN=SolanaraClient/emailAddress=admin@solanara.net"
root@wl /usr/local/ssl/certs # openssl x509 -req -CA ca.crt -CAkey ca.key -days 365 -in client.csr -out client.crt -sha256 -CAcreateserial
클라이언트는 아래와 같이 설정한다. dev tun
, proto udp
부분은 서버와 동일한 설정을 가져야 한다.
root@wl ~ # vi /usr/local/etc/openvpn_client.conf client dev tun proto udp remote www.solanara.net 1194 nobind comp-lzo persist-key persist-tun ;resolv-retry infinite ;cipher AES-256-CBC ;auth SHA384 verb 3 ca /usr/local/ssl/certs/ca.crt cert /usr/local/ssl/certs/client.crt key /usr/local/ssl/certs/client.key root@wl ~ #
Android/iOS 클라이언트를 포함한 많은 OpenVPN 클라이언트는 프로필 파일(.ovpn)을 사용해 클라이언트를 설정한다. 프로필 파일은 아래와 같이 만든다. 쉽게 말하면 인증서 파일의 경로를 지정하는게 아니라, 키를 태그로 사용해 프로필 파일에 인증서 내용을 포함하면 된다.
root@wl ~ # vi /usr/local/etc/openvpn_client.ovpn client dev tun proto udp remote www.solanara.net 1194 nobind persist-key persist-tun comp-lzo verb 3 root@wl ~ # echo '<ca>' >> /usr/local/etc/openvpn_client.ovpn root@wl ~ # cat /usr/local/ssl/certs/ca.crt >> /usr/local/etc/openvpn_client.ovpn root@wl ~ # echo '</ca>' >> /usr/local/etc/openvpn_client.ovpn root@wl ~ # echo '<cert>' >> /usr/local/etc/openvpn_client.ovpn root@wl ~ # cat /usr/local/ssl/certs/client.crt >> /usr/local/etc/openvpn_client.ovpn root@wl ~ # echo '</cert>' >> /usr/local/etc/openvpn_client.ovpn root@wl ~ # echo '<key>' >> /usr/local/etc/openvpn_client.ovpn root@wl ~ # cat /usr/local/ssl/certs/client.key >> /usr/local/etc/openvpn_client.ovpn root@wl ~ # echo '</key>' >> /usr/local/etc/openvpn_client.ovpn
이렇게 생성한 파일을 Android/iOS 클라이언트에 저장해 클라이언트에서 읽어들이면 된다. 아래는 Android 용 OpenVPN 공식 클라이언트인 OpenVPN Connect로 접속한 화면이다.
OpenVPN 은 별도의 시작/종료 스크립트를 제공하지 않는다. 다음과 같이 실행하면 된다.
root@wl ~ # /usr/local/sbin/openvpn /usr/local/etc/openvpn_server.conf
root@wl ~ # /usr/local/sbin/openvpn /usr/local/etc/openvpn_client.conf
management
항목이 있으면 OpenVPN 서버/클라이언트를 관리할 수 있는 콘솔 포트가 열린다. 솔라나라와 같이 설정했다면, telnet(1)을 사용해 localhost 의 7505 포트로 접속해 관리할 수 있다.
windy@wl ~ # telnet localhost 7505 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. >INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info help Management Interface for OpenVPN 2.4.7 i386-pc-solaris2.11 [SSL (OpenSSL)] [LZO] [LZ4] [MH/PKTINFO] [AEAD] built on Jun 24 2019 Commands: auth-retry t : Auth failure retry mode (none,interact,nointeract). bytecount n : Show bytes in/out, update every n secs (0=off). echo [on|off] [N|all] : Like log, but only show messages in echo buffer. exit|quit : Close management session. forget-passwords : Forget passwords entered so far. help : Print this message. hold [on|off|release] : Set/show hold flag to on/off state, or release current hold and start tunnel. kill cn : Kill the client instance(s) having common name cn. kill IP:port : Kill the client instance connecting from IP:port. load-stats : Show global server load stats. log [on|off] [N|all] : Turn on/off realtime log display + show last N lines or 'all' for entire history. mute [n] : Set log mute level to n, or show level if n is absent. needok type action : Enter confirmation for NEED-OK request of 'type', where action = 'ok' or 'cancel'. needstr type action : Enter confirmation for NEED-STR request of 'type', where action is reply string. net : (Windows only) Show network info and routing table. password type p : Enter password p for a queried OpenVPN password. remote type [host port] : Override remote directive, type=ACCEPT|MOD|SKIP. proxy type [host port flags] : Enter dynamic proxy server info. pid : Show process ID of the current OpenVPN process. client-auth CID KID : Authenticate client-id/key-id CID/KID (MULTILINE) client-auth-nt CID KID : Authenticate client-id/key-id CID/KID client-deny CID KID R [CR] : Deny auth client-id/key-id CID/KID with log reason text R and optional client reason text CR client-kill CID [M] : Kill client instance CID with message M (def=RESTART) env-filter [level] : Set env-var filter level client-pf CID : Define packet filter for client CID (MULTILINE) rsa-sig : Enter an RSA signature in response to >RSA_SIGN challenge Enter signature base64 on subsequent lines followed by END certificate : Enter a client certificate in response to >NEED-CERT challenge Enter certificate base64 on subsequent lines followed by END signal s : Send signal s to daemon, s = SIGHUP|SIGTERM|SIGUSR1|SIGUSR2. state [on|off] [N|all] : Like log, but show state history. status [n] : Show current daemon status info using format #n. test n : Produce n lines of output for testing/debugging. username type u : Enter username u for a queried OpenVPN username. verb [n] : Set log verbosity level to n, or show if n is absent. version : Show current version number. END quit Connection to localhost closed by foreign host. windy@wl ~ #
bytecount n
echo [on|off] [N|all]
status [n]
state [on|off] [N|all]
client-kill CID [M]
RESTART이다. 대부분의 OpenVPN 클라이언트는 끊기면 재접속을 시도한다.
kill cn
kill IP:port
client-deny CID KID R [CR]
openvpn --show-ciphers
, openvpn --show-digests
, openvpn --show-tls
명령을 사용해 확인할 수 있다.
windy@wl ~ $ /usr/local/sbin/openvpn --show-ciphers The following ciphers and cipher modes are available for use with OpenVPN. Each cipher shown below may be use as a parameter to the --cipher option. The default key size is shown as well as whether or not it can be changed with the --keysize directive. Using a CBC or GCM mode is recommended. In static key mode only CBC mode is allowed. ... AES-256-CFB1 (256 bit key, 128 bit block, TLS client/server mode only) AES-256-CFB8 (256 bit key, 128 bit block, TLS client/server mode only) AES-256-GCM (256 bit key, 128 bit block, TLS client/server mode only) AES-256-OFB (256 bit key, 128 bit block, TLS client/server mode only) ARIA-256-CBC (256 bit key, 128 bit block) ARIA-256-CFB (256 bit key, 128 bit block, TLS client/server mode only) ARIA-256-CFB1 (256 bit key, 128 bit block, TLS client/server mode only) ARIA-256-CFB8 (256 bit key, 128 bit block, TLS client/server mode only) ARIA-256-GCM (256 bit key, 128 bit block, TLS client/server mode only) ARIA-256-OFB (256 bit key, 128 bit block, TLS client/server mode only) SEED-CBC (128 bit key, 128 bit block) SEED-CFB (128 bit key, 128 bit block, TLS client/server mode only) SEED-OFB (128 bit key, 128 bit block, TLS client/server mode only) ...
windy@wl ~ $ /usr/local/sbin/openvpn --show-digests The following message digests are available for use with OpenVPN. A message digest is used in conjunction with the HMAC function, to authenticate received packets. You can specify a message digest as parameter to the --auth option. ... SHA512-224 224 bit digest size SHA512-256 256 bit digest size SHA3-224 224 bit digest size SHA3-256 256 bit digest size SHA3-384 384 bit digest size SHA3-512 512 bit digest size SHAKE128 128 bit digest size SHAKE256 256 bit digest size id-rsassa-pkcs1-v1_5-with-sha3-224 224 bit digest size id-rsassa-pkcs1-v1_5-with-sha3-256 256 bit digest size id-rsassa-pkcs1-v1_5-with-sha3-384 384 bit digest size id-rsassa-pkcs1-v1_5-with-sha3-512 512 bit digest size SM3 256 bit digest size RSA-SM3 256 bit digest size RSA-SHA512/224 224 bit digest size RSA-SHA512/256 256 bit digest size ...
windy@wl ~ $ /usr/local/sbin/openvpn --show-tls Available TLS Ciphers, listed in order of preference: For TLS 1.3 and newer (--tls-ciphersuites): TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 For TLS 1.2 and older (--tls-cipher): TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384 TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384 TLS-DHE-RSA-WITH-AES-256-GCM-SHA384 ... windy@wl ~ $
RSS ATOM XHTML 5 CSS3 |
Copyright © 2004-2024 Jo HoSeok. All rights reserved. |