绕过服务器 VPN 从外部访问其 HTTP 端口

绕过服务器 VPN 从外部访问其 HTTP 端口

我正在使用 FreeBSD 12.1 和 openvpn 运行家庭服务器。 openvpn 严格在服务器上运行 - 我的家庭网络的其余部分是非 openvpn。

我是网络服务器的菜鸟,并且正在通过lighttpd 闲逛以该身份使用服务器。我为端口 8080 设置了网络服务器(我的 ISP 保持 80 关闭),并将我的 DD-WRT 路由器设置为将传入端口 8080 转发到服务器 8080。

我想要的是让我的服务器承担 VPN 服务器和非 VPN 网络服务器的双重职责。

但我想要的目标 - 通过我的路由器的外部 IP(添加“:8080”)访问网络服务器 - 仅当我停止 openvpn 时才有效。如果我使用我的 VPN IP(添加了“:8080”),我可以使用烤箱 vpn 访问网络服务器,但是当服务器或 openvpn 重新启动时,该 IP 总是会发生变化,所以这是不切实际的。

在我的 rc.conf 中我有:

firewall_enable=yes
firewall_nat_enable=yes
gateway_enable=yes

(我不确定是否需要最后两个)

我的 ipfw 规则非常基本。如果 openvpn 停止,我将它们本质上设置为我的 torrent 和 NZB 流量的“终止开关”:

00001 allow ip from any to any via lo0
00010 allow ip from any to any via tun0
00101 allow ip from me to 192.168.1.0/24 uid transmission
00102 allow ip from 192.168.1.0/24 to me uid transmission
00103 deny ip from any to any uid transmission
00104 allow ip from me to 192.168.1.0/24 uid sabnzbd
00105 allow ip from 192.168.1.0/24 to me uid sabnzbd
00106 deny ip from any to any uid sabnzbd

这是我的 ifconfig:

em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=81049b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,VLAN_HWFILTER>
        ether xx:xx:xx:xx:xx:xx
        inet 192.168.1.250 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        inet6 fe80::xxxx:xxxx:xxxx:xxxx%tun0 prefixlen 64 scopeid 0x3
        inet xx.xxx.xx.xx --> xx.xxx.xx.xx netmask 0xffffffe0
        groups: tun
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        Opened by PID 4074

有什么办法可以做到这一点吗?或者我会被迫拥有一个单独的网络服务器?


我跟着克劳斯·安徒生的指示一步一步,但最终没有成功:

停止防火墙和 VPN。好的
确保您可以从本地主机的端口 8080 连接到您的网络服务器。成功的
然后从同一子网上的另一台机器。成功的
最后来自互联网。成功的  (通过验证https://validator.w3.org/

网络服务器如何绑定IP?
我可以通过本地地址(192.168.1.250:8080)在内部访问它,或者通过路由器的公共地址(64.67.136.70:8080)在外部和内部访问它。

下一步是启用防火墙。
我使用原始帖子中的设置启用了防火墙。所有连接仍然正常。

最后启用VPN。
我使用原始防火墙设置启用了它,除了外部公共地址(我仍然可以在内部连接)之外,所有连接都正常。现在我还可以通过我的 VPN 地址 (178.73.218.69:8080) 进行外部连接。

然后我添加了您建议的防火墙规则(“00100允许通过em0从任何到任何8080的tcp”)并重新启动防火墙。连接没有变化。

这是我的 ifconfig,没有任何修改:

em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=81049b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,VLAN_HWFILTER>
        ether 34:17:eb:d1:30:df
        inet 192.168.1.250 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        inet6 fe80::3617:ebff:fed1:30df%tun0 prefixlen 64 scopeid 0x3
        inet 178.73.218.69 --> 178.73.218.65 netmask 0xffffffe0
        groups: tun
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        Opened by PID 4056

这是使用 VPN 和最新防火墙的“netstat -4rn”的输出:

Destination        Gateway            Flags     Netif Expire
0.0.0.0/1          178.73.218.65      UGS        tun0
default            192.168.1.1        UGS         em0
127.0.0.1          link#2             UH          lo0
128.0.0.0/1        178.73.218.65      UGS        tun0
178.73.195.104/32  192.168.1.1        UGS         em0
178.73.218.64/27   178.73.218.65      UGS        tun0
178.73.218.65      link#3             UH         tun0
178.73.218.69      link#3             UHS         lo0
192.168.1.0/24     link#1             U           em0
192.168.1.250      link#1             UHS         lo0

任何进一步的建议将不胜感激。

答案1

是的——它可以工作。然而,您没有提供足够的信息来完全回答,并且您已经编辑了部分内容,这也会有所帮助。

太长了;博士简化并验证

您有一个“复杂”的网络设置。也就是说:您有一个公共网段,em0但您的 VPN 网段位于tun0。所有这些都是正常的,但您需要了解如何在这些之间进行路由。也许流量会在 上路由em0并在 上返回tun0。然后,来自 Internet 上的 http 客户端的流量可能会传递到您的服务器。但如果服务器通过tun0http 客户端路由所有返回流量,则永远不会得到任何回复。

要检查这一点,您需要查看并了解您的路由表。查看netstat -4rn

但即使从您提供的部分信息来看,我猜您应该查看 ipfw 设置。您显示的规则集可归结为:

Rule 1:       Allow everything on lo0
Rule 10:      Allow everything on tun0
Rule 101-103: Transmission related
Rule 104-106: sabnzbd related

那么我的问题是:如果您的 DD-WRT 路由将数据包从端口 8080 转发到端口 8080 上的服务器 - 您预计它们会发生什么?

您的防火墙中没有处理这种情况的规则。然后我希望防火墙丢弃该数据包。我pf自己使用,所以我不能 100% 确定ipfw使用情况,但它会是这样的:

00100 allow tcp from any to any 8080 in via em0

如果这有效,您可能会减少any to any到,any to me并且您可能会选择基于uid此进行操作。

但是你说当 openvpn 没有运行时它可以工作。这让我预计您的防火墙配置错误并允许所有流量,因为您没有单独的规则来允许端口 8080 的流量。

但是,是的——这样的设置是可以工作的。然而,还有很多活动部件。我会像这样调试它。

  1. 停止防火墙和 VPN。确保您可以从端口 8080 上的本地主机连接到您的网络服务器。然后从同一子网上的另一台计算机连接到您的网络服务器。最后来自互联网。这是确保网络服务器已配置并正常工作的第一步。您已经通过 VPN 进行了测试 - 因此配置很可能有效。但是网络服务器如何绑定IP呢?带“*”、“localhost”、本地地址或公共地址。

  2. 下一步是启用防火墙。启用防火墙后,您可以检查您的规则是否按预期工作。我认为你的案例的问题就出在这里。

  3. 最后启用VPN。这可能会带来有趣的路由问题。如果网络服务器无法访问,我们需要检查路由。这就是我们开始关注的地方netstart -4rn

因此,使用尽可能少的移动部件来充分测试每个步骤,然后一次推进一个步骤。

相关内容