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

per*_*tus 6 ubuntu static-routes iptables openvpn

这里的软件开发人员,试图通过在 amazon EC2 上设置 OpenVPN 服务器来访问那里的所有内部资源来启动并运行他的 sysadmin-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 |       \
  +-------------+        \
Run Code Online (Sandbox Code Playgroud)

客户端可以连接到 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.67时将解析为,但会解析为45.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"
Run Code Online (Sandbox Code Playgroud)

但是,我不确定 openvpn 服务器为我做了哪些部分:

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

Hau*_*ing 3

您需要在内核 ( /proc/sys/net/ipv4/ip_forward) 中的 OpenVPN 服务器上启用转发,并且必须在防火墙 (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
Run Code Online (Sandbox Code Playgroud)

如果只是简单的客户端连接,则无需在服务器上设置路由。如果 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
Run Code Online (Sandbox Code Playgroud)

并相应设置变量。假设您可以为 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
Run Code Online (Sandbox Code Playgroud)