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

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

我是软件开发人员,试图通过在 Amazon EC2 上设置 OpenVPN 服务器来访问那里的所有内部资源,从而使其系统管理员 foo 正常运行。以下是我在全新 Ubuntu 12.04 Canonical 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 客户端应使用 Amazon DNS 服务器172.16.0.23作为其主 DNS 服务器,因为该服务器将 Amazon 生成的主机名解析为内部 IP 地址(即,由该服务器解析时ec2-45-67-8-9.eu-west-1.compute.amazonaws.com将解析为,但其他任何地方都将解析为)10.23.45.6745.67.8.9
  • VPN 客户端应该互相看到

以下是我的配置方式/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 服务器为我做了哪些部分:

  • 我需要在服务器上配置 iptables 吗?如果需要,该怎么做?
  • 我是否需要在服务器上设置路由(除了推送到客户端的路由)?如果需要,需要设置哪些路由以及如何设置?
  • 我缺少哪些其他网络软件导致我的客户端无法成功连接?

答案1

您需要在内核中的 OpenVPN 服务器上启用转发(/proc/sys/net/ipv4/ip_forward),并且必须在防火墙(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 作为本地网络的网关连接,则需要 172.16.20.0/24 的路由,但这可能(也是最好的)是在 172.16.20.1 的 OpenVPN 配置中设置的。

编辑1

如果您无法在某些系统上配置路由,并且其路由不会以正确的方式将流量发送回,那么您需要 NAT(更准确地说:SNAT):

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

并相应地设置变量。假设您只能为 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

相关内容