[보안] 브리짓(bridge) 기반의 OpenVPN 구축하기

필요한 소스파일을 아래 사이트에서 다운 받도록 한다.

http://openvpn.net/  (openvpn-2.0.9.tar.gz)

http://www.oberhumer.com/opensource/lzo/ (lzo-2.02.tar.gz)

http://linux-net.osdl.org/index.php/Main_Page (bridge-utils-1.2.tar.gz)

1. 먼저 OpenVPN설정파일(스크립트 및 인증서 키)을 저장할 디렉토리를 생성한다.

[root@vpn /]# cd /etc

[root@vpn etc]# mkdir openvpn

2. lzo설치

[root@vpn home]# tar xvfz lzo-2.02.tar.gz

[root@vpn home]# cd lzo-2.02

[root@vpn lzo-2.02]# ./configure

[root@vpn lzo-2.02]# make;make install

3. bridge-utils설치 (만약 브릿지 모드를 사용하지 않는다면 설치할 필요없음)

[root@vpn home]# tar bridge-utils-1.2.tar.gz

[root@vpn bridge-utils-1.2]# autoconf

[root@vpn bridge-utils-1.2]# ./configure

[root@vpn bridge-utils-1.2]# make;make install

아래와 같이 브릿지 시작 스크립트를 “/etc/openvpn/bridge-start” 파일로 생성후 퍼미션을 755로 설정한다.

#!/bin/bash

#################################

# Set up Ethernet bridge on Linux

# Requires: bridge-utils

#################################

# Define Bridge Interface

br=”br0″

# Define list of TAP interfaces to be bridged,

# for example tap=”tap0 tap1 tap2″.

tap=”tap0″

# Define physical ethernet interface to be bridged

# with TAP interface(s) above.

eth=”eth1″                    # 일반적으로 내부 인터페이스

eth_ip=”192.168.8.4″          # 내부인터페이스의 설정된 IP값

eth_netmask=”255.255.255.0″   # 내부네트워크의 넷마스크 값

eth_broadcast=”192.168.8.255″ # 내부네트워크의 브로드캐스트 값

for t in $tap; do

    openvpn –mktun –dev $t

done

brctl addbr $br

brctl addif $br $eth

for t in $tap; do

    brctl addif $br $t

done

for t in $tap; do

    ifconfig $t 0.0.0.0 promisc up

done

ifconfig $eth 0.0.0.0 promisc up

ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

아래와 같이 브릿지 정지 스크립트를 “/etc/openvpn/bridge-stop” 파일로 생성후 퍼미션을 755로 설정한다.

#!/bin/bash

####################################

# Tear Down Ethernet bridge on Linux

####################################

# Define Bridge Interface

br=”br0″

# Define list of TAP interfaces to be bridged together

tap=”tap0″

ifconfig $br down

brctl delbr $br

for t in $tap; do

    openvpn –rmtun –dev $t

done

4. OpenVPN 설치

[root@vpn home]# tar xvfz openvpn-2.0.9.tar.gz

[root@vpn openvpn-2.0.9]# ./configure

[root@vpn openvpn-2.0.9]# make;make install

[root@vpn openvpn-2.0.9]# cd plugin/auth-pam/

[root@vpn auth-pam]# make

[root@vpn auth-pam]# cp openvpn-auth-pam.so /usr/lib  # linux shell 계정을 통한 인증시 필요

[root@vpn auth-pam]# cd ../../sample-scripts

[root@vpn sample-scripts]# cp openvpn.init /etc/init.d/openvpn

[root@vpn sample-scripts]# cd /etc/init.d

[root@vpn init.d]# vi openvpn

——————–중략—————————–

# Location of openvpn binary

openvpn=””

openvpn_locations=”/usr/local/sbin/openvpn”

for location in $openvpn_locations

do

  if [ -f “$location” ]

  then

    openvpn=$location

  fi

done

——————–중략—————————–

# See how we were called.

case “$1” in

  start)

        /etc/openvpn/bridge-start >/dev/null 2>&1     # 브릿지 모드 사용시

        echo -n $”Starting openvpn: ”

        /sbin/modprobe tun >/dev/null 2>&1

——————–중략—————————–

  stop)

        echo -n $”Shutting down openvpn: ”

        for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do

          if [ -s $pidf ]; then

            kill `cat $pidf` >/dev/null 2>&1

          fi

          rm -f $pidf

        done

        # Run shutdown script, if defined

        if [ -f $work/openvpn-shutdown ]; then

            $work/openvpn-shutdown

        fi

        success; echo

        rm -f $lock

        /etc/openvpn/bridge-stop >/dev/null 2>&1        # 브릿지 모드 사용시

        ;;

——————–중략—————————–

[root@vpn init.d]# chkconfig –add openvpn         # 서비스 목록에 등록

[root@vpn init.d]# chkconfig –level 3 openvpn    # 시스템 시작시 자동실행

5. 인증서 키 생성

[root@vpn openvpn-2.0.9]#cd easy-rsa

[root@vpn easy-rsa]# vi vars

우선 vars 라는 파일을 열어 제일 아래쪽에 있는 변수를 수정한다.

# These are the default values for fields

# which will be placed in the certificate.

# Don’t leave any of these fields blank.

export KEY_COUNTRY=KR

export KEY_PROVINCE=CHUNGBUK

export KEY_CITY=CHEONGJU

export KEY_ORG=”NEXASOFT”

export KEY_EMAIL=”root@nexa.co.kr”

[root@vpn easy-rsa]# . vars                     # 환경변수 설정  

[root@vpn easy-rsa]# ./clean-all                # 기존 열쇠들을 지운다

[root@vpn easy-rsa]# ./build-ca                 # ca.crt 와 ca.key를 생성

[root@vpn easy-rsa]# ./build-key-server server  # Server.crt 와 server.key 생성

[root@vpn easy-rsa]# ./build-dh                 # dh1024.pem 생성

[root@vpn easy-rsa]# ./build-key [username]     # 사용자 개별인증서 생성시에 사용

만들어진 열쇠들을 한번 살펴보자 (OpenVPN HOWTO에서 가져왔습니다.)

Filename     Needed By  Purpose  Secret

ca.crt       server + all clients  Root CA certificate  NO

ca.key       key signing machine only  Root CA key  YES

dh{n}.pem    server only  Diffie Hellman parameters  NO

server.crt   server only  Server Certificate  NO

server.key   server only  Server Key  YES

user.crt     user only  user Certificate  NO

user.key     user only  user Key  YES

[root@vpn easy-rsa]# mv keys /etc/openvpn    # 생성된 인증서 키를 /etc/openvpn으로 이동

6. OpenVPN 설정파일 생성

[root@vpn easy-rsa]# cd /etc/openvpn

[root@vpn openvpn]# vi openvpn.conf

port 1194          # openvpn 접속포트

proto udp          # 사용 프로토콜 설정, 일반적으로 UDP를 사용한다.

dev tap0           # 브릿지 모드 사용시 반드시 tap다바이스로 설정

# 인증서 키 파일의 위치를 정확하게 지정한다.

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/server.crt

key /etc/openvpn/keys/server.key  

dh /etc/openvpn/keys/dh1024.pem

ifconfig-pool-persist ipp.txt

# 브릿지 모드 사용시 IP자동할당 영역지정 (로컬아이피피는 반드시 내부인터페이스 값을 설정)

server-bridge 192.168.50.10 255.255.255.0 192.168.50.51 192.168.50.100

client-to-client    # client간의 통신을 허용한다.

duplicate-cn        # client중복 접속을 허용한다.

keepalive 10 120  

comp-lzo            # 압축전송을 지원한다.

persist-key

persist-tun

status openvpn-status.log

log         openvpn.log

log-append  openvpn.log

verb 3

plugin /usr/lib/openvpn-auth-pam.so login   # 리눅스 쉘 계정을 통한 인증을 허용한다.

client-cert-not-required                    # 사용자 인증서를 요청하지 않는다.

username-as-common-name

7. OpenVPN 실행

[root@vpn openvpn]# /etc/rc.d/init.d/openvpn start

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

2 Responses

  1. 2022년 6월 22일

    2reported

  2. 2023년 1월 27일

    1deputation

페이스북/트위트/구글 계정으로 댓글 가능합니다.