有没有办法拒绝某个 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>
(根据您想要的协议替换tcp
为tcp
或)udp
答案2
在我们继续之前,让我们先记下几件事。
- 互联网的大部分地区没有静态 IP 地址。因此,可以使用代理、Tor 等尝试绕过单 IP 阻止。
- 通常,采取相反的做法会更安全,即阻止某个端口上的所有流量,并仅接受某些地址。这在大多数面向 Web 的情况下是不可行的,但它仍然是一种普遍接受的安全做法。
- 我们一般不会在互联网上进行任何过滤 - 我们不考虑下面答案中的第 1 点,并且您必须考虑到如果您阻止一个 IP,他们会找到绕过它的方法并访问不同的 IP,然后继续攻击的可能性。
在有人评论说这ufw
比这简单之前iptables
,我iptables
在这里使用是因为 OP 使用iptables
命令回答了这个问题,这让我认为他们想要一个有iptables
命令而不是ufw
命令/的答案
良好的iptables
防火墙配置将拒绝除系统在“可接受连接”方面所需的最低要求之外的所有内容,并且只接受规则中明确允许的连接。
为此,我们必须配置iptables
和 ip6tables
默认阻止流量,但从计算机内部发起的流量除外(例如,如果您在系统上,则来自 Firefox 等的网络流量,或wget
下载软件的流,或允许apt
更新软件包)。我们还必须允许您为您希望到达系统的流量添加可接受的规则。
为了使这些规则持久化,使它们在每次重启时始终有效,您应该安装该iptables-persistent
软件包,这将允许您保存这些规则,然后在系统启动时自动加载它们。sudo apt-get install iptables-persistent
先运行,然后添加您的规则。 我们将确保在创建规则集后更新启动时加载的规则集。
假设我们从空白iptables
和ip6tables
设置开始(这是 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 列表该怎么办?
我们仍然可以做到这一点!您可能需要一个“不良”流量阻止列表。所以,这是我的解决方案,和之前一样,我将它分为两个部分,iptables
和ip6tables
。
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