在 FreeBSD 10 设置中,我有一个监狱运行可公开访问的 nginx Web 服务器,另一个监狱运行基于 Jetty 的 Java 后端服务器。每个监狱都有自己的内部 IP 地址 127.0.1.x,连接到 lo1 环回接口。所有这些都配置为与 pf 防火墙一起运行,它将传入流量重定向到 nginx 监狱,然后从那里重定向到 Jetty 监狱。基本 pf 配置如下所示。
现在我想要一个可以通过 https 从外部访问的 Git 存储库。这已经设置好并且运行良好,但只能通过外部访问它。从 Jetty 监狱无法进行连接。但是,我想通过公共 IP 地址从我的 Jetty 后端监狱访问 Git 存储库。
我尝试了类似以下行的操作来在 pf 中启用此功能,但没有成功:
rdr pass proto tcp from $ip_jetty to $ip_public port https -> $ip_nginx
我的 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
答案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
另外,在 Jetty Jail 的 /etc/hosts 文件中,我添加了 Nginx Jail 的内部 IP 地址:
127.0.1.1 git.mycompany.com
这样,流量将通过内部 lo1 环回接口而不是外部网络设备进行路由。这并不完全是我在原来的帖子中想要的,但配置后也能很好地工作。
如果有人仍然知道如何按照预期方式(使用外部网络设备)解决问题,我仍然对答案感兴趣。
答案2
我知道自从有人问这个问题以来已经有一段时间了,但这里是:
您在 OP 中描述的内容被称为“发夹 NAT”。然而,您不想在网关上添加不必要的负载,而是让 PF 处理所有转换。我相信您寻求的答案已列在此处最佳答案的第一条评论中: https://serverfault.com/questions/55611/loopback-to-forwarded-public-ip-address-from-local-network-hairpin-nat。
基本上,PF 不会开箱即用地执行此操作,但您可以按如下方式执行此操作(其中,我相信 $hairpin_int 是一个新的 vNIC。您的 /etc/rc.conf 中将包含类似 cloned_interfaces="lo1 的内容马力1”):
no nat on $int_if proto tcp from $int_if to $int_net
nat on $int_if proto tcp from $int_net to $hairpin_int port $hairpin_ports -> $int_if
rdr on $int_if proto tcp from $int_net to $ext_if port $hairpin_ports -> $hairpin_int