4년전부터 대충 사용하던 openvpn의 찜찜한 부분을 공부해서 다시 정리해보았습니다. 한글 자료가 많이 부족하여 직접 작성하게 되었습니다. 연제 글로 올려봅니다.

  1. https://teamsmiley.github.io/2020/09/11/openvpn-1-tun/
  2. https://teamsmiley.github.io/2020/09/11/openvpn-2-tun-docker/
  3. https://teamsmiley.github.io/2020/09/11/openvpn-3-tap/

openvpn - TUN

사내 vpn을 구축해서 사용해야해서 openvpn을 이용해서 구축을 해 보았다.

vpn을 구축할때는 TUN (layer 3 , nat) 방식과 TAP (layer 2 , bridge) 방식이 있다.

TUN 방식 : 일반적으로 공유기를 쓰는것과 비슷하다. 사내에서 사용하는 아이피 (예 192.168.0.xxx) 를 사용하지 않고 새로운 대역을 할당받아서 vpn이 서로 연결해주는 방식이다.

TAP 방식 : 일반적으로 사내에 switch를 하나더 연결한 것과 같고 사내에서 사용하는 아이피 (예 192.168.0.xxx)와 같은 대역의 아이피를 할당받는다.

server setup

centos 7 로 진행해보고 방화벽은 끄고 하던지 아니면 다음 세팅을 해주면 될듯 싶다.

firewalld centos 7

firewall-cmd –-add-service openvpn –-permanent
firewall-cmd –-add-masquerade –-permanent

firewall-cmd --reload
systemctl restart firewalld

# or
# systemctl stop firewalld
# systemctl disable firewalld

ip forward

vi /etc/sysctl.conf

net.ipv4.ip_forward = 1
systemctl restart network.service

vpn에서 받은걸 ip forward 를 통해서 전달해줘야한다.

TUN 방식

install

ssh vpn01
yum install epel-release -y
yum update -y
yum install -y openvpn wget
  • easy-rsa 2

easy-rsa 2 가 필요하다 그런데 3도 있기는한데 대충 분위기가 2.xx를 쓰는 분위기 openvpn도 3 이 있으나 2.x 쓰는 분위기

혹시 모르니 버전번호도 체크해보기 바란다.

https://github.com/OpenVPN/easy-rsa-old/releases

cd
wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz
tar xfz /tmp/easyrsa
mkdir -p /etc/openvpn/easy-rsa
cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa
ls -alF /etc/openvpn/easy-rsa

Configuring OpenVPN

cp /usr/share/doc/openvpn-2.4.9/sample/sample-config-files/server.conf /etc/openvpn
vi /etc/openvpn/server.conf

기본 설정을 설명

port 1194

# TCP or UDP server?
;proto tcp
proto udp

# tap or tun tun은 nat을 통해서 트래픽을 전달하고 tap은 layer 2 로 브릿지로 사용한다.
;dev tap
dev tun

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret

dh dh2048.pem

server 10.8.0.0 255.255.255.0 # vpn과 클라이언트 사이에 사용할 ip 대역을 표시한다.

ifconfig-pool-persist ipp.txt

;push "route 192.168.10.0 255.255.255.0" # 주석 제거하고 사용하는 ip 를 넣는다.
push "route 192.168.0.0 255.255.255.0" # 현재는 192.168.0.xxx대역에 vpn 클라이언트가 연결하고 싶다

keepalive 10 120

tls-auth ta.key 0

# 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 # 2.4 이상은 AES-256-GCM로 자동으로 한다고함. 주석처리하자.

persist-key
persist-tun

status openvpn-status.log

기본 설정에서 다음코드만 추가한 파일이였음

push "route 192.168.0.0 255.255.255.0"
;cipher AES-256-CBC
user nobody
group nobody

push "dhcp-option DNS 8.8.8.8"

Generating Keys and Certificates

mkdir /etc/openvpn/easy-rsa/keys
vi /etc/openvpn/easy-rsa/vars

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="LosAngeles"
export KEY_ORG="XGrid"
export KEY_EMAIL="teamsmiley@gmail.com"
export KEY_EMAIL=teamsmiley@gmail.com
export KEY_CN=vpn01
export KEY_NAME=vpn01-server
export KEY_OU=devteam
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

필요한 내용은 변경하고 pkcs관련은 그대로 둔다. keycard나 동글 등을 이용할때 사용하는변수라고함. 사용하지 않으므로 그대로 두고 진행

이제 적용해보자.

cd /etc/openvpn/easy-rsa
source ./vars
ls -alF /etc/openvpn/easy-rsa/keys
./clean-all # key를 다 지운다.
ls -alF /etc/openvpn/easy-rsa/keys # 지워졋는지 확인
./build-ca

아까 설정해준값이 기본값으로 나온다. 엔터만 치면됨.

./build-key-server server

또 엔터만 치면된다. 그런데 갑자기 extra를 물어본다. 그냥 엔터

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :PRINTABLE:'CA'
localityName          :PRINTABLE:'LosAngeles'
organizationName      :PRINTABLE:'Yourcompany'
organizationalUnitName:PRINTABLE:'devteam'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'vpn01-server'
emailAddress          :IA5STRING:'teamsmiley@gmail.com'
Certificate is to be certified until Sep  8 15:26:51 2030 GMT (3650 days)
Sign the certificate? [y/n]:y

y를 누르고 진행한다. 10년짜리 cert가 만들어 진다.

Diffie-Hellman key exchange file 을 만들어야함.

./build-dh  # This is going to take a long time
ls -alF /etc/openvpn/easy-rsa/keys  # 확인
cd /etc/openvpn/easy-rsa/keys
cp dh2048.pem ca.crt server.crt server.key /etc/openvpn # 세팅파일에 있던 설정대로 복사해준다.
ls -alF /etc/openvpn

이제 openvpn server는 다 되었다.

client key를 만들어서 사용할수 있게 하자.

cd /etc/openvpn/easy-rsa
. ./vars
./build-key ragon
Common Name (eg, your name or your server's hostname) [ragon]: ragon
Name [vpn01-server]:vpn01
Email Address [support@xgridcolo.com]:teamsmiley@gmail.com

3개의 값에 주의하여 입력하자.

setup openssl.cnf

cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

routing

vpn에 연결되면 트래픽이 vpn까지는 오는데 그 트래픽을 외부로 보내줄 설정을 해야한다. iptables를 이용한다.

NIC_NAME=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
echo $NIC_NAME
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o $NIC_NAME -j MASQUERADE

Starting OpenVPN

systemctl -f enable openvpn@server.service
systemctl start openvpn@server.service
systemctl status openvpn@server.service
systemctl restart openvpn@server.service

Client로 접속 테스트

cd
scp vpn01:/etc/openvpn/easy-rsa/keys/daniel.crt ~/Desktop/openvpn/
scp vpn01:/etc/openvpn/easy-rsa/keys/daniel.key ~/Desktop/openvpn/
scp vpn01:/etc/openvpn/ca.crt ~/Desktop/openvpn/
scp vpn01:/etc/openvpn/ta.key ~/Desktop/openvpn/

vi ragon.ovpn

client
nobind
dev tun

proto udp

remote ---.---.---.--- 1194 udp #본인 아이피를 넣으세요

key-direction 1

cert /Users/ragon/Desktop/openvpn/ragon.crt
key /Users/ragon/Desktop/openvpn/ragon.key

ca /Users/ragon/Desktop/openvpn/ca.crt
tls-auth /Users/ragon/Desktop/openvpn/ta.key

;push "redirect-gateway def" #전체 트래픽을 vpn으로 보내고싶을때 사용

ifconfig를 보면

utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
	inet 10.8.0.6 --> 10.8.0.5 netmask 0xffffffff

6번 아이피를 받앗고 5번으로 보내주는걸 알수 있다. tun모드이다. nat를 해서 전달중

ping 192.168.0.1번을 laptop에서 핑 되는지 확인하자.

서버 설정 업데이트

port 11194        # 기본포트 변경
client-to-client  # 클라이언트끼리 연결
duplicate-cn      # 하나의 키로 중복 연결 허용
user nobody       # 권한
group nobody      # 권한
  • 하나의 키로 여러 컴에서 접속 가능한지 확인. duplicate-cn

서버에 세팅을 해서 동작해야한다.

테스트하자. 잘 된다.

하나의 컴퓨터는 10.8.0.6(pc) –> 10.8.0.5(vpn)

다른 하나는 10.8.0.14(pc)–> 10.8.0.15 (vpn)

클라이언트 설정 업데이트

  • port 변경
remote ---.---.---.--- 11194 udp # 본인 아이피를 넣으세요

포트 변경하고 다시 설치하고 접속하면 잘된다.

  • 1개의 파일로 다 관리하기

파일 경로로 ovpn을 사용하지 않고 하나의 파일에 전부 넣는 방법도 있다.

참조 파일을 열어서 내용을 접속 파일에 넣어주면 된다.

client
nobind
dev tun

proto udp

remote ---.---.---.--- 11194 udp # 본인 서버 아이피를 넣으세요

key-direction 1

# cert /Users/ragon/Desktop/openvpn/ragon.crt
# key /Users/ragon/Desktop/openvpn/ragon.key

# ca /Users/ragon/Desktop/openvpn/ca.crt
# tls-auth /Users/ragon/Desktop/openvpn/ta.key

# push "redirect-gateway def"

<key>
-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDoB9DdGMRmrN
-----END PRIVATE KEY-----
</key>

<cert>
-----BEGIN CERTIFICATE-----
MIIHCDCCBPCgAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMCVVMx
wbvKqoc8sGQ8m0wHL5kOAmEIg8d5nqlHmlHWct3wM9HgwC71SSAubZrWY9gnMZOl
-----END CERTIFICATE-----
</cert>

<ca>
-----BEGIN CERTIFICATE-----
MIIGyjCCBLKgAwIBAgIJAPPPBQknJ1VIMA0GCSqGSIb3DQEBCwUAMIGeMQswCQYD
VQQGEwJVUzELMAkGA1UECBMCQ0ExEzARBgNVBAcTCkxvc0FuZ2VsZXMxDjAMBgNV
</ca>

<tls-auth>
-----BEGIN OpenVPN Static key V1-----
c68d95426c005f2ecf85a0f062a404ff
12f999589c8918905a6ac46ddfbe8ffd
</tls-auth>

이렇게 하면 하나의 파일로 관련정보를 모두 관리할수 있어 편하다.

topology subnet & client to client

현재는 네트워크를 /30로 잘라서 (4개의 아이피만 사용가능) vpn과 클라이언트끼리 연결하기 때문에 다른 클라이언트와 서로 연결이 되지 않는다.

A => vpn <= B

이런 구조인데 A와 B가 연결되지는 않는다.

만약 필요하다면 client to client를 세팅하면된다.

서버 설정에서 주석 제거후 재시작

;topology subnet
;client to client

클라이언트 접속하면

utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 10.8.0.3 --> 10.8.0.3 netmask 0xffffff00

3번 할당

다른 pc에서는 4번 할당

서로 핑이 될가? 된다.

teamsmiley's profile image

teamsmiley

2020-09-11 00:00

Read more posts by this author