AWS VPC상에 다음과 같은 네트워크 구성이 있다고 가정하자. Public Subnet은 Internet Gateway와 연결되어 있기 때문에, EIP를 가지고 있다면 외부로 나가는 것이 가능하다. 하지만 Private Subnet의 경우, Internet Gateway와 연결이 되어 있지 않기 때문에 외부와 직접적으로 통신할 수 없다. 따라서 이 Private Subnet 안에 존재하는 EC2 인스턴스에 접근하기 위해서는, 외부에서 접근이 가능한 Public Subnet의 어떤 인스턴스로 접근한 후 이 안에서 Local Gateway를 타고 Private Subnet으로 접근을 해야 할 것이다.

따라서 이런 불편함을 극복하기 위해 openvpn서버를 Public Subnet안에 두고 이 서버를 게이트웨이 삼아 가상 네트워크를 구성한다면, VPN을 사용해서 Private Subnet에도 한 번에 접속할 수 있을 것이다.

네트워크 구성

간단하게 AWS VPC + EC2로 구성해 보았다.

서버 설정

먼저 openvpn server가 위치할 Public Subnet, 일반적인 Public Subnet, 그리고 Internet Gateway와 연결되지 않은 Private Subnet 이렇게 세 개가 있다. 서버 설정은 이쪽의 설정을 그대로 사용하여도 무방하나, 다음의 설정은 반드시 추가되어야 한다.

push "redirect-gateway"

다음은 openvpn 서버의 ip_forward를 설정해 준다. 추가적으로 AWS EC2의 경우, Source/dest. check를 False로 변경해야 IP Forward가 허용된다.

클라이언트 설정

클라이언트가 위 설정대로 실행된 vpn server에 연결한다면 다음과 같은 라우팅 룰을 볼 수 있을 것이다.

client-side:~/cublr-openvpn$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.200.5   0.0.0.0         UG    0      0        0 tun0
xxx.xxx.xxx.xxx 192.168.0.1     255.255.255.255 UGH   0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
192.168.200.1   192.168.200.5   255.255.255.255 UGH   0      0        0 tun0
192.168.200.5   0.0.0.0         255.255.255.255 UH    0      0        0 tun0

딱히 클라이언트에서 수정해 줄 것은 없다.

VPC Subnet Route table 설정

다음은 route table을 설정해 주어야 한다. 세 개의 서브넷에 다음과 같은 룰을 추가해 준다.

DestinationTarget
OpenVPN SubnetOpenVPN Server

테스트

그림의 각 인스턴스에 22번 포트로 테스트를 해 본다.

client-side:~$ telnet 50.0.200.190 22
Trying 50.0.200.190...
Connected to 50.0.200.190.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.1
^]
telnet> Connection closed.
client-side:~$ telnet 50.0.100.137 22
Trying 50.0.100.137...
Connected to 50.0.100.137.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.1
^]

telnet> Connection closed.
cublr@openvpn-client-side:~$ telnet 50.0.50.251 22
Trying 50.0.50.251...
Connected to 50.0.50.251.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.1
^]

telnet> Connection closed.

이상없이 Private IP를 통해 Private Subnet에 있는 EC2에도 접속할 수 있음을 알 수 있다.

장점

  • 모든 클라이언트가 OpenVPN을 설치할 필요가 없다.
  • Private IP를 사용해서 외부에서 접근할 수 있다.
  • 보안상의 장점

EC2의 시큐리티 그룹을 VPN Subnet으로만 열게 되면 VPN ip를 할당받지 못한 사람은 절대 인스턴스에 접근할 수 없게 된다.