hpy*_*hpy 22 ssh firewall iptables
如何在 LAN 中的系统上设置防火墙,以便某些端口仅对来自局域网的连接开放,而不对来自外部世界的连接开放?
例如,我有一个运行Scientific Linux 6.1(基于 RHEL 的发行版)的机器,我希望它的 SSH 服务器只接受来自本地主机或 LAN 的连接。我该怎么做呢?
War*_*ung 26
内核的iptables完全为空 ( iptables -F
),这将按照您的要求执行:
# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP
Run Code Online (Sandbox Code Playgroud)
这表示允许所有 LAN 地址与 TCP 端口 22 通信,本地主机得到相同的考虑(是的,127.* 不仅仅是 127.0.0.1),并且来自不匹配前两个规则的所有其他地址的数据包被毫不客气地丢弃到该位桶。如果您想要主动拒绝 (TCP RST),您可以使用REJECT
代替,DROP
而不是让 TCP 端口 22 成为数据包的黑洞。
如果你的局域网不使用 192.168.0.* 块,你自然需要更改第一行的 IP 和掩码以匹配你局域网的 IP 方案。
如果您的防火墙已经配置了一些规则,这些命令可能不会执行您想要的操作。(iptables -L
以 root 身份进行查找。)经常发生的情况是,现有规则之一会抓取您要过滤的数据包,因此附加新规则无效。虽然你可以使用-I
,而不是-A
用iptables
命令拼接新规则成一条链,而不是附加它们的中间,通常最好找出链条是如何被填充在系统启动和修改过程,以便您的新规则总是得到安装在正确的顺序。
在最近的 RHEL 类型系统上,最好的方法是使用firewall-cmd
或等效的 GUI。这会告诉操作系统的firewalld
守护程序您想要什么,也就是实际填充和操作您通过iptables -L
.
在较旧的 RHEL 类型系统上,订购时修改防火墙链的最简单方法是编辑/etc/sysconfig/iptables
. 操作系统的 GUI 和 TUI 防火墙工具相当简单,所以一旦你开始添加更复杂的规则,最好回到旧的配置文件。请注意,一旦您开始这样做,如果您曾经使用操作系统的防火墙工具修改配置,您就有可能丢失更改,因为它可能不知道如何处理这些手工制作的规则。
将这样的内容添加到该文件中:
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP
Run Code Online (Sandbox Code Playgroud)
添加它的地方很棘手。如果您在该文件中找到一行谈论--dport 22
,只需将其替换为上面的三行。否则,它可能应该在第一个以-j ACCEPT
. 通常,您需要对iptables 的工作方式有所了解,此时正确的插入点将显而易见。
保存该文件,然后说service iptables restart
要重新加载防火墙规则。请务必在登录控制台时执行此操作,以防您对编辑操作不当!您不想在通过 SSH 登录时将自己锁定在机器之外。
与上述命令的相似性并非巧合。这个文件的大部分由iptables
命令的参数组成。与上述不同的是,iptables
命令被删除,INPUT
链名变成了特殊的 RHEL 特定RH-Firewall-1-INPUT
链。(如果您想更详细地检查文件,您会在文件的前面看到他们基本上重命名了INPUT
链。为什么?不能说。)
Linux 下防火墙设置的低级工具是iptables。还有更高级别的工具可用。不知道 Scientific Linux 有没有推荐的防火墙工具。
根据这个网页(我还没有验证它是否适用于6.1),service iptables save
将保存当前的防火墙规则,这些保存的规则在启动时加载。所以你需要通过iptables
命令(或任何其他方式)设置你想要的规则,然后运行service iptables save
以使你的设置持久化。
Scott Pack 的博客文章是丢弃通常不需要的“奇怪”数据包的开端,这些数据包很有可能成为攻击的一部分。除此之外,您需要关闭所有传入端口,并仅打开您需要的端口。像这样的东西:
# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT
Run Code Online (Sandbox Code Playgroud)