我的服务器上运行着许多服务,我想限制只有通过 OpenVPN 连接的服务才能访问这些服务。我确实设法让路由工作到我添加到机器的第二个 IP,但这并不理想。
*.*.*.1
是主公共 IP。它与本地 IP 绑定172.31.20.102
。 *.*.*.2
是为测试而创建的同一台机器上的辅助 IP。它与本地 IP 绑定172.31.20.103
。这是在 Amazon EC2 界面中完成的,而不是在服务器上完成的。
笔记:这里的 * 只是为了掩盖 IP 地址。真正的配置有实际的公共 IP。
以下是 OpenVPN 服务器配置的相关部分:
dev tun
server 172.16.128.32 255.255.255.240
#push "route *.*.*.1 255.255.255.255 net_gateway"
push "route *.*.*.2 255.255.255.255"
我尝试过有和没有该行的情况,这就是为什么我在这个示例中对其进行了注释。请注意,路由在当前配置下push "route *.*.*.1 255.255.255.255 net_gateway"
确实有效。*.*.*.2
VPN 上的服务器 IP 是172.16.128.33
。
以下是相关内容sysctl.conf
:
net.ipv4.ip_forward = 1
以下是相关内容iptables-save
:
*nat
-A PREROUTING -p tcp -m state --state NEW -m tcp --dport 22 -j DNAT --to-destination 172.16.128.33
-A POSTROUTING -s 172.16.128.32/28 -o eth0 -j MASQUERADE
COMMIT
*filter
-A FORWARD -i tun0 -s 172.16.128.32/28 -d *.*.*.1 -j ACCEPT
-A FORWARD -i tun0 -s 172.16.128.32/28 -d *.*.*.2 -j ACCEPT
-A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 172.16.128.32/28 -j ACCEPT
-A INPUT -s 172.31.20.100/28 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
-A PREROUTING -p tcp -m state --state NEW -m tcp --dport 22 -j DNAT --to-destination 172.16.128.33
允许我通过 SSH 进入备用接口。为每个端口添加一行这样的代码并不理想,但如果没有其他选择,这也是可以接受的。
例如,我希望能够访问 上的端口 22。*.*.*.1
我希望连接源自*.*.*.1
,而不是我的公共 IP。我意识到我无法通过隧道路由所有流量,因为隧道本身必须维护,但我希望其他一切都通过隧道。
如果我遗漏了任何有用的信息,请告诉我。
答案1
据我所知,EC2 没有实现 nat 环回,这就是与您自己的连接失败的原因。
简短的解决方案是将公共 IP 添加到虚拟接口或将转发到公共 IP 的所有内容 DNAT 到您的内部地址。
虚拟接口:
ip link add dummy0 type dummy
ip addr add *.*.*.1/32 dev dummy0
ip link set dummy0 up
iptables -A OUTPUT -s *.*.*.1/32 -o eth+ -j REJECT
iptables -A FORWARD -i tun+ -o dummy0 -j ACCEPT
iptables -A FORWARD -i dummy0 -o tun+ -j ACCEPT
或 NAT:
iptables -t nat -A PREROUTING -i tun+ -p tcp -d *.*.*.1 -m state --state NEW -j DNAT --to-destination 172.16.128.33
更常见的解决方案是实施水平分割 DNS,这将允许您使用内部和外部 IP 运行基于名称的安全网络。随着网络的扩展,这将使自动路由和管理在未来变得更加容易。