2009년 12월 23일 수요일

FreeBSD7 OpenVPN 설치 및 PF NAT 인터넷 공유

회사 혹은 기타 모임 등의 내부에서 인터넷을 사용하다보면 간혹 의미없이 포트를 막아놓은 경우가 있습니다.
예를 들어 SSH, FTP 클라이언트 등을 막아놓아서 불편한 경우입니다.

경유지를 이용하여 해결할 수 있습니다. 아... 참고로 게임도 할 수 있습니다. (ㅋㅋ?!)
하지만, OpenVPN은 이런 용도를 위해서 만들어진 S/W는 아닙니다.
원래는 보안성이 높은 가상 사설망을 만들기 위해서, 생산적인 목적을 위해서 만들어진 S/W 임을 밝혀둡니다.

-----------------------------------------------------------------------------------
서버 설정

OpenVPN을 설치합니다.
# cd /usr/ports/security/openvpn
# make install clean


OpenVPN 의 서버와 클라이언트간의 인증을 위한 준비를 합니다.
필요한 예제 파일들을 임의의 위치에 복사하고 스크립트 파일들에게 실행권한을 줍니다.
# cp -r /usr/local/share/doc/openvpn/easy-rsa /root/
# cd /root/easy-rsa
# chmod +x *


아래를 참고하여 국가, 단체명 등등.. 편한대로 수정합니다.
# vi vars
[code]
export KEY_COUNTRY=KO
export KEY_PROVINCE="NA"
export KEY_CITY=Seoul
export KEY_ORG="OpenVPN-TEST"
export KEY_EMAIL="me@myhost.mydomain"
[/code]


중간에 틀리면 생성된 keys 디렉토리를 삭제하고 여기서부터 진행하면 됩니다.
# sh
# . vars
# ./clean-all
# ./build-ca


중간에 묻는 메시지 중에서 common name 을 server 로 합니다.
# ./build-key-server server


중간에 묻는 메시지 중에서 common name 을 client1, client2, client3 으로 합니다.
필요한 클라이언트 수에 따라서 여러개 더 만들 수 있습니다.
# ./build-key client1
# ./build-key client2
# ./build-key client3


keys 디렉토리를 복사하거나 심볼릭 링크를 걸어줍니다.
# mkdir /usr/local/etc/openvpn/
# ln -s /root/easy-rsa/keys /usr/local/etc/openvpn/


OpenVPN의 설정 예제의 사본을 만들고 아래의 내용을 참고하여 수정합니다.
# cp /usr/local/share/doc/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn/openvpn.conf
# vi /usr/local/etc/openvpn/openvpn.conf

[code]
# 제한을 받지 않는, 사용이 가능한 포트로 변경합니다.
port 8000

# 포트를 제한하는 인터넷 환경이라면 보통 UDP가 사용이 불가능할 수 있으므로 TCP로 변경합니다.
proto tcp
;proto udp
;dev tap
dev tun

# 위에서 만든 인증서 파일들의 위치입니다.
ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/server.crt
key /usr/local/etc/openvpn/keys/server.key
dh /usr/local/etc/openvpn/keys/dh1024.pem

 

# VPN 서버를 게이트웨이로 지정하여, 모든 패킷이 통과하도록 합니다.

push "redirect-gateway"
[/code]

부팅시 OpenVPN이 실행될 수 있도록 rc.conf 파일에 아래의 내용을 추가합니다.

# vi /etc/rc.conf
[code]
openvpn_enable="YES"
[/code]

OpenVPN을 실행합니다.
# /usr/local/etc/rc.d/openvpn start


------------------------------------------------------------------------------------
윈도 클라이언트 연결

OpenVPN을 다운로드하고 설치합니다.
http://www.openvpn.net/index.php/open-source/downloads.html

서버에서 만든 ca.crt / client1.crt / client1.key 파일을 C:\Program Files\OpenVPN\config 의 위치에 복사합니다.
C:\Program Files\OpenVPN\sample-config\client.ovpn 파일도 위와 동일한 위치에 복사합니다.


client.ovpn 파일을 메모장이나 기타 텍스트 에디터로 열어서, 아래의 내용을 참고하여 수정합니다.
[code]
# 서버와 동일한 설정 TCP로 변경합니다.
proto tcp
;proto udp

# 서버의 IP 주소 혹은 도메인으로 변경합니다. 포트번호도 서버와 같게 변경합니다.
remote 123.123.123.1 8000

# 위에서 복사한 파일들의 경로를 적습니다.
ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\config\\client0.crt"
key "C:\\Program Files\\OpenVPN\\config\\client0.key"
[/code]

바탕화면의 OpenVPN GUI를 실행하고, 생겨난 트레이 아이콘을 우측 클릭하여 Connect 를 클릭합니다.
연결 시도중에는 아이콘이 노란색으로 표시되며, 연결이 되면 아이콘이 녹색으로 표시됩니다.
만일 연결이 안된다면 아이콘을 우측 클릭하여 View Log 메뉴를 통해 원인을 알 수 있습니다.


-------------------------------------------------------------------------------
PF(Packet Filter) 설치를 통한 인터넷 공유

위에까지 완료했다면 보안성이 우수한 가상사설망으로서의 연결은 가능한 상태가 됩니다.
하지만, 인터넷은 불가능한 상태입니다. 인터넷을 가능하도록 하기 위해서 서버에 PF를 설치합니다.

커널 설정 파일(예제파일: GENERIC)에 아래의 내용을 추가하고, 컴파일합니다.
커널 컴파일 방법은 이곳에 있습니다. http://4444.textcube.com/2
[code]
# Firewall support
device          pf
device          pflog
device          pfsync

options         ALTQ
options         ALTQ_CBQ
options         ALTQ_RED
options         ALTQ_RIO
options         ALTQ_HFSC
options         ALTQ_PRIQ
[/code]


PF를 설정합니다.
# vi /etc/pf.conf
[code]
# 외부연결이 되어있는 이더넷 인터페이스 이름을 넣습니다.
ext_if="eth0"

# OpenVPN 의 인터페이스 설정입니다.
vpn_if="tun0"
vpn_network="10.8.0.0/24"

# OpenVPN 을 NAT로 사용할 수 있도록 합니다.
nat on $ext_if from $vpn_network to any -> ($ext_if)

# 8000 포트로 열려있는 OpenVPN 의 접근을 허용합니다. 그 이상은 잘 모릅니다.
# UDP를 사용한다면, tcp를 udp로 수정해야합니다.
pass in on $ext_if proto tcp from any to port 8000 keep state
pass quick on $vpn_if

# 접근을 허용하는 인바운드 포트입니다. 저의 경우 SSH FTP WWW를 열어두었습니다.
pass in on $ext_if proto tcp to ($ext_if) port ssh
pass in on $ext_if proto tcp to ($ext_if) port ftp
pass in on $ext_if proto tcp to ($ext_if) port www
[/code]

뭔지는 모르지만 패킷을 포워딩 시키는 비슷한 뭐시기를 추가합니다.
# vi /etc/sysctl.conf
[code]
net.inet.ip.forwarding=1
[/code]

PF를 rc.conf에 추가합니다.
# vi /etc/rc.conf
[code]
pf_enable="YES"
[/code]


재부팅하면 완료됩니다.
# reboot

클라이언트에서 접속을 시도해봅니다.

댓글 없음:

댓글 쓰기