我有两台电脑;一台运行 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 似乎对此完全无能为力。难道我做错了什么?
首先,就防火墙规则而言,GPSD 不会“向外通信”,因为它不会发起连接,而 gpspipe 则会发起连接。这很重要,因为 1) 数据包和连接有一对端口号,即端口有方向;2)第一个数据包最重要,它是您开始编写规则的地方,在本例中,从 GPSD 的角度来看,它是一个“INPUT”数据包。
阻止流量时,如果丢弃输入上的初始数据包,则通常没有必要阻止输出上的其他数据包 - 它们甚至不会生成。(然而,如果您不阻止初始输入数据包,则使用 TCP 可能会意外导致“SYN 洪水”,因为服务器最终会出现许多半建立的连接。)
最重要的是,GPSD 发出的回复数据包不会有
--dport 2497
- 这将是它们的源端口,因此如果您进行无状态过滤,您的“输出”规则会--sport
改为显示。iptables 规则是自上而下处理的,该
-A
命令在底部附加规则。在您的示例中,您只是盲目地在末尾添加规则,而没有实际检查已经存在的其他规则 - 如果规则集具有更高的“允许”规则,则添加 10 个相同的“拒绝”并不重要在列表中,第一个匹配的规则获胜。(这是我强烈的猜测,因为每个典型的规则集都是这样工作的:允许
lo
环回通信,允许建立,允许 ICMP,允许所需的其他端口,丢弃其他所有内容。)运行
iptables -S
以检查您当前拥有的规则,或iptables -vnL
查看行号,以便您可以在所需的特定位置插入新规则(或者删除允许流量的现有规则;如果你有“允许X,拒绝所有”)。-A
以及-I
(在顶部插入)都采用可选行号来在之后/之前添加新规则。另一种可能更好的方法是
iptables-save > somefile
编辑文件 - 您可以通过这种方式立即看到所有规则集 - 然后使用 加载它iptables-restore
。