如何通过 OpenVPN 访问单台本地机器?

如何通过 OpenVPN 访问单台本地机器?

这看起来像是一个微不足道的问题,但我还没有找到答案。

在我的局域网(图中蓝色部分)中,我有一个 NAS 和一个 Raspberry Pi,还有其他机器。我在 Raspberry Pi 中安装了一个 OpenVPN 服务器。我希望 OpenVPN 客户端能够访问 NAS,也就是 FTP、HTTP 等。客户端必须不能访问除 Raspberry 和 NAS 本身之外的任何机器。

在这张图片中你有我的网络拓扑:

网络拓扑

我可以将 OpenVPN 客户端连接到其服务器。我知道存在子网冲突,但我无法更改子网。

我的服务器配置:

port 1194
proto udp
dev tun

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/myserver.crt
key /etc/openvpn/easy-rsa/keys/myserver.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem

server 10.8.0.0 255.255.255.0
#push "route 192.168.1.0 255.255.255.0"

ifconfig-pool-persist /etc/openvpn/easy-rsa/ipp.txt

keepalive 10 120
cipher AES-128-CBC
persist-key
persist-tun

status /var/log/openvpn-status.log
#log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
verb 3

我的客户端配置文件:

client

remote x.y.z.t 1194
proto udp
dev tun

ca /etc/openvpnclient/ca.crt
cert /etc/openvpnclient/client.crt
key /etc/openvpnclient/client.key

cipher AES-128-CBC

#route-method exe
#route-delay 3
#route 10.8.0.0 255.255.255.0
###route-nopull
route 192.168.1.20 255.255.255.255

resolv-retry infinite
nobind
persist-key
persist-tun

mute 20
verb 3

我可以使用 Windows 客户端进行连接,但无法 ping 或访问 NAS。我确信我仍然遗漏了某些内容,但无法弄清楚如何路由流量。我已阅读了许多有关该主题的主题,但仍然没有运气。

如果需要,我应该能够在 OpenVPN 服务器网络上的路由器中添加路由规则。


更新时间:2019 年 11 月 18 日 @17.31 CET

我有两个主要要求:

  1. 我需要客户端访问 NAS,但不能访问 LAN 上的其他机器;
  2. 我需要客户端即使其子网与 NAS 子网(即 192.168.1.0/24)冲突也能够连接。

汤姆·严和本文帮助我解决了第一个问题。我相信第二个问题仍未解决。

问题 #1 的解决方案:

在服务器配置中,我需要添加(取消注释)此行,以确保将请求从 OpenVPN 客户端路由到 NAS:

push "route 192.168.1.0 255.255.255.0"

为了能够从 NAS 路由回 OpenVPN 客户端,我添加了此路由规则在 NAS 中

vi /etc/sysconfig/network-scripts/route-eth0

在该(空)配置文件中添加此行

10.8.0.0/24 via 192.168.1.88

service network restart确保静态路由被应用。

之后我限制了交通在 Raspberry Pi 中通过 iptables。我实际上永久安装了它iptables-persistent并遵循本指南

iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 192.168.1.20 -j ACCEPT


更新 #2

是的,我需要许多客户端能够连接,我想出于这个原因我应该避免 NAT 和伪装。

答案1

您需要为10.8.0.0/24(网关所在的位置192.168.1.88,即Rasp.PiOVPN 服务器)添加一条到NASROUTER(当然,在这种情况下假设ROUTER是的默认网关NAS)的路由,以便NAS/ROUTER知道将回复流量引导到哪里。

如果不能,您将需要使用/ SNAT(或者,当然)来执行,以便来自 VPN 客户端的所有流量看起来都来自服务器。MASQUERADEiptablesnftablesRasp.Pi

客户端不能能够访问除 Raspberry 和 NAS 本身之外的任何机器。

确保使用 限制转发流量iptables。一旦启用了 IP 转发Rasp.Pi(必须启用,否则 VPN 客户端将无法访问其 LAN),客户端可以添加他/她需要的任何路由以到达服务器 LAN 中的某个主机,因此,不推送某条路由并不能帮助您实现此目标。

更新:

要启用 IP 转发(并使设置在启动时持久):

sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

仅允许在这种情况下您需要的转发(eth0tun0假定):

iptables -F FORWARD
iptables -P FORWARD DROP
iptables -A FORWARD -m conntrack --ctstate NEW -i tun0 -s 10.8.0.0/24 -o eth0 -d 192.168.1.20 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

对通过 发出的流量执行源 NAT 转发(这样您就不必在NAS/上配置返回路由ROUTEReth0

iptables -t nat -F POSTROUTING

(如果您还需要链中的其他规则,请跳过上述内容)

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

或者,如果的 IPeth0在一段时间内持续存在/启动:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT 192.168.1.88

PS 如果您想刷新您接触过的桌子,您可以执行以下操作:

for i in $(cat /proc/net/ip_tables_names); do iptables-restore /usr/share/iptables/empty-"$i".rules; done

还要注意,iptables命令在启动时不是持久的,因此您需要将规则保存到文件中iptables-save(并通过某种方式配置您的系统以在启动时恢复它们)。

更新 2

您确实应该查看上面的内容,了解如何正确配置链FORWARD(在filter表中)。如果没有策略(或末尾的DROP“默认”规则),任何规则都是无用的。(而且一旦您修复了该部分,您的规则就不够了)DROPACCEPTDROP

为了避免子网(更准确地说是路由)冲突,最好推送主机路由(无论如何这都是您所需要的)而不是子网路由,因此您应该(实际上可以省略子网掩码)代替,因为客户端主机具有到 LAN 主机(默认网关除外)的主机路由的可能性要低得多(在 Linux 上,当为接口分配push "route 192.168.1.20 255.255.255.255"非地址时,始终会添加子网路由)。/32

您还可以例如push "route 10.8.1.1"DNAT目的地设置为192.168.1.20on Rasp.Pi,以应对客户端上已经存在路由的特殊情况192.168.1.20(您仍然可以使用 进行访问NAS10.8.1.1

iptables -t nat -A PREROUTING -d 10.8.1.1 -j DNAT --to-destination 192.168.1.20

相关内容