如何拒绝某个 IP 地址连接到我的系统?

如何拒绝某个 IP 地址连接到我的系统?

有没有办法拒绝某个 IP 地址连接到我的电脑?

有没有办法拒绝某个 IP 连接到特定端口?

答案1

您也可以使用ufw,在我看来,它更简单。

拒绝来自任何连接使用:

sudo ufw deny from <ip_address> to any  

或者拒绝访问特定端口:

sudo ufw deny from <ip_address> to any port <some_port>  

或者您可以指定协议:

sudo ufw deny proto tcp from <ip_address> to any port <some_port>  

(根据您想要的协议替换tcptcp或)udp

答案2

在我们继续之前,让我们先记下几件事。

  1. 互联网的大部分地区没有静态 IP 地址。因此,可以使用代理、Tor 等尝试绕过单 IP 阻止。
  2. 通常,采取相反的做法会更安全,即阻止某个端口上的所有流量,并仅接受某些地址。这在大多数面向 Web 的情况下是不可行的,但它仍然是一种普遍接受的安全做法。
  3. 我们一般不会在互联网上进行任何过滤 - 我们不考虑下面答案中的第 1 点,并且您必须考虑到如果您阻止一个 IP,他们会找到绕过它的方法并访问不同的 IP,然后继续攻击的可能性。

在有人评论说这ufw比这简单之前iptables,我iptables在这里使用是因为 OP 使用iptables命令回答了这个问题,这让我认为他们想要一个有iptables命令而不是ufw命令/的答案


良好的iptables防火墙配置将拒绝除系统在“可接受连接”方面所需的最低要求之外的所有内容,并且只接受规则中明确允许的连接。

为此,我们必须配置iptables ip6tables默认阻止流量,但从计算机内部发起的流量除外(例如,如果您在系统上,则来自 Firefox 等的网络流量,或wget下载软件的流,或允许apt更新软件包)。我们还必须允许您为您希望到达系统的流量添加可接受的规则。

为了使这些规则持久化,使它们在每次重启时始终有效,您应该安装该iptables-persistent软件包,这将允许您保存这些规则,然后在系统启动时自动加载它们。sudo apt-get install iptables-persistent先运行,然后添加您的规则。 我们将确保在创建规则集后更新启动时加载的规则集。

假设我们从空白iptablesip6tables设置开始(这是 Ubuntu 中的默认设置),您需要添加一堆规则。我将从开始iptables,然后我们将使用ip6tables


iptables

以下是一组基本规则,它将限制试图到达您的系统的所有数据和数据包,无论您使用什么连接:

接受本地主机数据
iptables -A INPUT -i lo -j ACCEPT- 接受 LocalHost 上的所有流量,即仅限计算机内部的本地流量。这对于您的计算机正常运行是必要的。

接受与系统发起的出站连接相关的数据
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT- 接受与出站方向连接相关的所有流量,包括来自远程服务器的响应(例如 apt 镜像或您正在访问的任何网站)。

ICMP 规则
请注意,我不会过滤掉 ICMP 数据包,因为除非您过于偏执,否则通常可以接受这些数据包。如果您确实想阻止 ICMP,则需要使用这些规则来接受一些关键数据包:

接受“超出时间”ICMP
iptables -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT- 接受“超出时间”数据包,这对于某些时间限制的连接设置是必要的。

接受“目标不可达”ICMP
iptables -A INPUT -p icmp -m icmp --icmp-type 3/4 -j ACCEPT- 接受来自远程服务器的“目标无法到达”ICMP 响应。这允许系统正确运行您无法到达的远程站点。

接受 PING 请求/响应(“Echo” ICMP)
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT- 接受“Echo”(又名“Ping”)请求。保留此功能很有用,因为您的系统与某些站点和/或服务的连接可能需要 PING 才能发出保持活动请求。

创建一个iptables表来保存可接受的流量端口/规则
iptables -N acceptable_traffic
iptables -A INPUT -j acceptable_traffic

通过这样做,您将获得一个表格,您可以在其中放置规则,规定您希望从外部连接接受哪些流量。如果您有 SSH 服务器,您可以这样做iptables -A acceptable_traffic -p tcp --dport 22 -j ACCEPT(或将 22 替换为 SSH 服务器端口)。您也可以在此处添加其他可接受的流量规则。

拒绝所有未设置规则的流量
对此有两个选择。

iptables -A INPUT -j REJECT --reject-with icmp-host-unreachable- 这是第一个选项,也是我认为更明智的阻止流量的方式,当个人尝试访问服务器时,他们会收到“主机不可达”ICMP 数据包,然后终止连接尝试。

iptables -A INPUT -j DROP- 这是第二个选项。这将自动丢弃所有发送到您的系统的、不符合 ACCEPT 规则的传入数据包。这意味着数据包将被完全忽略。来自远程位置的连接尝试将自行超时,而连接的系统不会做出任何响应。


ip6tables

与 IPv4一样iptables,您必须ip6tables为 IPv6 进行配置。规则类似,但有所不同。 *如果您的系统上没有 IPv6,您可能不必担心这个问题,但是在系统中拥有规则也不会有任何坏处。

接受本地主机数据
ip6tables -A INPUT -i lo -j ACCEPT- 接受 LocalHost 上的所有流量,即仅限计算机内部的本地流量。这对于您的计算机正常运行是必要的。

接受与系统发起的出站连接相关的数据
ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT- 接受与出站方向连接相关的所有流量,包括来自远程服务器的响应(例如 apt 镜像或您正在访问的任何网站)。

ICMPv6 规则
ip6tables -A INPUT -p icmpv6 -j ACCEPT- 我不会阻止 IPv6 ICMP 数据包,因为与 IPv4 不同,有十亿个 IPv6 ICMP 数据包需要您接受(即全部)。为此,您可以这样做以接受所有数据包。

创建一个ip6tables表来保存可接受的流量端口/规则
ip6tables -N acceptable_traffic
ip6tables -A INPUT -j acceptable_traffic

通过这样做,您将获得一个表格,您可以在其中放置规则,规定您希望从外部连接接受哪些流量。如果您有 SSH 服务器,您可以这样做ip6tables -A acceptable_traffic -p tcp --dport 22 -j ACCEPT(或将 22 替换为 SSH 服务器端口)。您也可以在此处添加其他可接受的流量规则。

拒绝所有未设置规则的流量
对此有两个选择。

ip6tables -A INPUT -j REJECT --reject-with icmp6-addr-unreachable- 这是第一个选项,也是我认为这是一种更明智的阻止流量的方式,当个人尝试访问服务器时,他们会收到“地址不可达”ICMPv6 数据包,然后终止连接尝试。

ip6tables -A INPUT -j DROP- 这是第二个选项。这将自动丢弃所有发送到您的系统的、不符合 ACCEPT 规则的传入数据包。这意味着数据包将被完全忽略。来自远程位置的连接尝试将自行超时,而连接的系统不会做出任何响应。


保存所有规则

由于我之前告诉过您要安装该iptables-persistent软件包,因此您需要实际保存规则,以便稍后加载它们。

注意:这组命令实际上会将您带入超级用户 shell。除了我在此处说明的这些命令外,您不应在此 shell 中执行任何其他操作!

执行以下命令:

sudo -s
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
exit

这将保存规则,以便每次重启时都可以加载它们。 如果您稍后编辑规则,则需要重新运行这些命令来保存规则集。


如果我确实想要一个要阻止的不良 IP 列表该怎么办?

我们仍然可以做到这一点!您可能需要一个“不良”流量阻止列表。所以,这是我的解决方案,和之前一样,我将它分为两​​个部分,iptablesip6tables


iptables

创建一个表prohibited_traffic

我们现在需要创建一个prohibited_traffic表。您将在此处添加“坏 IP”。然后,我们需要将规则插入prohibited_traffic到 INPUT 表中。(在下面的示例中,我使用 2 来指示我们插入此规则的规则编号位置,这将它放在规则之后,规则内容如下ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED

iptables -N prohibited_traffic
iptables -I INPUT 2 -j prohibited_traffic

添加规则以阻止某些 IP

现在我们将要阻止的 IP 添加到此prohibited_traffic表。以下是模板:

iptables -A prohibited_traffic -s SourceIPAddress -j DROP

将“SourceIPAddress”替换为您要阻止的 IP 地址。如果您要阻止一系列 IP,则需要获取“范围”并确定包含所有 IP 地址的 CIDR 范围,然后使用该格式IPV4ADDRESS/cidr阻止包含 IP 的 CIDR 范围。如果没有 CIDR 或逐个添加大量 IP,则无法进行范围阻止。


ip6tables

这几乎等同于iptables

创建一个表prohibited_traffic

我们现在需要创建一个prohibited_traffic表。您将在此处添加“坏 IP”。然后,我们需要将规则插入prohibited_traffic到 INPUT 表中。(在下面的示例中,我使用 2 来指示我们插入此规则的规则编号位置,这将它放在规则之后,规则内容如下ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED

ip6tables -N prohibited_traffic
ip6tables -I INPUT 2 -j prohibited_traffic

添加规则以阻止某些 IP

现在我们将要阻止的 IP 添加到此prohibited_traffic表。以下是模板:

ip6tables -A prohibited_traffic -s SourceIPAddress -j DROP

将“SourceIPAddress”替换为您要阻止的 IP 地址。如果您要阻止一系列 IP,则需要获取“范围”并确定包含所有 IP 地址的 CIDR 范围,然后使用该格式IPV6ADDRESS/cidr阻止包含 IP 的 CIDR 范围。如果没有 CIDR 或逐个添加大量 IP,则无法进行范围阻止。

答案3

其中一个选项是使用iptables将激活真实的 防火墙到您的系统;这可能是最安全的方法(参见其他答案)。

sshd如果问题是您看到反复尝试通过守护进程(SSH 服务器服务)进入系统,那么这个答案很有用。

注意:根据 14.04,denyhost支持已经取消

新的解决方案是使用fail2ban。它功能更强大,并且使用默认配置安装起来非常简单。请参阅http://bodhizazen.com/Tutorials/SSH_security

旧答案

你还没有明确说明你看到了哪种问题,但如果问题是有人试图通过暴力ssh攻击进入你的系统(如果你的系统配置良好,这并不危险,但仍然很烦人),我建议你看看拒绝主机

您可以从存储库中安装它,apt-get install denyhosts它开箱即用,会自动阻止任何尝试登录您的机器并失败三次的主机一周。

答案4

iptables -A INPUT -s IP-ADDRESS -j DROP

代替IP地址使用您的实际 IP 地址。例如,如果你想阻止某个 IP 地址192.168.0.100无论出于什么原因,请输入以下命令:

iptables -A INPUT -s 192.168.0.100 -j DROP

如果您只想阻止从 IP 192.168.0.100 到端口 80 的访问,请输入命令:

iptables -A INPUT -s 192.168.0.100 -p tcp --destination-port 80 -j DROP

相关内容