从 FreeBSD jail 中访问公共 IP 上的端口

Mar*_*chs 5 freebsd jails pf

在 FreeBSD 10 设置中,我有一个运行可公开访问的 nginx Web 服务器的监狱和另一个基于 Jetty 的 Java 后端服务器的监狱。每个 jail 都有自己的内部 IP 地址 127.0.1.x 连接到 lo1 环回接口。所有这些都配置为与 pf 防火墙一起运行,它将传入流量重定向到 nginx jail,然后从那里重定向到 Jetty jail。基本 pf 配置如下所示。

现在我想通过 https 从外部访问一个 Git 存储库。这已经设置并运行良好,但只能通过外部访问它。在 Jetty jail 中,无法进行连接。但是,我想通过公共 IP 地址从我的 Jetty 后端监狱访问 Git 存储库。

我尝试了类似以下行的内容来在 pf 中启用它,但没有成功:

rdr pass proto tcp from $ip_jetty to $ip_public port https -> $ip_nginx
Run Code Online (Sandbox Code Playgroud)

我的 pf 防火墙配置如下所示:

ip_public = "6.7.8.9"
if_external = "igb0"
net_jails = "127.0.1.0/24"
ip_nginx = "127.0.1.1"
ip_jetty = "127.0.1.10"

# Allow traffic from jails to outside world, enabled by network address translation
nat pass on $if_external from $net_jails to any -> $ip_public

# Redirect incoming web traffic to nginx jail
rdr pass on $if_external proto tcp from any to $ip_public port { http, https } -> $ip_nginx

# Allow outgoing connections
pass out all

# Allow nginx access to Jetty backend
pass in on lo1 proto tcp from $ip_nginx to $ip_jetty port 8080
Run Code Online (Sandbox Code Playgroud)

Mar*_*chs 1

为了回答我自己的问题,我使用以下防火墙配置让它工作:

# Allow dynaserv jail to access git on https port of web jail
pass in on lo1 proto tcp from $ip_jetty to $ip_nginx port https
Run Code Online (Sandbox Code Playgroud)

另外,在 Jetty Jail 的 /etc/hosts 文件中,我添加了 Nginx Jail 的内部 IP 地址:

127.0.1.1               git.mycompany.com
Run Code Online (Sandbox Code Playgroud)

这样,流量将通过内部 lo1 环回接口而不是外部网络设备进行路由。这并不完全是我在原来的帖子中想要的,但配​​置后也能很好地工作。

如果有人仍然知道如何按照预期方式(使用外部网络设备)解决问题,我仍然对答案感兴趣。