我正在尝试使用 Shorewall 的REDIRECT
操作来拦截发往防火墙端口 514(TCP 和 UDP)到端口 5000(也是 TCP 和 UDP)的流量,同时也允许流量直接流向后者端口。(原因并不重要,但简而言之,我们以非特权用户身份运行日志聚合器,但守护进程不支持放弃 root 权限,因此它无法侦听特权端口;同时,我们有许多不允许发送到备用端口的旧系统日志实现。)
除了防火墙本身之外,还定义了 3 个区域:loc(10.0.0.0/8)、dmz(172.16.0.0/16)和 net(其他所有区域);后者主要用于拒绝/丢弃来自“不受信任”网络的所有内容。
相关规则如下:
#ACTION SOURCE DEST PROTO DEST
# PORT
SECTION NEW
REDIRECT:info loc 5000 tcp,udp 514
REDIRECT:info dmz 5000 tcp,udp 514
ACCEPT:info loc $FW tcp,udp 5000
ACCEPT:info dmz $FW tcp,udp 5000
到目前为止一切顺利。(还有其他规则,例如允许 SSH 和 HTTP 连接,但这些规则仅与端口 514 或 5000 相关。)默认策略适用REJECT
于 loc 和 dmz,以及DROP
net。
问题是,我有很多主机被拒绝的情况,而同一网络中的相邻主机则被重定向和接受。例如,172.16.0.194 正在尽可能快地将消息塞入我们的聚合器,但 172.16.0.166 的每个数据包都被拒绝。同样,10.140.88.150 被接受,而 10.192.253.4 被拒绝。以下是后一对主机的示例系统日志消息:
Shorewall:loc_dnat:REDIRECT:IN=eth0 OUT= MAC=/*anon*/:08:00 SRC=10.140.88.150 DST=10.1.25.14 LEN=134 TOS=0x00 PREC=0x00 TTL=253 ID=9092 PROTO=UDP SPT=62162 DPT=514 LEN=114
Shorewall:loc2fw:REJECT:IN=eth0 OUT= MAC=/*anon*/:08:00 SRC=10.192.253.4 DST=10.1.25.14 LEN=164 TOS=0x00 PREC=0x00 TTL=254 ID=58464 PROTO=UDP SPT=514 DPT=514 LEN=144
REDIRECT
我发现有趣的是,尽管成功发送了成千上万条消息的主机,但在我的日志中成功发送的实例却很少(例如,该主机只有 1 个),而似乎有一个REJECT
拒绝的主机发送的每条消息似乎都有一行。同样有趣的是,对于现在被拒绝的许多主机,它们被重定向和接受,直到我们尝试添加新规则时防火墙重新启动(该规则已被删除,但我们仍然遇到相同的问题)。所有当前消息都通过 UDP 传入,但规则需要适用于两种协议。
(同样有趣的是,使用tcpdump
,我可以看到 ICMP“端口不可达”响应被发送给一些被拒绝的主机,但没有发送给其他主机。我不知道那意味着什么。)
ESTABLISHED
我的理论是,由于某种原因,iptables 将来自被拒绝主机的消息视为或连接的一部分RELATED
,因此不会与 中的任何内容匹配SECTION NEW
;但是,这是唯一可以放置REDIRECT
或DNAT
规则的部分,所以如果这是问题所在,我不知道如何解决它。(我也不知道如何证实或反驳这个理论。)
我尝试过使用DNAT
(列$FW::5000
中有DEST
)代替REDIRECT
,但结果相同。我还尝试过ACCEPT
为端口 514 添加规则,但这对谁被规则选中或未被选中没有影响REDIRECT
。
我需要如何配置 Shorewall 以便正确地将所有连接从指定网络(区域)重定向到给定端口,而不仅仅是其中看似随机的主机?