DHCP 서버 구축

동적 호스트 구성 프로토콜(Dynamic Host Configuration Protocol, DHCP)은 호스트 IP 구성 관리를 단순화하는 IP 표준이다. 동적 호스트 구성 프로토콜 표준에서는 DHCP 서버를 사용하여 IP 주소 및 관련된 기타 구성 세부 정보를 네트워크의 DHCP 사용 클라이언트에게 동적으로 할당하는 방법을 제공한다.1 위키백과에서 발췌

학교 WiFi나, 집의 공유기, 당신이 사용하는 LTE 휴대폰 등이 인터넷을 하기 위해서는 모든 장비들은 IP를 가지고 있어야 한다. 하지만 학교건, 집이건 지하철 WiFi건 내 노트북 IP는 뭐지? 혹은 내 휴대폰 IP는 몇 번이지? 하고 고민 해본 기억은 없을 것이다. 이렇게 네트워크에 연결된 장비들에 자동으로 IP주소를 할당 해주는 것이 동적 호스트 설정 프로토콜, DHCP이고 이 역할을 하는 것이 DHCP 서버이다.
이름은 거창한 듯 하지만 설치, 설정 과정은 매우 쉽다.

설치

haedong@haedong:~:]$ sudo yum install -y dhcp*
...중략...
Package 12:dhcp-common-4.2.5-82.el7.centos.x86_64 already installed and latest version
Package 12:dhcp-libs-4.2.5-82.el7.centos.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
...중략...
====================================================================================================================================
 Package                      Arch                    Version                                   Repository                     Size
====================================================================================================================================
Installing:
 dhcp                         x86_64                  12:4.2.5-82.el7.centos                    local_centos                  515 k
 dhcp-devel                   x86_64                  12:4.2.5-82.el7.centos                    local_centos                  108 k
 dhcpd-pools                  x86_64                  3.1-1.el7                                 local-epel                     53 k
 dhcping                      x86_64                  1.2-13.el7                                local-epel                     18 k
Transaction Summary
====================================================================================================================================
Install  4 Packages
Total download size: 693 k
Installed size: 1.6 M
Downloading packages:
(1/4): dhcpd-pools-3.1-1.el7.x86_64.rpm                                                                      |  53 kB  00:00:00
...중략...
Installed:
  dhcp.x86_64 12:4.2.5-82.el7.centos         dhcp-devel.x86_64 12:4.2.5-82.el7.centos         dhcpd-pools.x86_64 0:3.1-1.el7
  dhcping.x86_64 0:1.2-13.el7
Complete!

설정
DHCP 서버 구성요소를 설치한 뒤 /etc/dhcp/dhcpd.conf 파일을 수정한다.

# 다음을 참고해서 수정 한다.
#subnet 사용할_IP_대역(netmask 범위에 따라 달라진다) netmask 사용할_netmask  {
#        range 동적으로_할당해_줄_IP_범위(클라이언트는_이_범위_안의_IP를_할당받는다);
#        option subnet-mask 클라이언트에서_설정하게_될_netmask ;
#        option routers 클라이언트에서_설정하게_될_gateway;
#        option broadcast-address 브로드캐스트_주소;
#        option domain-name-servers 첫_번째_DNS, 두_번째_DNS;
#        default-lease-time 기본_임대_시간(초);
#        max-lease-time 최대_임대_시간(초);
#}
subnet 192.168.0.0 netmask 255.255.255.0 {
        range 192.168.0.100 192.168.0.200;
        option subnet-mask 255.255.255.0;
        option routers 192.168.0.254;
        option broadcast-address 192.168.0.255;
        option domain-name-servers 8.8.8.8, 168.126.63.1;
        default-lease-time 7200;
        max-lease-time 36000;
}

구동

haedong@haedong:~:]$ sudo chkconfig dhcpd on
알림: 'systemctl enable dhcpd.service'에 요청을 전송하고 있습니다.
Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.
haedong@haedong:~:]$ sudo service dhcpd start
Redirecting to /bin/systemctl start dhcpd.service

iptables 를 이용한 NAT gateway 서버 설정

네트워크 주소 변환(영어: network address translation, 줄여서 NAT)은 컴퓨터 네트워킹에서 쓰이는 용어로서, IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술을 말한다. 패킷에 변화가 생기기 때문에 IP나 TCP/UDP의 체크섬(checksum)도 다시 계산되어 재기록해야 한다. NAT를 이용하는 이유는 대개 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위함이다. 많은 네트워크 관리자들이 NAT를 편리한 기법이라고 보고 널리 사용하고 있다. NAT가 호스트 간의 통신에 있어서 복잡성을 증가시킬 수 있으므로 네트워크 성능에 영향을 줄 수 있는 것은 당연하다. 1위키백과에서 발췌

NAT gateway라고 써서 이게 뭐야? 라고 생각할 수 있는데 특별한 것은 아니고 우리나라 사람들 각 가정에 1개 씩은 있는 공유기를 생각하면 된다.

포스트 이름에서 알 수 있듯이 iptables 가 설치되어있어야 한다.

다음 그림과 같은 경우를 예로 적용해보자.

갤러리-추가예정

설정
Gateway 역할을 할 서버를 설정하는 것이므로 ‘LINUX server’에 접속해서 작업을 수행하면 된다.

우선 packet forwarding을 사용할 수 있도록 설정을 변경한다.

haedong@haedong:~:]$ sudo vi /etc/sysctl.conf
# 아래 변수를 찾아서 값을 1로 변경하거나 파일의 끝에 아래 끝 라인을 추가한다.
# net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1

즉시 적용(재부팅 시 초기화 되는 값) 시. 특별히 메시지가 출력되지는 않는다.

haedong@haedong:~:]$ sudo echo "1" > /proc/sys/net/ipv4/ip_forward

Rule 추가.

# forward chain 초기화
haedong@haedong:~:]$ sudo iptables -F FORWARD

# forward 기본정책 drop으로 설정
haedong@haedong:~:]$ sudo iptables -P FORWARD DROP

# iptables -A FORWARD -o 내부_인터페이스 -j ACCEPT
haedong@haedong:~:]$ sudo iptables -AFORWARD -o eth1 -j ACCEPT

# iptables -A FORWARD -o 내부_인터페이스 -j ACCEPT
haedong@haedong:~:]$ sudo iptables -A FORWARD -o eth1 -j ACCEPT

# 외부 연결을 위한 Msquerade 지정. 즉, 내부 장비들이 외부로 나갈 때 사용하는 공인 인터페이스
# iptables -t nat -A POSTROUTING -o 외부_인터페이스 -j MASQUERADE
haedong@haedong:~:]$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

확인

NAT 대역의 PC나 서버 (그림의 L2 스위치 아래의 장비들)에서 10.11.12.13으로 연결을 시도해보거나 외부 대역(google 등의 사이트)에 접속을 시도해서 연결되면 정상 설정이 된 것이다.

정책 저장

root@haedong:~:]# iptables-save > /etc/rules
root@haedong:~:]# cat /etc/roules
# Generated by iptables-save v1.4.21 on Sun Aug 15 11:11:11 2021
*nat
:PREROUTING ACCEPT [2427731:347878517]
:INPUT ACCEPT [311986:31601222]
:OUTPUT ACCEPT [397981:25498698]
:POSTROUTING ACCEPT [10937:657389]
-A POSTROUTING -o eth1 -j MASQUERADE
COMMIT
# Completed on Sun Aug 15 11:11:11 2021
# Generated by iptables-save v1.4.21 on Sun Aug 18 11:11:11 2021
*filter
:INPUT ACCEPT [16876214:11177798996]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [8626880:21607026946]
-A FORWARD -o eth0 -j ACCEPT
-A FORWARD -o eth1 -j ACCEPT
COMMIT
# Completed on Sun Aug 15 11:11:11 2021

정책 재적용

root@haedong:~:]# /sbin/iptables-restore < /etc/rules

Linux(CentOS7) 가상 네트워크 인터페이스 추가

NAT 구성 등을 위한 가상 인터페이스를 추가하는 방법을 설명알아보자.

인터페이스 정보 확인

[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.192.252  netmask 255.255.255.0  broadcast 192.168.192.255
        inet6 fe80::6d05:37d3:fb10:5b25  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:a4:a6  txqueuelen 1000  (Ethernet)
        RX packets 411  bytes 36267 (35.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 329  bytes 31013 (30.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 96  bytes 8376 (8.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 96  bytes 8376 (8.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

가상 인터페이스 생성
물리 인터페이스를 공유할 인터페이스 생성
ens33의 물리 NIC를 사용할 경우 ens33:0으로 생성한다.

[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:0              
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33:0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
# 인터페이스 명과 장치명이 겹치지 않도록 수정한다.
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes

# 사용하고 싶은 IP로 변경한다.
IPADDR=192.168.192.253
PERFIX=24
GATEWAY=192.168.192.254

확인

[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.192.252  netmask 255.255.255.0  broadcast 192.168.192.255
        inet6 fe80::6d05:37d3:fb10:5b25  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:a4:a6  txqueuelen 1000  (Ethernet)
        RX packets 1046  bytes 93843 (91.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 703  bytes 78865 (77.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.192.253  netmask 255.255.255.0  broadcast 192.168.192.255
        ether 00:0c:29:67:a4:a6  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 104  bytes 9080 (8.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 104  bytes 9080 (8.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

인터페이스 정보를 확인하고 연결이 되는지 확인한다.

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\haedong> ssh haedong@192.168.192.253
The authenticity of host '192.168.192.253 (192.168.192.253)' can't be established.
ECDSA key fingerprint is SHA256:en-----------------------0s3gUedMt8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

OpenVPN 서버 구축 #2. 서버 설치 및 설정

설치

EPEL1Extra Package for Enterprise Linux 릴리즈 패키지가 필요하다.

[centos7:/home/haedong:]$ sudo  yum -y install epel-release
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-11 will be updated
---> Package epel-release.noarch 0:7-13 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
============================================================================================================================================================================================================================================
 Package                                                       Arch                                                    Version                                                  Repository                                             Size
============================================================================================================================================================================================================================================
Updating:
 epel-release                                                  noarch                                                  7-13                                                     epel                                                   15 k
Transaction Summary
============================================================================================================================================================================================================================================
Upgrade  1 Package
Total download size: 15 k
Downloading packages:
epel/x86_64/prestodelta                                                                                                                                                                                              |  539 B  00:00:01
epel-release-7-13.noarch.rpm                                                                                                                                                                                         |  15 kB  00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : epel-release-7-13.noarch                                                                                                                                                                                                 1/2
  Cleanup    : epel-release-7-11.noarch                                                                                                                                                                                                 2/2
  Verifying  : epel-release-7-13.noarch                                                                                                                                                                                                 1/2
  Verifying  : epel-release-7-11.noarch                                                                                                                                                                                                 2/2

Updated:
  epel-release.noarch 0:7-13

Complete!

openvpn, easy-ras 패키지 설치

[centos7:/home/haedong:]$ sudo  yum -y install openvpn easy-rsa
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
Resolving Dependencies
--> Running transaction check
---> Package easy-rsa.noarch 0:3.0.8-1.el7 will be installed
---> Package openvpn.x86_64 0:2.4.9-1.el7 will be installed
--> Processing Dependency: libpkcs11-helper.so.1()(64bit) for package: openvpn-2.4.9-1.el7.x86_64
--> Running transaction check
---> Package pkcs11-helper.x86_64 0:1.11-3.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
============================================================================================================================================================================================================================================
 Package                                                      Arch                                                  Version                                                       Repository                                           Size
============================================================================================================================================================================================================================================
Installing:
 easy-rsa                                                     noarch                                                3.0.8-1.el7                                                   epel                                                 44 k
 openvpn                                                      x86_64                                                2.4.9-1.el7                                                   epel                                                524 k
Installing for dependencies:
 pkcs11-helper                                                x86_64                                                1.11-3.el7                                                    epel                                                 56 k
Transaction Summary
============================================================================================================================================================================================================================================
Install  2 Packages (+1 Dependent package)
Total download size: 624 k
Installed size: 1.5 M
Downloading packages:
(1/3): easy-rsa-3.0.8-1.el7.noarch.rpm                                                                                                                                                                               |  44 kB  00:00:02
(2/3): openvpn-2.4.9-1.el7.x86_64.rpm                                                                                                                                                                                | 524 kB  00:00:01
(3/3): pkcs11-helper-1.11-3.el7.x86_64.rpm                                                                                                                                                                           |  56 kB  00:00:00
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                                                       141 kB/s | 624 kB  00:00:04
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : pkcs11-helper-1.11-3.el7.x86_64                                                                                                                                                                                          1/3
  Installing : openvpn-2.4.9-1.el7.x86_64                                                                                                                                                                                               2/3
  Installing : easy-rsa-3.0.8-1.el7.noarch                                                                                                                                                                                              3/3
  Verifying  : easy-rsa-3.0.8-1.el7.noarch                                                                                                                                                                                              1/3
  Verifying  : openvpn-2.4.9-1.el7.x86_64                                                                                                                                                                                               2/3
  Verifying  : pkcs11-helper-1.11-3.el7.x86_64                                                                                                                                                                                          3/3
Installed:
  easy-rsa.noarch 0:3.0.8-1.el7                                                                                         openvpn.x86_64 0:2.4.9-1.el7
Dependency Installed:
  pkcs11-helper.x86_64 0:1.11-3.el7
Complete!

설정

config 파일 복사
/usr/share/doc/openvpn-VERSION/sample/sample-config-files/ 디렉토리 아래에 존재한다.

Config 수정

 # openvpn 사용 port
 # 운영 환경에 맞게 변경한다.
port 9411

 # 프로토콜 (UDP는 user defined protocol)
proto udp

 # 가상 Device 
dev tun

 # 인증 키 관련 정보 
 # 다음 단락에서 생성할 파일들이다. 경로를 맞춰줘야 한다.
ca   /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key  /etc/openvpn/easy-rsa/pki/private/server.key 
dh   /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/easy-rsa/pki/ta.key
key-direction 0

auth SHA512
cipher AES-256-CBC

topology subnet

 # vpn network 정보. 가상 device 인터페이스.
server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

 # vpn을 연결하면 사용할 DNS
push "redirect-gateway def1 bypass-dhcp" 
push "dhcp-option DNS 192.168.4.254" 
push "dhcp-option DNS 8.8.8.8" 

 # 클라이언트간 연결을 허용할 때. 
 # 이 항목을 활성화 할 경우 iptables 정책도 수정 해야 한다.
;client-to-client

keepalive 10 120
comp-lzo

user nobody
group nobody

persist-key
persist-tun

verb 4

 # 로그를 저장할 경로. 디렉토리를 만들어줘야 한다.
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log

키 생성

준비

 # easy-rsa 관련 
[centos7:/home/haedong:]$ sudo mkdir /etc/openvpn/easy-rsa
[sudo] haedong의 암호:
[centos7:/home/haedong:]$ sudo cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa
[centos7:/home/haedong:]$

키 생성을 위한 변수 설정
키를 생성하는 과정에서 직접 입력 할 수도 있다.

[centos7:/home/haedong:]$ sudo vi /etc/openvpn/easy-rsa/vars

 # 아래 내용을 붙여넣는다.

 # 국가 명
export KEY_COUNTRY="KR" 
 # 시/도 (경기도, 충청남도, 서울특별시, 광주광역시 등 광역시 이상)
export KEY_PROVINCE="Soeul" 
 # 시/군/구 (수원시, 속초시, 예산군, 강남구 등)
export CITY="GANGNAMGU" 
 # 회사명
export ORG="HaeDongcorp" 
 # Email
export KEY_EMAIL="haedonggang@naver.com" 
 # 부서 명
export KEY_OU="ITinfra" 
 # 서버 명
export KEY_NAME="centos7" 
 # 공통이름
export KEY_CN="vpn.haedongg.net" 

Setting up your own Certificate Authority – openvpn.net의 가이드

PKI 초기화

[centos7:/root:]# cd /etc/openvpn/easy-rsa
[centos7:/etc/openvpn/easy-rsa:]# ./easyrsa clean-all
Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki

[centos7:/etc/openvpn/easy-rsa:]# ./easyrsa init-pki
Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
WARNING!!!
You are about to remove the EASYRSA_PKI at: /etc/openvpn/easy-rsa/pki
and initialize a fresh PKI here.
Type the word 'yes' to continue, or any other input to abort.
  Confirm removal: yes
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki

ca 키 생성

[centos7:/etc/openvpn/easy-rsa:]# ./easyrsa build-ca

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017

Enter New CA Key Passphrase: PASSPHRASE를 넣는다.
Re-Enter New CA Key Passphrase:  PASSPHRAS 확인
Generating RSA private key, 2048 bit long modulus
...............................................................+++
.........................................................+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:  서버_이름

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/pki/ca.crt

서버 키 생성

[centos7:/etc/openvpn/easy-rsa:]# ./easyrsa build-server-full server

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Generating a 2048 bit RSA private key
..................................+++
.......................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/easy-rsa-35432.9GPaYv/tmp.0beTT2'
Enter PEM pass phrase:  
Verifying - Enter PEM pass phrase:
-----
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-35432.9GPaYv/tmp.RTNa79
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: CA_키_생성시_입력한_PASSPHRASE
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Mar 13 06:22:57 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

DH 키교환 알고리즘을 위한 키 생성

[centos7:/etc/openvpn/easy-rsa:]# ./easyrsa gen-dh

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.................+......................................................
...한참 중략....
........................................................................++*++*

DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem

TLS 키 생성

[centos7:/etc/openvpn/easy-rsa:]# openvpn --genkey --secret /etc/openvpn/easy-rsa/pki/ta.key

사용자 키 생성

[centos7:/etc/openvpn/easy-rsa:]# ./easyrsa build-client-full haedong

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Generating a 2048 bit RSA private key
.............................................................+++
...................................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/easy-rsa-35775.MjyGfQ/tmp.HL4Nlv'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-35775.MjyGfQ/tmp.VU7eke
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'haedong'
Certificate is to be certified until Mar 13 06:31:57 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

OS(openvpn이 설치된 centos) 계정 정보를 이용한 인증 설정
옵션에 넣어줘야 하는 파일은 openvpn 패키지에 포함 되어있다. CentOS7 기준으로 /usr/lib64/openvpn/plugin 에 존재한다.

 # /etc/openvpn/server.conf 파일 끝에 아래 내용 추가

plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
client-cert-not-required

서비스 시작

[centos7:/etc/openvpn/easy-rsa/pki:]#  systemctl start openvpn@server.service
Broadcast message from root@centos7 (Tue 2020-12-08 16:35:57 KST):

Password entry required for 'Enter Private Key Password:' (PID 37264).
Please enter password with the systemd-tty-ask-password-agent tool!


[centos7:/etc/openvpn/easy-rsa/pki:]# systemctl start openvpn@server.service
Enter Private Key Password: 개인키_PASSPHRASE

클라이언트 설정

Windows를 기준으로 다음과 같은 파일을 준비한다.
ca.crt / ta.key 파일은 키 생성 과정에서 생성했으니 다운로드 하면 된다.
VPN.ovpn 파일은 그냥 text 파일이다. 빈 파일을 만든다.
그리고 세 개 파일을 openvpn 클라이언트가 설치된 경로아래 config 디렉토리에 복사한다.
보통 C:\Program Files\OpenVPN\config 가 된다.

 # 다음의 내용을 삽입하고 저장한다.
client
dev tun
proto udp

resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
comp-lzo
verb 4


 # 키 파일의 경로를 입력
 # 별도의 경로를 넣지 않으면 C:\Program Files\OpenVPN\config 디렉토리를 기본으로 인식한다.
 # openvpn client 인스톨 뒤 위 경로에 ca.crt파일과 ta.key 파일을 복사한다. 
ca ca.crt
tls-auth ta.key 1
key-direction 1 

auth-user-pass

#remote VPN-SERVER-IP 9411

클라이언트 실행

아래 아이콘에 마우스 오른쪽 버튼을 클릭하면 메뉴가 뜬다.
vpn 서버가 여러대 일 경우 각 서버마다 ovpn 파일을 생성해서 config에 넣어주면 선택하여 접속할 수 있다.

이렇게 접속이 된다.

OpenVPN 서버 구축 #1. 개요

OpenVPN 서버 구축 #2. 서버 설치 및 설정

가상사설망(假想私設網) 또는 VPN(영어: virtual private network)은 공중 네트워크를 통해 한 회사나 몇몇 단체가 내용을 바깥 사람에게 드러내지 않고 통신할 목적으로 쓰이는 사설 통신망이다.가상 사설망에서 메시지는 인터넷과 같은 공공망 위에서 표준 프로토콜을 써서 전달되거나, 가상 사설망 서비스 제공자와 고객이 서비스 수준 계약을 맺은 후 서비스 제공자의 사설망을 통해 전달된다.

가상 사설망의 등장배경은 인터넷을 기반으로 한 기업 업무환경의 변화에 기인한다. 즉, 소규모 지역에서 문서만을 전달하던 업무처리 기반에서 하나의 건물 내의 네트워크를 이용한 업무로, 다시 본사와 다수의 지사 관계, 또한 지사는 국내 지사와 국외 지사로 확장되었다. 이들이 하나의 네트워크 구축을 위해 기존 전용선을 사용하는 방법에는 비용을 포함한 여러가지 한계를 가지며, 전용선을 이용해서 네트워크가 구성되었다고 하더라도 네트워크 운영을 자체적으로 하는 것과 새로운 기술들을 도입하는 것 역시 기업의 입장에서는 상당한 부담이 될 수 있다. 또한 기존의 공중 네트워크는 보안과 관련해서는 서비스를 제공하지 않기 때문에 중요한 문서나 데이터를 전달하기에는 부족한 점이 있었다. 이러한 복합적인 이유가 가상 사설망이 등장한 계기가 되었다.1위키백과에서 발췌

왜 VPN이 생겨났는가는 단순하다.
A라는 회사가 있다고 생각해보자. 최첨단 산업을 선도하는 A사는 시간이 흐르면서 회사의 규모도 커지고 직원도 늘어나면서 서울에 본사 뿐 아니라 미국, 중국, 영국 등 세계 각국의 주요 거점에도 지사를 세우게 됐다.

서울 본사만 있을 때는 사내망 관리만 하면 됐지만 미국지사와 중요한 자료를 주고받으려니 일반망으로 데이터를 주고 받자니 중간에 패킷을 가로채거나 하는 공격의 위험이 크고, 서울에서 미국까지 전용선을 설치하자니 너무 비용이 많이 든다.

이러한 상황에서의 보안 요건을 충족하기 위한 것이 바로 Virtual Private Network 되시겠다.
즉, 일반망을 사용하되, 암호화 등의 조치를 통해 본사와 미국지사 사이의 연결이 사설망인 것 처럼 동작하게 하는 것, 그것이 VPN이다.


PPPTP / L2TP / IPSEC / SSL 등의 방식이 있으며, 근래에는 IPSEC, SSL 두 종류로 수렴하는 듯 한다.
가장 많이 쓰이는 IPSEC / SSL 방식 VPN의 차이를 찾자면
– SSL 방식이건 IPSEC이건 모두 암호화방식이나, 터널 개념에 있어서 큰 차이는 없다.

이건 SSL-VPN

– 클라이언트와 대상 망의 VPN 서버와 터널을 맺고 암호화 통신을 한다.

이건 IPSEC

– 양자간 각각의 VPN server를 두고 각 VPN 서버끼리 터널을 맺고 통신을 한다.

OSI 7 layer ( OSI 7계층, 모델)

OSI 모형(Open Systems Interconnection Reference Model)은 국제표준화기구(ISO)에서 개발한 모델로, 컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명한 것이다. 일반적으로 OSI 7 계층 모형이라고 한다. 1위키백과 에서 발췌

이 모델 자체가 특별한 역할을 하거나, 목적은 아니고 네트워크 설계를 하게 되면 이 모델을 따라 설계를 하자 하는 표준. 약속이다. 많은 공학도들이 네트워크 과목에서 이걸 만나고 ‘WTF!’2What The Fuck(와떠뻑) 을 외친다는 사실은 많이 알려진 사실이다. 많은 책, 오픈백과, 블로그 등등에서 친절하게 설명하고있고, 이 포스트도 가능한한 친절하게 설명하고자 하지만 그들보다 쉬울 수 있을지는 잘 모르겠다.

그림이 없으면 허전할 것 같아서 그려봤다.

1계층은 물리연결 계층이고 2계층은 데이터링크… 이런 내용은 따로 설명하지 않겠다. 이미 검색결과 상단의 링크에서 지겨울정도로 봤을테니까. 조금은 다른 방법으로 접근 해보자.

스위치는 L2 스위치 부터 존재한다.
여기서 ‘L’‘Layer’를 의미한다.
즉, L2 스위치는 Layer-2 를 처리할 수 있는 스위치라는 뜻이다.
L3 는 Layer-3, L4는 Layer-4. 당연히 L5, L6, L7 스위치도 존재한다.

Layer 1

하.지.만. L1 스위치란 단어는 생소하다. 마치 없는 것 같다.
이유를 알기 위해서는 Layer-1 에서의 역할을 이해야 한다.
Layer-1은 ‘물리’계층임을 이미 알고 있을 것이다. 이름 그대로 물리적으로 연결이 되고, 신호가 전달 되는 것이 1 계층이다.

그림에서처럼 ‘뭔지 모르지만 신호를 보내는 장비’는 ‘뭔지 모르지만 신호를 받고 싶은 장비’ 에게 빨간색 신호를 보내지만 거리가 멀어서 닿지 않는다.

이 중간에 ‘들어오는신호를 증폭 시켜서 밖으로 내보내는 장비’를 설치한다. 멀어서 닿지 않던 신호는 ‘뭔지 모르지만 신호를 받고 싶은 장비’까지 전달된다.
이런 역할을 하는 녀석이 바로 ‘리피터(Repeater)’3신호의 증폭에 초점을 두면 리피터, 단순 연결에 초점을 두면 브릿지(Bridge)가 된다. 결국 그놈이 그놈이다. 신호라고 해서 이해가 안되면 1.5v짜리 건전지를 1Km밖에 있는 전구에 연결한다고 생각해보자. 1Km까지 1.5v를 유지하려면 중간중간 전압을 높여주는 장비들을 설치 해야 할 것이다.이다.
즉 Layer 1 에 해당하는 무언가를 만들 때는 ‘신호의 온전한 전달’ 만 신경 쓰면 된다는 이야기이다.

[가.] 는 리피터(혹은 브릿지)이다.
[나.] 는 출력을 세 개로 늘린 장비이다.
여기서 기억 해야 하는 건, 들어온 신호는 나머지 모든 출력으로 ‘동일하게’ 출력된다는 점이다.

이제 이것들을 수도관이라고 생각해보자.
[가]의 경우 왼쪽 구멍에 물을 부으면 오른쪽으로 나간다. 당연히 오른쪽에서 물을 부으면 왼쪽으로 물이 나간다.
[나]의 경우 왼쪽 구멍에서 물을 부으면 오른쪽 모든 구멍으로 물이 나갈 것이다. 그럼 오른쪽 위의 구멍에 물을 부으면? 역시나 나머지 구멍에서 물이 나올 것이다.
왼쪽 구멍에도 물을 붓고, 오른쪽에서도 물을 부으면? 어디로도 물이 나가지 못한다. (물을 붓지 않는 구멍으로 나가겠지만 그렇다고 치자…)

이게 바로 ‘허브’4(Hub:(특정 장소·활동의) 중심지, 중추, Herb 아니다.)이다.
1. 어딘가에서 신호가 들어오면 자기 자신을 제외한 모든 포트호로 신호를 증폭시켜 내보낸다.
2. 동시에 여러 포트에서 신호가 들어오면 처리하지 못한다.

※ 이것을 브로드캐스트(Broadcast)라고 한다. 신호를

스위칭 ‘허브’

Layer 2

1. Layer 1에서의 장비에 스위칭 기능을 추가한다.
즉, 누군가 신호를 쏘려고 하면 나머지 녀석들은 대기 하게 한다.
2. 각각의 장비에 주소를 부여한다.
즉, 모든 포트에 동일한 신호를 쏘는 것이 아니라 ‘선택적으로’ 신호를 전달한다.
여기에서의 주소는 우리가 흔히 말하는 MAC adress라고 하는 하드웨어의 물리적 주소를 의미한다.

이쯤에서 눈치를 챈 사람들도 있겠지만 허브에 ‘스위칭’ 기능을 추가함으로써 비로소 우리가 아는 ‘스위칭 허브’ 가 된 것이다.

Layer 3

신호가 정상적으로 전달되고, 장비들을 MAC 주소로 식별하여 신호를 전송한다.
L3에서는 TCP 라는 프로토콜을 이용해 신뢰할 수 있는 연결을 만든다

경로 설정을 통해 가장 빠르고 안정적인 경로를 찾아 연결을 수립한다.
(TCP나 신뢰할 수 있는 연결 등이 무엇인지는 따로 포스팅 하도록 하겠다)

Layer 4

신뢰할 수 있는 연결위에 암호화 기능을 추가한다.

애초에 L1은 무엇이고 L5는 무엇이니 하는 설명을 할 것은 아니었으니 이제 데이터가 어떻게 이동하는지 살펴보자. 누군가 한국에서 미국으로 편지를 보낸다고 가정해보자.

  1. 사용자가 편지를 쓰고 – 메시지 생성
    누군가 볼 수 없게 자물쇠가 담긴 상자에 넣고 잠근다. – SSL 암호화 – Layer4
  2. 상자에 우표를 붙이고 주소를 적어서 배달부에게 전달한다. – Layer 3
  3. 우편배달부는 우편물센터로 편지상자를 이동한다. – Layer 2
  4. 우편물센터에서 비행기에 실어 보낸다. – Layer 1
    ~
  5. 미국 우편물 센터에 편지 상자가 도착한다. – Layer 1
  6. 우편배달부는 편지상자를 우편물 센터에서 꺼내온다. – Layer 2
  7. 우편배달부는 편지상자를 수신자에게 전달한다. – Layer 3
  8. 수신자는 열쇠로 편지상자를 연다. – Layer 4

편지에 빗대 설명하자면 위와 같다.
풀어 설명하자면 OSI 7 Layer 참조 모델은 ‘각 영역마다 해야 하는 일의 표준’을 정해 놓은 것이다.

만약 송신자가 편지를 보냈는데 수신자에 도착하지 않았을 경우 편지가 미국의 우편물 센터까지 갔다고 한다면, 내가 보낸 신호가 (L4-> L3-> L2-> L1-> L1) 수신측까지 물리적 연결은 문제가 없다는 이야기 일 것이다.
또 만약 내가 보낸 편지가 수신자에게 전달은 됐는데 편지의 내용을 수신자가 모른다면 자물쇠에 문제가 있거나, 수신자가 열쇠를 가지고 있지 않아서이기 때문일 것이다.

이제 결론.
거창할 것 없다. OSI 7 Layer 참조모델은 ‘네트워크를 통해 통신을 하거나, 하는 프로그램을 만들 때 참고해야 하는 하나의 참고모델‘ 일 뿐이다.
OSI 7 Layer 참조모델을 참고해 만들어진 프로그램과 장비를 이용한다면, 위 편지의 예처럼
– 각 레이어마다 고유한 일을 하므로 하위레이어의 프로그램을 만들지 않아도 되고,
– 만약 문제가 생겼을 경우 어느 Layer에서 문제가 생겼는지만 파악하기도 쉽다.