如何转发通过 OpenVPN 连接到 droplet 的本地电脑上的 80 端口

如何转发通过 OpenVPN 连接到 droplet 的本地电脑上的 80 端口

我的Droplet有一个公共IP地址,

我能够使用 Open VPN 连接到我的 droplet 的 LAN

我的本地电脑地址:10.8.0.2

我所看到的 Droplet 的本地地址:10.8.0.1

(我可以通过 VPN 访问整个 droplet)

答案1

假设您已经sysctl在“droplet”上启用了 IP 转发(例如使用),那么您只需继续使用配置“端口转发”(即目标 NAT)iptables。假设公共 IP 是123.123.123.123

iptables -t nat -A PREROUTING -i eth0 -d 123.123.123.123 -p tcp --dport 8080 -j DNAT --to-destination 10.8.0.2:80

-i eth0部分是可选的。它将DNAT流量限制在某个以太网接口。您应该忽略它,或者将其更改eth0为 droplet 的以太网接口名称。

如果您希望它DNAT也能在服务器本身上运行(出于测试或任何原因),那么您也需要在链中添加类似的规则OUTPUT

iptables -t nat -A OUTPUT -d 123.123.123.123 -p tcp --dport 8080 -j DNAT --to-destination 10.8.0.2:80

请注意,这显然只适用于目的地123.123.123.123(但不适用于127.0.0.1任何其他事物)。

如果您的本地 PC 在连接到 VPN 时不使用 droplet 作为其默认网关(例如,redirect-gateway既不在用户 conf/ovpn 中,也未被服务器推送),那么您也需要对重定向的流量执行源 NAT,否则 PC 将“直接”回复(即通过其 LAN 网关),并且 droplet 的 iptables 不会对 进行反向 NAT。DNAThttp 客户端将不知道它们实际上是对 发出的请求的回复123.123.123.123:80。 因此,如果是这种情况,请另外添加以下规则:

iptables -t nat -A POSTROUTING -o tun0 -d 10.8.0.2 -p tcp --dport 80 -j SNAT --to-source 10.8.0.1

同样,该-o tun0部分也是可选的。因此,要么省略它,要么更改为VPN 服务器接口的tun0名称。tun

如果 droplet 的 iptables 限制转发,例如DROP作为链的策略FORWARD,则需要为此添加例外。例如:

iptables -A FORWARD -i eth0 -o tun0 -d 10.8.0.2 -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT

假设您已经拥有:

iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

顺便说一句,显然你会想确保你的本地电脑总是能够获得10.8.0.2(例如,ifconfig-push在 CCD 文件中获取其 CN,除非它是使用简单配置的一对一服务器secret)。

PS 此答案假设 droplet 在其网络接口之一上直接配置了公共 IP。如果不是这种情况(例如,出于某种原因,某个路由器正在为其执行某种 NAT),请确保ip a在规则中使用在其上配置的私有 IP(即如 中所示),而不是用于访问它的公共 IP。在这种情况下,无论如何都不能保证它能正常工作。

编辑:刚刚注意到您说要转发8080服务器的端口。但不知道您是要转发到端口80还是8080PC 的端口,因此80假设如此。(如果也是8080,只需省略和规则:80中的--to-destination,并将和规则中的更改为。)PREROUTINGOUTPUT808080--dportPOSTROUTINGFORWARD

答案2

由于 OpenVPN 运行基于网络级别(IP)的连接,并且您追求基于传输(TCP)的转发,因此最好处理特定的服务。

您可以在公共服务上运行 nginx 作为反向代理,并让它使用指定为 的本地服务proxy_pass http://10.8.0.2:8080

相关内容