更新:
我试过了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.4
并11.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