我正在尝试建立一个监狱,作为一些外部客户端的默认网关。
我有一个 VIMAGE jail,它在我的本地网络中有一个专用 IP 地址,我想用它作为客户端的网关。我这样做的原因(如果重要的话)是我想在该 jail 内运行 OpenVPN,这样所有使用该 jail 的 IP 作为网关的客户端都可以透明地通过 VPN。
当我 ssh 进入 jail 时,一切都正常:我可以看到互联网,即使我打开 OpenVPN,它也能正常工作。但是,它不能作为我的客户端的默认网关:名称无法解析,“没有到主机的路由”,等等。
当我跑进tcpdump
监狱时,我看到了以下情况:
20:53:23.263597 IP 192.168.1.6.54460 > syd15s01-in-f78.1e100.net.https: UDP, length 109
20:53:23.263636 IP 192.168.1.6.54460 > syd15s01-in-f78.1e100.net.https: UDP, length 109
客户端的 IP 在哪里192.168.1.6
,所以我假设客户端尝试通过监狱访问互联网,但没有返回任何信息。我有时ICMP
也看到一些流量。
我的ipfw
配置是:
# less /usr/local/etc/ipfw.rules
#!/bin/sh
EPAIR=$(/sbin/ifconfig -l | tr " " "\n" | /usr/bin/grep epair)
INNER="$(/sbin/ifconfig | grep " -->" | cut -d' ' -f2 | cut -d'.' -f1-3).0/24"
ipfw -q -f flush
ipfw -q nat 1 config if ${EPAIR}
ipfw -q add nat 1 all from ${INNER} to any via ${EPAIR}
ipfw -q add nat 1 all from any to any in via ${EPAIR}
# ipfw add check-state
TUN=$(/sbin/ifconfig -l | tr " " "\n" | /usr/bin/grep tun)
ifconfig ${TUN} name tun0
我认为某些地方缺少一些 NAT,但我不太明白发生了什么,因此如果能提供任何帮助我将不胜感激。
当我的客户使用 jail 的 IP 作为默认网关时,我该怎么做才能允许他们的流量通过 jail/vpn?
答案1
FreeBSD jail 基本上是一种轻量级虚拟化,因此它的最佳用途是将一些应用程序作为容器运行。它当然有一个网络堆栈,但是,将其功能与主机系统的功能进行比较,我认为它相当有限。
因此,选择 jail 作为容器路由器似乎是一个糟糕的选择。您应该做的是使用多个 FIB。顺便说一下,同样的方法适用于所有现代网络操作系统 - Linux、JunOS、Cisco IOS 等。
我建议将其添加net.fibs="4"
到/boot/loader.conf
,然后重新启动并使用多个路由表。这样,您可以在单独的 FIB(如)中启动 OpenVPN 网关setfib 1 /usr/local/bin ... whatever
,然后使用 ipfw 将客户端流量分配给它setfib
,或者直接将客户端接口分配给此 FIB。