我是软件开发人员,试图通过在 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.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"
但是,我不确定 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