我的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。DNAT
http 客户端将不知道它们实际上是对 发出的请求的回复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
还是8080
PC 的端口,因此80
假设如此。(如果也是8080
,只需省略和规则:80
中的--to-destination
,并将和规则中的更改为。)PREROUTING
OUTPUT
80
8080
--dport
POSTROUTING
FORWARD
答案2
由于 OpenVPN 运行基于网络级别(IP)的连接,并且您追求基于传输(TCP)的转发,因此最好处理特定的服务。
您可以在公共服务上运行 nginx 作为反向代理,并让它使用指定为 的本地服务proxy_pass http://10.8.0.2:8080
。