目前我正在尝试为一个特殊端口创建白名单 IP。背后的应用程序只是一个简单的 TeamSpeak3 服务器。
IP 白名单通过 HTTP 脚本获取访问者 IP。因此 IP 位于白名单内(目前效果很好)。
但是我如何允许这些 IP 使用端口“9987”,并阻止其他所有 IP?到目前为止,我已经尝试使用 iptables ACCEPT 来处理白名单中的特殊 IP,但效果不太好,因为我可以使用非白名单 IP 加入 Teamspeak?
你能抱怨其他灵魂吗?我很感激任何有用的建议!
编辑:当前脚本
# Create chain
iptables -N teamspeakCommunication
# Add ip
iptables -A teamspeakCommunication --src 127.0.0.1 -j ACCEPT
# Deny everything else
iptables -A teamspeakCommunication -j DROP
# Use this chain for port
iptables -I INPUT -m udp -p udp --dport 9987 -j teamspeakCommunication
iptables -I INPUT -m tcp -p tcp --dport 10011 -j teamspeakCommunication
iptables -I INPUT -m tcp -p tcp --dport 30033 -j teamspeakCommunication
另一项编辑:我试了一下,是的:每个包都在丢失。所以没有人可以连接到 TeamSpeak - 就像我想要的那样!问题是另一个链。所以我清除了它们。
但新的问题是:链/规则运行正常,所以我将自己的 IP 添加到链中,并尝试重新加载。但我无法连接。
我的添加IP的命令是:
iptables -A teamspeakCommunication --src 1.2.3.4 -j ACCEPT # 1.2.3.4 stands for my ip
并重新加载:
iptables-save > /etc/network/iptables.up.rules && iptables-apply -t 60
还
iptables-restore < /etc/network/iptables.up.rules
但重新加载并不关心新的 IP?我想,这只是一件简单的事情。
答案1
首先,最好养成只使用-A
来添加规则的习惯,而不是-I
让规则在链中的最终顺序与您在脚本中看到的顺序相同。
其次,除此之外,你的脚本看起来还不错。
也许使用了另一个端口,或者是 TCP 而不是 UDP。我更喜欢明确允许我需要的那些端口,并拒绝所有其他连接尝试(也许在开始时使用日志记录,这样我就可以查看尝试进入的内容):
iptables -A chainname -p tcp --dport 1234 -j ACCEPT
...
iptables -A chainname -j LOG -m limit --log-prefix "chainname drop: " --limit 4/minute --limit-burst 20
iptables -A chainname -j DROP
编辑:
teamspeakCommunication
您正在使用 向链中添加规则-A
,这通常是一个好主意,正如我上面提到的。但是,在这种情况下,它不是一次性填充链的脚本,而是逐步维护链。现在您正在附加-j ALLOW
规则后统一-j DROP
规则,因此未达到允许的程度。在这种情况下,我允许您添加这些规则-I
;-)
编辑2:
可以暂时将 IP 地址添加到链中,该 IP 地址在一段时间不活动后会自动删除:
iptables -N teamspeakCommunication
iptables -A teamspeakCommunication -m recent --update --name teamspeak --seconds 1800 -j ACCEPT
iptables -A teamspeakCommunication -j DROP
这会在 中设置一个recent
模块iptables
,用于匹配“最近看到的” IP 地址。您可以通过执行以下操作将 IP 地址添加到此模块:
echo "+127.0.0.1" > /proc/net/xt_recent/teamspeak
执行此操作后,只要在过去 1800 秒内(按照 的配置)看到来自该 IP 地址的流量,就会接受来自该 IP 地址的流量--seconds
。如果 1800 秒内没有看到任何流量,则该 IP 地址将从列表中删除并再次被阻止。
如果要在配置的秒数之前删除 IP 地址,请执行以下操作:
echo "-127.0.0.1" > /proc/net/xt_recent/teamspeak
您可以使用以下方式轻松查看列表
cat /proc/net/xt_recent/teamspeak
它显示了有关何时看到最后一个数据包等各种信息。
加载内核模块时,xt_recent
您可以传递每个列表要记住的 IP 数量,以及文件的默认所有者/组/权限/proc/net/xt_recent/*
;这些也可以使用常规chown
/chmod
命令进行操作。请参阅modinfo xt_recent
了解参数列表和名称。