我有两台电脑;一台运行 gpsd,一台用来gpspipe -w 192.168.90.1
查询数据。
GPSD 监听端口 2947,我想用 iptables 阻止它。我尝试了很多规则,但仍然可以看到 gpspipe 的输出,这是我意想不到的。
我开始遵循的主要规则是
iptables -A OUTPUT -o usb0 -p tcp --dport 2947 -j DROP
iptables -A OUTPUT -o usb0 -p udp --dport 2947 -j DROP
iptables -A INPUT -i usb0 -p tcp --dport 2947 -j DROP
iptables -A INPUT -i usb0 -p udp --dport 2947 -j DROP
我也尝试过这个FORWARD
链,但没有成功。iptables 的手册页也很混乱。
我需要让端口 2947 上什么都不出去,但 iptables 似乎完全不擅长这个。我做错了什么吗?
答案1
我需要确保 2947 端口上没有任何输出,
首先,就防火墙规则而言,GPSD 不会“向外通信”,因为它不会发起连接——gpspipe 会。这很重要,因为 1) 数据包和连接具有一对端口号,即端口有方向;2)第一的数据包是最重要的,它是您开始编写规则的起点,在这种情况下,它是 GPSD 角度的“输入”数据包。
当阻止流量时,如果你在输入时丢弃了初始数据包,通常没有必要在输出时阻止进一步的数据包——它们甚至不会生成。(而如果你不阻止初始输入数据包,使用 TCP 可能会意外导致“SYN 洪水”,因为服务器最终会出现许多半建立的连接。)
最重要的是,GPSD 发出的回复数据包不会有--dport 2497
——那将是他们的来源端口,因此如果您进行无状态过滤,您的“OUTPUT”规则将会--sport
这样说。
而 iptables 似乎对此完全无能为力。我做错了什么吗?
iptables 规则是自上而下处理的,-A
命令在底部附加规则。在您的示例中,您只是在最后盲目地添加规则,而没有真正检查已经存在的其他规则——如果规则集在列表中更高位置有一个“允许”规则,那么即使您添加了 10 个相同的“拒绝”规则也没有关系,因为第一个匹配的规则会获胜。
(这是我的强烈猜测,因为每个典型的规则集都像这样工作:允许lo
环回通信,允许建立,允许 ICMP,允许需要的其他端口,放弃其他所有内容。)
运行iptables -S
检查您当前拥有的规则,或iptables -vnL
查看行号,以便您可以在所需的特定位置插入新规则(或者可能删除允许流量的现有规则;如果有“允许 X,拒绝全部”,则添加“拒绝 X”是没有意义的)。
-A
以及-I
(插入到顶部)都采用可选的行号来在之后/之前添加新规则。
另一种可能更好的方法是iptables-save > somefile
编辑文件 – 这样您就可以一次看到所有规则集 – 然后使用将其加载回来iptables-restore
。