OpenVPN으로 VPN 구성 및 활용 7편_VPN 다양한 활용방안
작성자 정보
- 관리자 작성
- 작성일
컨텐츠 정보
- 4,084 조회
- 0 추천
- 목록
본문
OpenVPN으로 VPN 구성 및 활용 7편_VPN 다양한 활용방안
VPN을 이용한 다양한 활용 방안
이제 지금까지 살펴본 내용을 기초로 몇 가지를 응용해 보자.
(1) 유동IP인 사무실 인터넷을 VPN을 이용해 고정IP로 변경해 보자!
최근에는 사무실에 ADSL등을 신청하면 IP부족 등을 이유로 ISP에서 고정IP를 할당하지 않고 있어 여러 가지 번거로움이 있다.
특히 방화벽이 설치된 서버로 접속할 일이 있을 때 또는 외부에서 사무실 내부의 PC로 원격 접속하여야 할 일이 있을 때 여간 번거로운 것이 아니다. 그러나 VPN을 이용하면 고정IP처럼 사용할 수 있어 이러한 문제를 간단하게 해소할 수 있다.
여기에서는 아래 그림과 같이 사무실의 인터넷을 IDC에 있는 서버의 고정 IP로 할당하도록 설정해 보자.
[그림] 사무실 VPN망 구성도
위 그림을 살펴보면 일단 사무실내에서는 192.168.1.x 대역의 IP를 사용하며 iptables 방화벽 및 VPN이 함께 설치되어 있는 방화벽을 통해 인터넷에 연결되어 있다.
또한 IDC에는 VPN 서버로 사용할 별도의 서버가 있으며 이 서버에는 사무실IP로 할당할 공인IP가 alias 설정되어 있다고 가정하자.
먼저 서버에서 사용할 구동 스크립트는 다음과 같다.
#!/bin/sh
BIN=/root/vpn/openvpn CONF=/root/vpn/server.conf PASS=/root/vpn/auth-pam.pl
pkill -9 openvpn $BIN --config $CONF --auth-user-pass-verify $PASS via-file --tmp-dir /tmp --daemon --mode server |
그리고 가장 중요한 server.conf는 아래와 같다. 특별히 설명할 내용이 없을 정도로 쉽게 이해가 갈 것으로 생각되지만 VPN 연동을 위한 포트는 tap 인터페이스를 통해 5000/udp로 설정하였으며 자신은 10.100.2.1을 할당받고 클라이언트는 10.100.2.2를 할당받도록 설정하였다. 마지막의 “redirect-gateway def1”는 VPN연동 후 클라이언트의 기본 게이트웨이를 vpn서버인 10.100.2.1로 설정하도록 하는 내용이다.
port 5000 dev tap0 ifconfig 10.100.2.1 255.255.255.252 ifconfig-pool 10.100.2.2 10.100.2.2 route 10.100.2.0 255.255.255.252 push "route 10.100.2.1"
proto udp tls-server dh ../dh1024.pem ca ../my-ca.crt cert ../server.crt key ../server.key duplicate-cn client-to-client keepalive 10 120 comp-lzo user root group root persist-key persist-tun status openvpn-status.log log openvpn.log log-append openvpn.log verb 4 push "redirect-gateway def1" |
이제 openvpn을 구동해 보도록 하자. 잠시 후 VPN 서버에서 netstat을 실행해 보면 다음과 같이 5000/udp 에서 리슨하고 있음을 알 수 있다.
udp 0.0.0.0:5000 0.0.0.0:* 910/openvpn
ifconfig와 route를 실행하면 다음과 같이 tap0에 VPN IP가 할당되었음을 알 수 있다.
# ifconfig tap0
tap0 Link encap:Ethernet HWaddr 00:FF:FA:F1:9F:1E
inet addr:10.100.2.1 Bcast:10.100.2.3 Mask:255.255.255.252
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:674180931 errors:0 dropped:0 overruns:0 frame:0
TX packets:772453068 errors:0 dropped:1185 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:1044533201 (996.1 Mb) TX bytes:3133590810 (2988.4 Mb)
# route -n
10.100.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tap0
이때 IDC 서버의 주요 방화벽 룰은 아래와 같다.
$IPTABLES -A INPUT -i tap+ -j ACCEPT $IPTABLES -A FORWARD -i tap+ -j ACCEPT $IPTABLES -A FORWARD -o tap+ -j ACCEPT $IPTABLES -A OUTPUT -o tap+ -j ACCEPT # VPN 인터페이스인 tap 인터페이스를 통한 모든 트래픽을 허용한다.
$IPTABLES -A INPUT -p udp -s 0/0 --dport 5000 -j ACCEPT # OpenVPN 포트인 5000/udp에 대한 접속을 허용한다.
$IPTABLES -t nat -A POSTROUTING -s 10.100.2.0/30 -o eth0 -j SNAT --to 121.54.xx.xx # VPN을 통해 할당받은 10.100.2.0/30 대역 즉 사무실을 통한 패킷이 들어오면 이 서버를 거치면서 공인IP인 121.54.xx.xx 로 NAT 된다.
물론 121.54.xx.xx는 이 인터페이스에 설정되어 있어야 한다.
|
이제 다음으로는 사무실 방화벽에서의 설정을 살펴보자.
아래는 openvpn 구동 스크립트인데 앞의 서버에서의 설정과 크게 차이는 없다.
#/bin/sh
pkill -9 openvpn
BIN=./openvpn CONF=./client.conf PASS=./file1
$BIN --config $CONF --auth-user-pass $PASS --daemon route add default gw 10.100.2.1 dev tap0
|
다음은 설정파일인 client.conf의 내용이다.
여기에서 서버는 10.100.2.1을 사용하므로 클라이언트는 10.100.2.2를 사용하게 되며 포트번호와 dev는 서버의 값을 따라가게 된다.
그리고 remote는 VPN 연결을 위해 접속하게 되는 서버이므로 지정할 IP는 VPN을 통해 사용하게 될 IP가 아닌 VPN 서버의 자체IP를 지정하면 된다.
물론 공인IP 1개만을 할당하여 서버와 VPN을 함께 사용할 수도 있지만 가급적 해당 서버에는 두개의 IP를 할당하여 서버자체IP(이를테면 eth0, 121.54.1.1)와 VPN을 통해 사무실에서 외부로 접속 시 보이게 되는 고정IP(이를테면 eth0:0, 121.54.1.2)를 알리아스 할당하여 사용하는 것이 좋다.
ifconfig 10.100.2.2 255.255.255.252 port 5000 dev tap0 remote 121.54.xx.xx tls-client proto udp user nobody group nobody comp-lzo verb 4 status openvpn-status.log log openvpn.log log-append openvpn.log ca my-ca.crt cert client.crt key client.key pull ping 10 ping-restart 60 persist-key persist-tun redirect-gateway def1 |
ifconfig와 route를 실행하면 다음과 같다. 여기에서 eth0은 모뎀을 통해 할당받은 유동IP이고 tap0는 VPN 실행을 통해 할당한 IP가 된다.
여기에서 유동IP는 공인이든 사설이든 관계없으며 인터넷만 연결할 수 있으면 된다.
# ifconfig
eth0 Link encap:Ethernet HWaddr C0:04:B3:23:2A:4A
inet addr:222.138.194.110 Bcast:222.138.194.255 Mask:255.255.255.0
tap0 Link encap:Ethernet HWaddr 6A:0E:54:16:C0:1D
inet addr:10.100.2.2 Bcast:10.100.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
# route -n
222.138.194.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.100.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tap0
0.0.0.0 10.100.2.1 0.0.0.0 UG 0 0 0 tap0
첫 번째 줄은 모뎀을 통해 할당받은 라우팅 테이블이며 두 번째는 사무실 내부의 네트워크와 연동하기 위한 라우팅 테이블, 그리고 세 번째는 VPN의 tap0 인터페이스를 통해 상호 통신할 수 있도록 하는 라우팅 테이블이며 마지막은 기본 게이트웨이 설정으로서 모든 트래픽을 VPN을 통해 전송한다는 것을 알 수 있다.
만약 이 설정대신 기본게이트웨이가 아래와 같이 되어 있으면 VPN이 아닌 공용 인터넷을 통해 접속이 된다는 의미가 된다.
0.0.0.0 222.138.194.254 0.0.0.0 UG 0 0 0 eth0
사무실 방화벽의 iptables 룰은 다음과 같다.
$IPTABLES -A INPUT -i tap+ -j ACCEPT $IPTABLES -A OUTPUT -o tap+ -j ACCEPT $IPTABLES -A FORWARD -i tap+ -j ACCEPT # VPN 인터페이스인 tap 인터페이스를 통한 모든 트래픽을 허용한다.
$IPTABLES -A FORWARD -s 192.168.1.0/24 -j ACCEPT # 사무실 내부의 pc에서의 트래픽을 허용한다.
$IPTABLES -A FORWARD -i tap0 -j ACCEPT # tap0를 통한 트래픽은 모두 허용한다.
$IPTABLES -t nat -A POSTROUTING -o tap0 -j MASQUERADE # tap0를 통해 나가는 트래픽에 대해 마스커레이드한다.
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT ACCEPT # 위 부분은 7장 방화벽에서 충분히 설명된 내용이다.
|
물론 내부의 트래픽을 외부로 적절히 포워딩하여야 하므로 net.ipv4.ip_forward 은 반드시 1로 설정되어야 한다.
이제 내부에서 외부가 아닌 외부에서 내부의 PC의 터미널 등으로 접속하고자 할 경우 어떻게 하여야 할까? 여러 가지 방법이 있지만 xinetd의 redirect 기능을 이용하면 간단히 해결된다.
이를테면 아래는 VPN서버에서의 xinetd.conf 설정이다.
service 11111
{
flags = REUSE
socket_type = stream
protocol = tcp
wait = no
user = root
port = 10000
groups = yes
redirect = 10.100.2.2 11111
}
다음은 사무실 방화벽에서의 xinetd.conf 설정이다 .
service 11111
{
type = UNLISTED
flags = REUSE
socket_type = stream
protocol = tcp
wait = no
user = root
port = 11111
groups = yes
redirect = 192.168.1.222 3389
}
즉, VPN서버의 고정IP인 121.54.xx.xx의 11111/tcp로 접속하면 VPN을 통해 사무실 내부의 192.168.1.222 PC의 터미널(3389/tcp) 에 접속하게 되는 것이다.
클라이언트에서 VPN을 가동 후 기본 게이트웨이가 tap0가 아닌 eth0으로 잡혀지는 경우가 있다.
이러한 경우 수동으로 아래와 같이 실행해 주면 된다.
# route add default gw 10.100.2.1 dev tap0
그리고, 유동IP이어도 관계없는 트래픽은 VPN이 아닌 공용 인터넷을 통해 접속하고자 할 수 있는데, 이러한 경우 아래의 라우팅 테이블을 추가해 주면 된다.
# route add -host 192.168.68.23 gw 222.138.194.254 dev eth0
|
(2) NAT 방화벽에 VPN을 설치해 보자!
다음으로는 앞에서도 살펴본 방법인데, 약간 변형된 방식으로서 NAT로 사용 중인 방화벽에 OpenVPN을 함께 설치하여 외부에서 방화벽 내부에 있는 사설IP를 사용 중인 서버에 직접 접속하는 방법을 구현해 보자.
먼저 FW/VPN 서버에서의 VPN 가동 스크립트는 동일하므로 바로 설정 파일을 살펴보자.
config를 보면 이제 익숙해 질 것이다.
달리 특별한 부분은 없으며 IP할당 부분을 보면 네트워크 구조가 이해가 될 것인데, 먼저 FW/VPN 서버는 tap0 인터페이스에 100.100.1.1을 할당하게 되고 VPN을 통해 인증을 받은 클라이언트는 별도의 인터페이스에 100.100.1.100부터 100.100.1.200까지 dynamic하게 할당받게 된다.
그리고 이 PC는 NAT방화벽 내부의 172.16.10.0/24 대역의 서버에 직접 접속할 수 있게 된다.
[그림] NAT 방화벽 구성도
그리고 openvpn을 가동하면 기본적으로 모든IP인 0.0.0.0에 대해 리슨하는데, 만약 eth0이 아닌 eth0:1에 할당된 IP로 VPN 접속하고자 한다면 요청은 eth0:1으로 왔지만 이에 대해 eth0에 할당된 IP로 응답하게 되어 정상적으로 접속이 되지 않는다.
따라서 이러한 경우 모든 IP가 아닌 특정한 IP에 대해서만 리슨하고자 설정할 필요가 있는데, 아래와 같이 “local 222.222.222.222”로 설정하면 된다.
port 5000 proto udp dev tap0 tls-server dh key/dh1024.pem ca key/my-ca.crt cert key/office.crt key key/office.key
ifconfig 100.100.1.1 255.255.255.0 ifconfig-pool 100.100.1.100 100.100.1.200 255.255.255.0 push "route-gateway 100.100.1.1" push "route 172.16.10.0 255.255.255.0"
duplicate-cn keepalive 10 60 local 222.222.222.222 comp-lzo user root group root persist-key persist-tun status openvpn-status.log log openvpn.log log-append openvpn.log verb 4 |
FW/VPN에서 openvpn을 가동하면 다음과 같이 보이는 것을 알 수 있다.
# ifconfig
tap0 Link encap:Ethernet HWaddr 7A:34:A4:3C:5E:D1
inet addr:100.100.1.1 Bcast:100.100.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
# route -n
100.100.1.0 0.0.0.0 255.255.255.0 U 0 0 0 tap0
다음은 iptables 룰을 살펴볼 차례이다.
NAT 기본 설정은 7장에서 살펴보았고, VPN과 관련된 주요 룰은 다음과 같다.
$IPTABLES -A FORWARD -i tap0 -m iprange --src-range 100.100.1.131-100.100.1.137 -j ACCEPT $IPTABLES -A FORWARD -i tap0 -s 100.100.1.1.0/24 -j DROP # 만약 VPN을 통해 할당받은 IP중 특정한 IP에 대해서만 허용하고자 할 때 위의 룰을 설정할 수 있다.
이에 대해서는 뒤에서 잠깐 살펴보기로 하겠다.
$IPTABLES -A INPUT -i tap+ -j ACCEPT $IPTABLES -A OUTPUT -o tap+ -j ACCEPT $IPTABLES -A FORWARD -i tap+ -j ACCEPT # tap 인터페이스를 통한 모든 트래픽을 허용한다.
|
이제 PC의 VPN config를 살펴보자. 역시 특별한 것은 없으며 VPN연결을 위해 222.222.222.222에 접속 시도 하는 것을 알 수 있다.
만약 OpenVPN을 통해 연동된 사무실내 PC에서 또 다른 OpenVPN을 통해 연동된 서버나 네트워크로 접속한 후 명령어를 입력하면 화면이 멈추는 경우가 있다.
이러한 경우에는 아래와 같이 클라이언트 PC의 config 설정에 "mssfix 1300" 와 같이 추가해 주어야 한다.
dev tap0 remote 222.222.222.222 tls-client proto udp port 5000 comp-lzo verb 4 nobind ca ca.crt cert client.crt key client.key pull persist-local-ip ping 30 ping-restart 60 auth-user-pass password.txt mssfix 1300 |
잠시 후 PC에서 VPN을 연결한 후 ipconfig를 실행해 보면 VPN을 통해 100.100.1.x IP를 할당받았음을 알 수 있다.
Ethernet adapter 로컬 영역 연결 2: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 100.100.1.131 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : |
그리고 route print를 실행하면 VPN과 관련된 라우팅 테이블이 추가된 것을 알 수 있는데, 이를 통해 NAT 방화벽 내부의 서버에 직접 접속할 수 있게 되는 것이다.
아래 라우팅테이블에서 ➀만 살펴보면 되는데, 이를 통해 172.168.10.x 대역에 접속하려면 FW/VPN의 IP인 100.100.1.1에 접속하게 되는 것이다.
➀ 172.16.10.0 255.255.255.0 100.100.1.1 100.100.1.131
➁ 100.100.1.0 255.255.255.0 100.100.1.131 100.100.1.131
➂ 100.100.1.131 255.255.255.255 127.0.0.1 127.0.0.1
➃ 100.255.255.255 255.255.255.255 100.100.1.131 100.100.1.131
실제로 PC에서 tracert를 실행하면 다음과 같이 보이게 된다.
C:\Documents and Settings\antihong>tracert -d 172.16.10.21
Tracing route to 172.16.10.21 over a maximum of 30 hops
1 7 ms 5 ms 1 ms 100.100.1.1
2 4 ms 4 ms 4 ms 172.16.10.21
Trace complete.
다음으로는 VPN 운영 시 필요한 몇 가지 팁을 살펴보자.
➀ VPN에 접속하는 각 PC별로 고정 IP를 할당하려면?
기본적으로는 VPN에 접속하는 각 PC별로 dynamic하게 IP를 할당하게 되는데, 사전에 정의된 특정 IP를 할당하고자 할 때가 있다.
이러한 경우에는 각 PC의 네트워크 환경에서 할당을 원하는 IP를 직접 입력해 주면 된다.
[그림] 고정 IP를 할당한 예
이와 같이 설정 후 VPN을 접속하면 메시지에는 임의의 IP가 할당되지만 실제로는 이 IP로 사용하게 된다.
그런데, 만약 중복할당을 하여 IP충돌이 나면 어떻게 되는가? 이러한 경우에는 FW/VPN에서 별도의 설정을 해 주면 된다.
즉, 아래와 같이 PC의 TAP-Win32 에 할당된 mac 주소를 save해 주는 것이다.
참고로 TAP-Win32의 mac은 가상의 mac 주소로서 VPN을 재설치하면 바뀌게 되므로 주의하기 바란다.
# arp -s 100.100.1.131 00:FF:76:03:08:84
➁ 특정 IP의 접속을 제한하고자 한다면?
앞에서 잠깐 살펴보았지만 특정 IP대역에서는 특정 IP의 서버만 접속을 허용하고자 한다면 iptables룰을 사용하면 된다.
즉, 아래와 같이 룰을 설정하면 100.100.1/0/24 대역의 모든 IP는 172.16.10.19 및 20에 대해서는 접근 가능하지만 이외의 IP에 대해서는 접근이 거부되며 100.100.1.131만 모든 IP에 대한 접근이 가능하게 된다.
$IPTABLES -A FORWARD -i tap0 -s 100.100.1.0/24 -d 172.16.10.19 -j ACCEPT
$IPTABLES -A FORWARD -i tap0 -s 100.100.1.0/24 -d 172.16.10.20 -j ACCEPT
$IPTABLES -A FORWARD -i tap0 -s 100.100.1.131 -d 172.16.10.0/24 -j ACCEPT
$IPTABLES -A FORWARD -i tap0 -s 100.100.1.1.0/24 -d 72.16.10.0/24 -j DROP
그런데, 이러한 접근 권한을 FW/VPN 설정 파일에서 아래와 같이 라우팅을 제한 설정함으로써 가능하다고 생각할 수 있다.
push "route 172.16.10.50 255.255.255.255"
물론 맞는 말이다.
하지만 VPN 서버를 통해 유저의 PC에 할당되는 이 라우팅 테이블은 유저가 임의로 추가, 삭제가 가능하므로 사실상 신뢰할 수 없음을 알아야 할 것이다.
따라서 정확히 하기 위해서는 iptables룰을 엄격히 설정해 주는 것이 좋다.
지금까지 여러 방식에서의 VPN 활용 방법에 대해 알아보았는데, 조금만 응용한다면 같은 방식으로 NAT나 브리지 방식의 방화벽을 사용하는 사무실과 사무실의 VPN 연동이나 다른 환경도 쉽게 구현할 수 있을 것이다.
만약 VPN 연결이 제대로 되지 않을 경우에는 로그 메시지를 근거로 원인을 찾아보기 바라며 OpenVPN 홈페이지에 많은 예제와 FAQ가 나와 있으니 참고하기 바란다.
OpenVPN을 이용하여 지금까지 살펴본 바와 같이 별도의 static키를 공유하거나 PKI, username/password를 이용하여 연동하였다. 이외에도 버전이 업데이트 되면서 상용솔루션 수준의 새로운 기능이 계속 추가되고 있으므로 여러 환경에서 잘만 활용한다면 굳이 고가의 상용 보안솔루션을 도입하지 않더라도 OpenVPN을 이용하여 더욱 안전하면서도 편리한 보안솔루션이 될 수 있을 것이라고 필자는 확신한다.
관련자료
-
이전
-
다음