如何在一个 iptables 命令行中添加多个 IP? sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4 -j DROP

如何在一个 iptables 命令行中添加多个 IP? sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4 -j DROP

更新:

我试过了sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4,11.22.33.44 -j DROP,没有用,而且出现了错误

iptables v1.8.2 (nf_tables): ! 不允许有多个源或目标 IP 地址


例如,我的目标是仅允许1.2.3.411.22.33.44连接我的服务器的 ssh(端口 22)。

与其他方法/命令相比,我更喜欢这种方法/命令。

sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4 -j DROP

但我不知道如何11.22.33.44在这个命令中添加另一个允许的 IP,

您能给我一点帮助或建议吗?

谢谢。

答案1

定义多种的仅使用地址 iptables! --source无法使用命令。

地址可以是网络名称、主机名(使用主机名可能不是一个好主意)、网络 IP 地址(带 /mask)或纯 IP 地址。掩码可以是网络掩码或纯数字。

您可以考虑将默认规则集从允许更改为删除。这将允许您仅根据应允许的内容进行定义,即类似于以下内容:

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
... your other rules goes here ...
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -s 1.2.3.4,11.22.33.44 -j ACCEPT
iptables -P INPUT DROP

优点/好处在于,这样的规则集将更加高效,因为考虑到了包的状态。此外,它允许所需的语法。此外,这也是定义防火墙规则的推荐方式。

但是,请记住,如果使用如上所示的语法:-s 1.2.3.4,11.22.33.44仍会创建 2 个单独的表条目,如您使用命令所见iptables -L INPUT。此外,它不适用于所有版本的 iptables。此外,我个人觉得它很难阅读或维护。这就是我尽量避免使用它的原因,而倾向于使用 2 个单独的命令。

如果你希望尽量减少规则数量,那么最接近的做法就是使用 iptables规则使用--match代替--source。但是,您仍然必须使用其他命令来定义匹配。另一条涉及 ipset 的评论已完美解释了其工作原理。

答案2

您可以使用IP设置

根据您的发行版,您可能需要ipset先安装该实用程序。

#(For Debian and Debian-derived distros)
sudo apt install ipset-persistent

然后创建一个具有友好名称的集合。

sudo ipset create ssh_friends iphash

一旦您拥有一套,您就可以向其中添加 IP。

sudo ipset add ssh_friends 1.2.3.4
sudo ipset add ssh_friends 11.22.33.44

现在,您可以在规则中使用创建的集合,iptables而不是单个 IP。

sudo iptables -A INPUT -p tcp --destination-port 22 -m set ! --match-set ssh_friends src -j DROP

相关内容