将某些防火墙端口设置为仅接受本地网络连接?


18

如何在局域网中的系统上设置防火墙,以使某些端口仅开放给来自局域网的连接,而不开放给来自外部世界的连接?

例如,我有一台运行Scientific Linux 6.1(基于RHEL的发行版)的机器,我希望其SSH服务器仅接受来自本地主机或LAN的连接。我该怎么做呢?

Answers:


24

在内核的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

这表示所有LAN地址都允许与TCP端口22通讯,本地主机具有相同的考虑(是的,127. *不仅是127.0.0.1),并且来自其他每个不匹配前两个规则的地址的数据包都会毫不客气地丢弃到该位桶。如果要主动拒绝(TCP RST)REJECTDROP则可以使用代替,而不是使TCP端口22成为数据包的黑洞。

如果您的局域网不使用192.168.0。*块,您自然会需要更改第一行的IP和掩码以匹配您局域网的IP方案。

如果您的防火墙已经配置了一些规则,这些命令可能不会执行您想要的操作。(iptables -L以root用户身份进行查找。)经常发生的情况是,现有规则之一抢占了您要过滤的数据包,因此附加新规则无效。虽然您可以使用-I而不是-A使用iptables命令将新规则拼接到链的中间而不是附加它们,但是通常最好找出系统启动时如何填充链并修改该过程,以便始终在新链中安装新规则。正确的顺序。

RHEL 7+

在最新的RHEL类型系统上,最好的方法是使用firewall-cmd或其等效的GUI。这告诉操作系统的firewalld守护程序您想要什么,这实际上是填充和操作您通过看到的内容iptables -L

RHEL 6及更早版本

在较旧的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

添加的地方比较棘手。如果您在该文件中找到谈论的行--dport 22,只需将其替换为上面的三行。否则,它可能应该出现在以结尾的第一条现有行之前-j ACCEPT。通常,您需要对iptables的工作方式有所了解,此时正确的插入点将很明显。

保存该文件,然后说service iptables restart重新加载防火墙规则。确保登录控制台时执行此操作,以防您费力编辑!通过SSH登录时,您不想将自己锁定在计算机之外。

与以上命令的相似之处并非巧合。该文件的大部分由iptables命令的参数组成。与上述内容的不同之处在于,iptables删除了该命令,并且INPUT链名称变成了特定于RHEL的特殊RH-Firewall-1-INPUT链。(如果您想更详细地检查文件,您会在文件中更早地看到他们实际上已重命名了INPUT链。为什么?不能说。)


4

iptables是Linux下用于防火墙设置的低级工具。也有更高级别的工具可用。我不知道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

1
吉尔,你不是有点误解了这个问题吗?我知道,“科学Linux”盒是LAN上的计算机之一,但不是防火墙。
rozcietrzewiacz 2011年

@Gilles是的,此盒子是局域网上的计算机之一。
2011年

@rozcietrzewiacz我知道防火墙与服务器在同一台计算机上。我同意这个问题在某种程度上是模棱两可的,但是由于penyuan只提到了一台机器的OS,所以我认为一切都在该机器上发生。否则,这将不是unix问题,这将是一个未指定的网络管理员问题。
吉尔(Gilles)'所以

1

首选的方法是使用iptables。看来其他人已经充分了解了这一点,因此,为了完整起见,我将指出另一种访问控制方法,该方法可用于大多数Linux发行版中的许多守护程序。该访问控制方法由libwrap库提供。

要检查您喜欢的守护程序是否受libwrap支持,请尝试运行以下命令:

ldd `which sshd` | grep libwrap

如果得到非空结果,例如

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

那你肯定很好。

几乎可以肯定,您的sshd守护程序确实有libwrap支持,因此它应该查阅/etc/hosts.allow/etc/hosts.deny文件以进行访问控制。假设您的本地LAN网络为192.168.100.0/24,则可以通过将以下内容放入文件中来拒绝本地主机或本地LAN上的sshd所有客户端以外的所有客户端的访问/etc/hosts.deny

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

请注意,此方法本身实际上并不打开或关闭端口。它只是告诉使用此访问控制方法的守护程序是接受还是拒绝来自与给定模式匹配的客户端的连接尝试。

有关完整的详细信息,请查看以开头的手册页hosts_access(5)


1

如果您有自己的基于Linux的防火墙,则最好进行设置iptables,如其他人在此处所述。如果没有,并且防火墙是您的路由器,那么除非您明确启用端口转发(如我最近在回答该问题中所述),否则默认配置很可能已经阻止了外部访问。

为了获得更高的安全性,可以将单独的子网用于局域网内连接。为此,为每台计算机添加第二个IP地址,该地址只能在LAN中使用,而不能由路由器使用。假设整个LAN现在都在使用192.168.0.xxx地址,而路由器(网关,防火墙)在使用地址192.168.0.1。因此,为每台计算机添加第二个地址-例如:

ifconfig eth0:0 192.168.5.1/24

接下来,编辑sshd配置以仅使用该地址(这样就不允许出现连接192.168.0.xxx)-编辑/etc/ssh/sshd_config并修改ListenAddress为新子网之一(192.168.5.1在上面的示例中)。而已!如果未将网关配置为路由该子网的通信,则应将其与外部隔离。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.