最近,我试图限制笔记本电脑上除 http、https、ssh 等协议工作所必需的端口之外的所有端口的传入流量。我使用 iptables 作为 netfilter 配置解决方案。但在输入此命令后
sudo iptables -A INPUT -p tcp -m tcp -m multiport ! --dports 80,443,53,21,22 -j DROP
限制对除以下端口之外的所有端口的访问:80、443、22、53(用于 DNS 工作)、21、22,我得到的 Mozilla Firefox 无法工作。请建议,我应该保留哪些其他端口以使 Firefox 和几个系统工具(dnf、snap、flatpak)正常工作?
答案1
您列出的端口是“众所周知的”目的地某些协议的端口,但这并不意味着它们被用作来源端口。源端口实际上是从随机范围并且经常用作回复的目标/传入端口。因此,为了通过您的方法实现您的目标,该范围内的端口应保持打开状态反而。而且,您的规则无论如何都只会阻止某些传入的 TCP 流量。
因此,要“无状态地”执行此操作(即,在这种情况下,纯粹基于端口):
iptables -A INPUT -p tcp ! --dport 32768:60999 -j DROP
iptables -A INPUT -p udp ! --dport 32768:60999 -j DROP
如上面的链接所述,可以使用以下方法检查实际范围:
cat /proc/sys/net/ipv4/ip_local_port_range
这可能是一种更令人放心的方法(但如果你不采用它,也许只是表面上如此)此外上述方法的另一个优点是,由于源端口实际上并不保证任何事情,因此该方法是根据源端口(通常是原始请求的目标端口)过滤传入的回复:
iptables -A INPUT -p tcp -m multiport ! --sports 80,443,53,22 -j DROP
iptables -A INPUT -p udp -m multiport ! --sports 53 -j DROP
但由于并非所有应用程序/协议都纯粹/完全以这种方式工作,因此您可能需要更多例外(例如 FTP?或甚至不再简单的 DNS)。
为了避免这些复杂情况,您可能需要采用有状态的方法:
iptables -A INPUT -m conntrack ! --ctstate RELATED,ESTABLISHED -j DROP
基本上,这意味着其他人发起的流量将被丢弃。
你可能还需要一些例外(针对环回接口和 ICMP)。请查看此维基页面了解更多详细信息和示例。(这顺便说一下,它可能足够好用。
答案2
假设您只想允许您请求的流量:
丢弃所有传入流量:iptables -I INPUT -j DROP
允许您从另一台设备连接的任何特定端口:iptables -I INPUT -p (proto) --dport=(port) -j ACCEPT
允许相关和已建立的流量:iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT