OpenVPN:似乎无法通过 VLAN 路由额外的流量

OpenVPN:似乎无法通过 VLAN 路由额外的流量

这是我们的网络:

  • 我们有许多在家办公的客户,他们的 IP 地址是动态的,因此不可能为他们创建防火墙规则
  • 我们在同一个托管服务提供商处拥有多台服务器
  • 该托管服务提供商提供 VLAN 功能,以便服务器可以在内部相互访问
  • 我们还有一个不同的VPN 确实可以实现这一目标,但使用带有专有前端的 OpenVPN,因此我无法轻松地逆向分析它是如何实现的

在此示例中,我们有:

  • el-1,它运行一个 OpenVPN 服务器,提供网络10.26/24(并充当 的网关10.26.0.1)。在 VLAN 中,它还具有地址192.168.50.51
  • master,防火墙更加严密。在 VLAN 中,它有192.168.50.41

我已经完成了 OpenVPN 服务器的设置,并且这些客户端可以连接并访问el-1其自身(否则将被防火墙阻断)的端口。现在我希望这些客户端也能以某种方式master通过同一个 VPN 进行访问,可能使用 VLAN。

如果我通过 RDP 进入el-1,我可以使用 的 VLAN 地址192.168.50.41访问 上master不公开的端口。因此 VLAN似乎可以工作,并且防火墙没有在那个阶段似乎是一个问题。

只是为了这个目的,客户端配置:

client

dev tun

proto udp
remote (the server) 11194

resolv-retry infinite

nobind

persist-key
persist-tun

ca ca.crt
cert someUsername.crt
key someUsername.key

ns-cert-type server

cipher AES-256-CBC

comp-lzo

verb 3

以前的服务器配置如下:

local 0.0.0.0

#we use a non-default port 11194
port 11194

proto udp

dev tun

client-config-dir ccd
ccd-exclusive

ca ..//easy-rsa//keys//ca.crt
cert ..//easy-rsa//keys//server.crt
key ..//easy-rsa//keys//server.key
dh ..//easy-rsa//keys//dh2048.pem

server 10.26.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

keepalive 10 60

cipher AES-256-CBC

comp-lzo

max-clients 20

persist-key
persist-tun

status ..//log//openvpn-status.log
verb 3

(我知道comp-lzo并且ns-cert-type已被弃用;那是另一回事。)

然后,我从文档中基本看出,这种server简写可能无法实现这种更复杂的场景?所以我把它分解如下:

local 0.0.0.0

#we use a non-default port 11194
port 11194

proto udp

dev tun

client-config-dir ccd
ccd-exclusive

ca ..//easy-rsa//keys//ca.crt
cert ..//easy-rsa//keys//server.crt
key ..//easy-rsa//keys//server.key
dh ..//easy-rsa//keys//dh2048.pem

mode server
tls-server

ifconfig-pool-persist ipp.txt

keepalive 10 60

cipher AES-256-CBC

comp-lzo

max-clients 20

persist-key
persist-tun

status ..//log//openvpn-status.log
verb 3

# formerly the server directive
topology subnet
push "topology subnet"
ifconfig 10.26.0.1 255.255.255.0
ifconfig-pool 10.26.0.2 10.26.0.253
push "route-gateway 10.26.0.1"

思考这应该大致相当,只是现在的拓扑结构是subnet,而以前是net30)。然后我添加了以下内容:

# VLAN
push "route 192.168.50.0 255.255.255.0 10.26.0.1 1"

结果看起来就在客户端上!从客户端 OpenVPN 日志来看:

2020-04-02 10:39:27.067370 MANAGEMENT: >STATE:1585816767,ASSIGN_IP,,10.26.0.16,,,,
2020-04-02 10:39:27.067396 /sbin/ifconfig utun7 delete
                           ifconfig: ioctl (SIOCDIFADDR): Can't assign requested address
2020-04-02 10:39:27.072671 NOTE: Tried to delete pre-existing tun/tap instance -- No Problem if failure
2020-04-02 10:39:27.072721 /sbin/ifconfig utun7 10.26.0.16 10.26.0.16 netmask 255.255.255.0 mtu 1500 up
2020-04-02 10:39:27.076570 /sbin/route add -net 10.26.0.0 10.26.0.16 255.255.255.0
                           add net 10.26.0.0: gateway 10.26.0.16
2020-04-02 10:39:27.082300 MANAGEMENT: >STATE:1585816767,ADD_ROUTES,,,,,,
2020-04-02 10:39:27.082345 /sbin/route add -net 192.168.50.0 10.26.0.1 255.255.255.0
                           add net 192.168.50.0: gateway 10.26.0.1

路线如下:

~> netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags        Netif Expire
default            192.168.2.234      UGSc           en0       
10.26/24           10.26.0.16         UGSc         utun7       
10.26.0.16         10.26.0.16         UH           utun7       
127                127.0.0.1          UCS            lo0       
127.0.0.1          127.0.0.1          UH             lo0       
169.254            link#4             UCS            en0      !
[..]
192.168.50         10.26.0.1          UGSc         utun7       
224.0.0/4          link#4             UmCS           en0      !
224.0.0.251        1:0:5e:0:0:fb      UHmLWI         en0       
255.255.255.255/32 link#4             UCS            en0      !

这看起来完全正确,对吧?我现在应该能够访问192.168.50.41 通过VPN 位于10.26.0.1(开启utun7)。

但它被过滤了。我暂时禁用了两台服务器上的防火墙(这不应该是原因);但它仍然被过滤了。

所以,

  • 我如何验证是否使用了正确的路线?traceroute卡住了:

    ~> traceroute -n 192.168.50.41
    traceroute to 192.168.50.41 (192.168.50.41), 64 hops max, 52 byte packets
     1  * * *
     2  * * *
     3  * * *
  • 我的配置基本正确吗?我需要桥接吗?我是否遗漏了一些最基本的东西?

答案1

一些提示:route -n将返回类似的输出netstat -nr,但将显示路线优先级(度量)。

10.26/24 是否意味着 10.26.0.0/24 ?那么它似乎与 10.26.0.16 重叠,并且存在一些路由重复。

问题:

如何验证是否使用了正确的路由?traceroute 卡住了:

使用 ip route 命令获取给定 IP 地址的路由,例如:

ip route get 192.168.50.41

仅这一点就足以对您的调试提供很大帮助。

我会仔细检查 OpenVPN 配置文件,我不认为你真的需要这个:

ifconfig 10.26.0.1 255.255.255.0

如果您的服务器确实是 10.26.0.1,客户端应该会处理这个问题并动态添加路由。但也许我遗漏了什么,我现在无法 100% 地描绘出您的网络设置。

route -n我建议您收集客户端上的输出运行 OpenVPN,并比较结果,以便您可以看到从配置指令中添加了哪些路由。

(免责声明:接下来的部分是推测性的,我邀请您仔细检查并研究这个想法)

假设客户端和服务器之间的 VPN 链接有效并且iptables您的服务器上有该链接,则可能需要添加一条规则,以便客户端能够访问您的本地范围 192.168.*

为了让您了解,这里是我曾经在 Raspberry PI 上进行的配置,用于在接口 eth0 和 wlan0 之间转发流量:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

因此,这种类型的规则也许可以完成这项工作,并允许 VPN 客户端透明地访问私有范围 192.168.*。您必须根据您的网络配置设计确切的规则,但我不知道从安全角度来看这是否是最佳的,您的 VLAN 是如何设置的等等。我缺乏一些洞察力,我也不是 iptables 专家。

希望有经验的人可以参与进来。实现这一目标的方法肯定不止一种。

我假设你的服务器已经启用了 IP 转发,例如:

echo 1 > /proc/sys/net/ipv4/ip_forward

请注意,我们在这里仅讨论 IPv4,但如果您的服务器支持 IPv6 且配置了 IPv6 地址,您也需要注意这一点。

相关内容