* OpenVPN 을 통한 VPN 구현
- Linux - Windows
@ 시스템 구성
각 VPN클라이언트 끼리도 통신 또한 가능해야 만들어보자. (서버측 server.conf로 설정)
- VPN 서버 : Centos 4.7 (Vmware 브릿지)
- VPN 클라이언트 : Windows XP
- VPN 네트워크 : 10.100.0.0 (10.100.0.1 ~ 10.100.0.255) (서버측 server.conf로 설정)
- VPN 사용포트 : 1194/UDP (서버측 server.conf로 설정)
@ 서버 Centos 4.7에서 OpenVPN설치
@lzo설치 ( 실시간 압축 전송 라이브러리)
#http://dag.wieers.com/packages/lzo/ 에서 적당한 버전의 rpm을 받거나,
#wget 을 사용해 아래처럼 다운받을수있다.
@devel 버전이랑 2개를 받는 이유는? 잘은 모르지만 서로간의 의존성때문이라고한다.
#wget http://dag.wieers.com/packages/lzo/lzo-1.08-4.2.el4.rf.i386.rpm
#wget http://dag.wieers.com/packages/lzo/lzo-devel-1.08-4.2.el4.rf.i386.rpm
#rpm -Uvh lzo.. 명령으로 rpm을 설치하자.
@openvpn 받아서 rpm 으로 만들어 rpm형식으로 설치하자.
wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
: 안된다면 DNS가 제대로 작동하는 지 확인하자.
@ rpmbuild -tb openvpn-2.0.9.tar.gz
- 압축파일을 rpm형식으로 만들어주는 명령이다.(lzo가 깔려있지않으면 실행되지않음)
- rpm으로 만들면 아래경로에 만들어진다. 경로를 적어주고 설치하자.
@rpm -Uvh /usr/src/redhat/RPMS/i386/openvpn-2.0.9-1.i386.rpm
@Rpm으로 설치되는 파일 및 디렉토리들을 한번봐두자.
#rpm -ql openvpn 으로 확인해보자. 대충 중요한 디렉토리위치는 아래에 적어놨다.
/etc/openvpn //openvpn 설정
/etc/rc.d/init.d/openvpn //openvpn데몬 위치
/usr/sbin/openvpn //관리자권한의 openvpn명령
/usr/share/doc/openvpn-2.0.9/*
/usr/share/man/man8/openvpn.8.gz
/usr/share/openvpn
/usr/share/openvpn/plugin/* //openvpn의 plugin이 있는 디렉토리
3. 인증서 생성 - 서버
인증서 생성은 필수이다.
1) CA 생성 (상위 인증기관)
먼저 인증서를 관리하는 /usr/share/doc/openvpn-2.0.9/easy-rsa/ 디렉토리로 이동하자.
@vars 파일은 인증서 생성시 넣어야할 정보를 미리넣어두어서 나중에 인증서생성시 간단하게 생성할수있게 참조시켜주는 파일이다.
vars파일을 열어 젤 아래쪽에 간단한 정보를 기입하자.
< /usr/share/doc/openvpn-2.0.9/easy-rsa/vars>
: 인증키를 보관할수있는 keys디렉토리를 생성해주자.
. ./vars
: vars내용을 include한다는 명령
./clean-all
: 기존에 생성 인증서가 있으면 모두 삭제
@./build-ca
- CA 인증서를 생성한다. 생성시 vars파일을 참조하기때문에 기본설정이 내가 설정된값이
되어있기 때문에 간단하게 넘어갈수있다.
- 하지만 Common Name에서 server & hostnme 에서 반드시 server를 적어두자.
- 실수로 Enter로 넘어갔다면 다시 ./build-ca를 실행하면 된다.
- 이렇게하면 keys라는 폴더에 ca.key(개인키), ca.crt(공개인증서)가 생성된것을 확인한다.
- ca.crt파일은 모든 클라이언트에 배포. ca.key는 서버만 가지고 있음.
2) 서버키 생성 (서버에 사용될 인증서 및 개인키)
./build-key-server server
- 위와 똑같이 넘어간다.
- Sever설정이기때문에 Common Name에선 sever라고 넣어주자.
- 나머지 설정은 중요하지 않기때문에 변경안하고 Enter로 넘어가고 Y/N이 나오면 Y만 누르면된다.
- 설정이 끝나면 keys 디렉토리에 서버의 인증서(server.crt) 및 개인키(server.key) 등이 생긴것을 확인할수 있다.
- 이 키들은 CA에 의해 사인된 인증서이다.
- 모두 서버에만 사용된다. 클라이언트용은 따로 만들어준다.
3) 클라이언트키 생성 (클라이언트에 사용될 인증서)
./build-key client
- 서버설정과 동일하다 다만 Common Name 설정에 Client라고만 설정하자.
- keys
- keys 디렉토리에 생성된 모든 인증서는 CA에서 검증받은것이니 신뢰할수있다.
4) Diffie Hellman 파라메터 생성
:암호화에 필요하다.
./build-dh
- keys디렉토리에 dh1024.pem 파일이 생긴것을 확인할 수 있다.
- dh1024.pem은 서버에만 가지고 있는다.
@dh1024.pem 은 1024bit로 dh방식으로 암호화
@클라이언트용 파일을 Windows Xp에서 받을수있게 압축한뒤 /var/ftp/pub 안에 넣자.
@pub디렉토리는 ftp접속시 보여주는 기본 디렉토리이므로 윈도즈에서 ftp 주소를 넣었을때 바로 파일을 찾기위해서 하는것이다.
# mkdir -p /root/client-keys 후 /usr/share/doc/openvpn-2.0.9/easy-rsa/keys 디렉토리안의 ca.crt, client.crt, client.csr, client.key를 만들어준 /root/client-keys디렉토리에 복사하여 아래와같이 압축후 /var/ftp/pub안에 넣어주자.
@이제 설정이 끝났으니 openvpn데몬을 시작시켜 tun 이라는 vpn통신을 하기 위한 이더넷카드가 생성되는 지 확인해본다.
@ /etc/rc.d/init.d/openvpn restart 실행후
ifconfig 명령을 실행 후 tun0 정보가 올라와 있나 확인해 본다.
@ 없다면 /dev/net/tun 이 있는지 확인하고 없으면 /dev/net 디렉토리에서 net/tun c 10 200이라고 써서 생성시켜준다.
그래도 tun카드가 올라오지 않을경우 /var/log/messages 목록을 보면 무엇때문에 동작이 안되었는지를 알수있다. 실시간으로 보기위해서 터미널창을 한개 더 열어서 #tail -f 옵션으로 메세지를 확인해보자.
@나는 여기까지 했지만 tun이 올라오지 않았다. 그러면 /etc/openvpn디렉토리에서 다시 설정을 해줬다. 그러면 우리가 설정 했던 디렉토리에서 파일들을 /etc/openvpn으로 복사를 해야한다.
#현재 Centos 4.7을 Vpn서버로만 사용할거기 때문에 server.* 무조건 복사하고 나머지 기본 인증서 / 키 들을 복사한다.
아래는 /etc/openvpn으로 복사할 파일들을 나열했다.
- 먼저 파일이 있는 /usr/share/doc/openvpn-2.0.9/ 들어가서 작업을 해주자.
- cp sample-config-flies/server.conf /etc/openvpn/
- cp easy-rsa/keys/server.* /etc/openvpn/
- cp easy-rsa/keys/dh1024.pem /etc/openvpn/
- cp easy-rsa/keys/ca.* /etc/openvpn/
<복사후 /etc/openvpn>
@ 그럼이제 서버설정파일을 수정해보자.(/etc/openvpn/server.conf)
<server.conf안의 내가 설정한 부분>
@ 주의할점 구문앞에 붙어있는 세미콜론(;)은 주석을 뜻하므로 사용하고자하는 설정 앞에 세미콜론이 있다면 제거한후 입맛에 맛게 다시 설정해주면된다.
- vpn sever 네트워크 대역을 10.100.0.0 netmask 255.255.255.0으로 설정
- client-to-client : vpn 클라이언트 끼리 통신 가능하게 해주게 한다.
- duplicate-cn : client인증서 하나로 여러대의 PC에서 사용할 수 있게한다.
- max-clients 100 : 최대 연결수를 100으로 제한한다.
- plugin .... : user/pass인증을 받는다. (접속시 서버시스템안의 계정을 넣어야 접속가능)
:@주의 할점 plugin 띄워쓰기를 잘해주자~! 참고로 전 띄워쓰기때문에 오류가 났었다.
위와같이 설정후 다시 #service openvpn restart 를 해보자.
/etc/rc.d/init.d 안의 데몬과 /etc/services 같다. 그래서 난 간단하게 #service명령으로 다시 데몬프로세스를 동작시켰다.
그럼 아래와 같이 Vpn 장치가 올라오는 것을 ifconfig로 확인할수있다.
자 그럼 이제 서버설정은 끝났다.
<tun0:vpn용 가상카드>
@ 그럼이제 클라이언트 windows XP에 설치하기로 했었다. 그러기 위해선 서버시스템에서 생성한 클라이언트용 인증서 // 키 그리고 ca인증서가 필요하다. 그러므로 윈도우로 복사를 해줘야하는 파일들이다. 아래그림처럼 4개의 파일을 압축시키자.
@윈도우 브라우저에서 ftp centos 4.7을 열었을때 기본제공 디렉토리가 /var/ftp/pub이다. . 즉 브라우저에선 pub밖에 보이지 않는다. 그러므로 압축파일을 바로 찾을수있게 pub디렉토리에 복사를 해준다.
@ Windows XP에
클라이언트 세팅!먼저 아래 사이트에서 openvpn 윈도우용 패키지를 다운받아서 설치하자
http://www.openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe
< openvpn install.exe 실행시 >
@ 서버측에 만들어 놓았던 압축파일을 다운받자.
@ 파일를 받아서. 압축해제 후 시작 -> 프로그램 -> OpenVPN -> Open VPN configuration file directory 을 누르면 폴더가열리는 데 이곳에다. 압축푼 4개파일을 넣어주자. *다른 압축파일등은 넣지말자. 그리고 이 디렉토리에 하나의 파일을 더 복사를 해줘야한다. 그파일은 아래 그림을 참조하자.
@그림을 과 같이 sample configuration files알의 Client.ovpn도 위의 디렉토리에 복사(중요)
: 접속할 서버의 정보를 세팅을 해줄수있는 파일이기때문
@복사를 하고 configuration file directory폴더를 확인 해서 아래와 같이 파일들이 존재해야한다.
@여기서 client.ovpn을 열어 원격접속할 서버의 주소와 포트를 넣어준다.
@이제 설정이 끝났다. 그럼이제 서버에서 작업한것과 마찬가지로 vpn 이더넷 카드 를 아래의 메뉴를 클릭하여 만들어주자.(제대로 동작되지 않으면 아래의 Delete ... 로 지운후 다시 ADD 해주면된다)
@위의 작업을 하셧다면 작업표시줄에 새로운 네트워크가 생긴다. 이것을 Connect 해주자.
@만약 생성하고도 작업표시줄에 뜨지 않았다면 Openvpn메뉴에서 GUI를 실행시키면 된다.
@Connect화면
: 서버시스템안에 생성된 계정중의 한개를 넣어주자 전 test/1234로 미리 설정해두었음.
@만약제대로 접속이 되었다면 기본설정으로 자동Ip를 받는다.
:현재 10.100.0.6 ip가 배당된것을 작업표시줄에서 실시간으로 확인가능하다.
@ 아니면 cmd창에서 ipconfig로도 확인가능하다.
@ 그럼이제 vpn끼리 통신이 되는지 또 어떻게 동작하는지를 알아보자.
: vpn서버주소로 ping으로 icmp프로토콜을 날려보자.
서로 그럼 vpn으로 통신이 연결된것을 확인할수 있게 된다.
@ Putty로 ssh 로도 접속을 해보자.(서버측에 sshd가 동작되고있어야함)
: 그럼 아래의 그림과 같이 동작은 잘되는 것을 확인할수있다.
@그럼이제 이것들이 통신할때 어떤 식으로 동작하길래 VPN이 신뢰성이 있는 지 Wire Shark(패킷 분석기)로 확인해보자.
@@@@@@ 아래 그림은 패킷분석기로 port 1194 를 스니핑한 그림이다. @@@@@
udp 라고 나오는 것은 서버측 /etc/openvpn/server.conf 안에 udp 와 포트 1194로 설정되어있기문에 설정된것으로만 보여지는 것이다. .
즉 Vpn으로 통신하고 있는 경우 어떤 통신을 하고있는지 조차 알수가 없다
SSh랑 다른점은 ssh은 그냥 원격접속시 암호화를 제공한다는 것이고 접속이 된 상태에선 암호화를 제공하지 않는다.
<port 1194만 스니핑 한 패킷분석기 화면 >