Amazon EC2上OpenVPN服务器的路由设置

这里的软件开发人员试图通过在amazon EC2上设置一个OpenVPN服务器来访问所有内部资源,从而启动他的sysadmin-foo。 下面是我如何设想,在一个新的Ubuntu 12.04规范AMI:

Local network / EC2 Cloud, 10.*.*.*/255.0.0.0 172.16.20.*/ ,' 255.255.255.0 ,' +-----------------+ .' |Amazon DNS server| | ,'| 172.16.0.23 | +---------------+ | ,' +-----------------+ | Workstation | | ,' | XXX | +-------,'------+ | 172.16.20.1 | XXXX | OpenVPN server| +------`.-------+ \ XX 10.23.45.67 `-. +-------------+ \ '. +---------------+ `-. Second server +--------`.---+ | | 10.23.45.68 | |Local server | \ +-------------+ | 172.16.20.2 | \ +-------------+ \ 

客户端可以连接到VPN(甚至在iPhone上),但是我无法全面了解需要检查的子系统。

这是我的设置目标:

  • VPN客户端应该能够通过vpn访问内部资源,其余的互联网应该通过本地网关路由
  • VPN客户端应该能够访问OpenVPN服务器可以访问的所有服务器
  • VPN客户端应使用172.16.0.23的Amazon DNS服务器作为他们的主DNS服务器,因为该服务器将亚马逊生成的主机名parsing为内部IP地址(即ec2-45-67-8-9.eu-west-1.compute.amazonaws.comparsing到10.23.45.67由该服务器解决,但到其他地方45.67.8.9
  • VPN客户端应该看到对方

下面是我configuration/etc/openvpn/server.conf (只是有趣的部分,我希望):

 persist-tun server 172.16.10.0 255.255.255.0 push "route-gateway 172.16.10.1" push "route 10.0.0.0 255.0.0.0" push "route 172.16.0.23" push "dhcp-option DNS 172.16.0.23" 

不过,我不确定openvpn服务器的哪些部分为我做:

  • 我需要在服务器上configurationiptables吗? 如果是这样,怎么样?
  • 我需要在服务器上设置路由(除了被推送到客户端)吗? 如果是这样的话,又如何?
  • 我错过了什么其他的networking软件导致我的客户端不能成功连接?

您需要在内核中的OpenVPN服务器上启用转发( /proc/sys/net/ipv4/ip_forward ),您必须全局或select性允许在防火墙(iptables)中转发,例如:

 # there is probably already a rule allowing all established connections # iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT # the next rules for every OpenVPN interface (or once for the respective address block) iptables -A FORWARD -i tun0 -d 10.0.0.0/8 -j ACCEPT iptables -A FORWARD -i tun0 -d 172.16.0.23 -j ACCEPT # if the local network shall be accessible # iptables -A FORWARD -i tun0 -d 172.16.20.0/24 -j ACCEPT 

如果只是简单的客户端连接,您不需要在服务器上设置路由。 如果172.16.20.1作为本地networking的网关连接,那么你需要一个172.16.20.0/24的路由,但可能(最好)在OpenVPN config 172.16.20.1中设置。

编辑1

如果你不能在某些系统上configuration路由,而且他们的路由不能以正确的方式发回stream量,那么你需要NAT(更精确的说:SNAT):

 iptables -t nat -A POSTROUTING -d $PROBLEM_HOST_IP \! -s $LOCAL_IP \ -j SNAT --to-source $LOCAL_IP 

与相应的variables设置。 假设你可以为172.16.20.0/24中的目标设置正确的路由,那么你可以这样做:

 iptables -t nat -I POSTROUTING 1 -s $LOCAL_IP -j ACCEPT iptables -t nat -I POSTROUTING 2 -d 172.16.20.0/24 -j ACCEPT iptables -t nat -I POSTROUTING 3 -j SNAT --to-source $LOCAL_IP