我想使用我的 Linux 工作站作为本地网络的 VPN 网关。同一工作站被用作 Web 服务器。当我将工作站连接到 VPN 时,无法再从外部网络访问此 Web 服务器。
我的设置如下:
ISP 路由器 - ip 192.168.0.1(默认网关,启用端口映射以使用非标准公共端口)
Linux 工作站 - 固定 IP 192.168.0.20(dhcp 服务器,因为我的路由器不允许更改网关地址、openvpn、apache、dns 服务器)
“ip route show” 的输出
0.0.0.0/1 via 10.8.3.1 dev tun0
default via 192.168.0.1 dev eth0 src 192.168.0.20 metric 202
10.8.3.0/24 dev tun0 proto kernel scope link src 10.8.3.12
37.120.143.221 via 192.168.0.1 dev eth0 (VPN external IP)
128.0.0.0/1 via 10.8.3.1 dev tun0
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.20 metric 202
配置如下:
net.ipv4.ip_forward = 1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p icmp -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun0 -j ACCEPT
-A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
我注意到的一件事是,当在工作站上启用 VPN 时,我的 ISP 路由器不会在已连接客户端列表中列出我的 Linux 工作站的正确本地 IP 地址。有时它是正确的,但有时它看起来只是一个随机 IP。
如果我添加以下路由:EXTERNAL_IP via 192.168.0.1 dev eth0(其中 EXTERNAL_IP 是 WAN ip),那么我可以访问本地网络上的 Web 服务器,但仍然不能从其他网络访问。
答案1
您的设置没有问题,错误在于您的路由。
如果你的服务器正常运行两个都作为网络服务器和作为远程服务器的 VPN 客户端,任何尝试访问 Web 服务器的用户都将收到来自远程 VPN 服务器的回复(不是直接从 Web 服务器获取,因为本地服务器的路由表指示它路由一切通过远程 OpenVPN 服务器。任何向站点 A 发送查询但收到来自 B 的回复的机器都会自动丢弃该回复,这是出于明显的安全原因。因此,Web 服务器变得无法访问。
有很多方法可以解决您的问题。我最喜欢的方法是保持 Web 服务器不变,将 OpenVPN 客户端移动到托管在同一台服务器上的 Linux 容器,然后将路由器配置更改为 DHCP/dnsmasq(无论什么)服务器,以通过 Linux 容器路由所有 LAN 通信。这比听起来容易得多。
另一种可能性是设置二路由表,将主路由表留给 OpenVPN 客户端,同时将第二个路由表设置为完全相同的VPN 处于连接状态时,不是激活,然后指示您的内核通过第二个路由表路由来自服务器(本身!)的所有流量。其余流量(源自您的 LAN 的流量,以及您希望通过 OpenVPN 路由的流量)将默认使用主路由表。
这也很容易做到,你可以找到这里一篇非常精彩、简短的 Linux 介绍政策(或者来源)路由。
或者,您可以决定将您的 Web 服务器托管在托管 OpenVPN 服务器的同一台机器上,这也可以解决您的问题。在这种情况下,最简单的方法是镜子远程服务器上的本地网站,以便您可以在本地进行任何更改。
选择权完全在你手中。