这是我们的网络:
- 我们有许多在家办公的客户,他们的 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 地址,您也需要注意这一点。