![PF 规则和配置允许本地 IP 别名在 FreeBSD 上进行 NAT?](https://linux22.com/image/549848/PF%20%E8%A7%84%E5%88%99%E5%92%8C%E9%85%8D%E7%BD%AE%E5%85%81%E8%AE%B8%E6%9C%AC%E5%9C%B0%20IP%20%E5%88%AB%E5%90%8D%E5%9C%A8%20FreeBSD%20%E4%B8%8A%E8%BF%9B%E8%A1%8C%20NAT%EF%BC%9F.png)
以下是我的配置的具体细节:
防火墙/DNS 服务器:192.168.2.1 (本地 LAN),路由至互联网。<-- 不受我控制 我的 FreeBSD 服务器:192.168.2.23 (LAN)
在我的服务器“内部”,我有一个监狱。(一旦我的防火墙规则开始工作,我就会有更多的监狱。)我正在使用 ezjail 进行设置,而且大部分都运行正常。我想在我的 FreeBSD 服务器的环回设备 lo0 上为它分配一个别名,并给这个监狱分配 127.0.0.10 的 IP
到目前为止,在我的 /etc/pf.conf 中,以下内容正在运行:
# allow the outside world or internet to hit my FreeBSD server on 6500, and send this traffic to 6500
# verified through nc -l 6500 inside the jail, and telnet in from outside world
rdr pass on em0 inet proto tcp from any to 192.168.2.23 port = 6500 -> 127.0.0.10 port 6500
但是我还有两个需求:
1)监狱必须能够通过端口 5555 或 7070 或 TBD 向任何 INTERNET IP(不是 192.* 或 127.*)发送 TCP 流量 2)监狱必须能够仅通过 DNS 端口向 192.168.2.1 发送 TCP 流量(我必须将其用作 NS,因为主防火墙的设置方式不受我的控制,我无法更改这一点)
我不知道如何设置 pf 来执行此操作。任何帮助都将不胜感激。如果能提供确切的 pf.conf 行,我将不胜感激。我不是网络专家,我读过很多关于此的常见问题解答和手册页,但结果总是我要么遵循 pf >4.5 语法,要么完全搞不清楚他们在研究什么。我在这里列出的实际上是我的“防火墙”需要做的所有事情,所以做了这么多研究却只完成了 1/3,真是令人沮丧。这似乎是一个非常基本的用例
支持信息:
在 rc.conf 中我已经设置:
defaultrouter="192.168.2.1"
ifconfig_em0="inet 192.168.2.23 netmask 255.255.255.0"
ifconfig_lo0_alias0="inet 127.0.0.10 netmask 255.255.255.0"
pf_enable="YES"
gateway_enable="YES" # Enable as LAN gateway
我的 ifconfigs 给我:
server# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 00:0c:29:fc:6f:48
inet 192.168.2.23 netmask 0xffffff00 broadcast 192.168.2.255
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
inet 127.0.0.10 netmask 0xffffff00
nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
jail# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 00:0c:29:fc:6f:48
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet 127.0.0.10 netmask 0xffffff00
答案1
我对 PF 有点生疏,但你在寻找类似的东西吗?
在 [interface] 上匹配从 192.168.2.23 到任何 nat-to [ip]
将 [接口] 从 192.168.2.23 传递到 !192.168.0.0/24 端口 {7070 5555}
将[接口]从192.168.2.23传递到168.2.23.1端口域
我一直认为openBSD PF 文档和这个地点方便……
编辑:
在 [接口] 上匹配从 127.0.0.10 到任何 nat-to [ip]
通过 [接口] 从 127.0.0.10 快速传递到 192.168.2.1 域
将 [接口] 从 127.0.0.10 传递到 {!192.168.2.0/24}
根据您留下的评论,我相信这就是您正在寻找的内容。
答案2
allowed_bounce_ports="{ 21, 23 }"
nat on em0 from 127.0.0.10 to 192.168.2.1 port = domain -> em0
nat on em0 from 127.0.0.10 to !192.168.0.0/24 port $allowed_bounce_ports -> em0
rdr pass on em0 inet proto tcp from any to 192.168.2.23 port = 6500 -> 127.0.0.10 port 6500
感谢 freenode #freebsd 上的 jhell(也感谢我,终于弄清楚了大部分内容)