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

有没有办法拒绝IP地址连接到我的Pc?

有没有办法拒绝Ip连接到特定端口?

在我们进一步讨论之前,让我们记下几件事。

  1. 大多数Internet没有静态IP地址。 因此,可以使用代理,Tor等来尝试绕过单个IP块。
  2. 反向操作通常更安全,阻止端口上的所有流量,并且只接受某些地址。 这在大多数面向Web的情况下都不可行,但它仍然是一种普遍接受的安全实践。
  3. 我们一般不会在互联网上进行任何过滤 – 我们没有考虑到以下答案的第一点,你必须考虑如果你阻止一个IP的可能性,他们会找到解决方法,获得对不同IP的访问权限,并继续攻击。

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


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

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

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

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


iptables

以下是一个基本规则集,它将限制尝试访问您系统的所有数据和数据包,无论您使用的是什么连接:

接受localhost数据
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 – 接受“Time Exceeded”数据包,这是某些限时连接设置所必需的。

接受“目标无法访问”ICMP
iptables -A INPUT -p icmp -m icmp --icmp-type 3/4 -j ACCEPT – 接受来自远程服务器的“Destination Unreachable”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 (或用SSH服务器端口替换22)。 您也可以在此处添加其他可接受的流量规则。

拒绝没有设置规则的所有流量
有两种选择。

iptables -A INPUT -j REJECT --reject-with icmp-host-unreachable – 这是第一个选项,我认为这是一种更加理智的阻止流量的方式,当一个人试图到达服务器时,他们会收到一个“Host Unreachable”ICMP数据包然后终止连接尝试。

iptables -A INPUT -j DROP – 这是第二个选项。 这将自动删除发送到系统的所有传入数据包,这些数据包与ACCEPT规则不匹配。 这意味着数据包完全被忽略。 来自远程位置的连接尝试将自行超时,而没有来自连接的系统的响应。


ip6tables

与IPv4的iptables一样,您必须为IPv6配置ip6tables 。 规则类似,但不同。 *如果您的系统上没有IPv6,则可能不必担心这一点,但系统中的规则不会受到影响。

接受localhost数据
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 (或用SSH服务器端口替换22)。 您也可以在此处添加其他可接受的流量规则。

拒绝没有设置规则的所有流量
有两种选择。

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的规则之后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的规则之后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就无法完成范围块。

你也可以使用ufw和IMO,它更简单。

要拒绝来自任何连接的IP地址,请使用:

 sudo ufw deny from  to any 

或者拒绝访问特定端口:

 sudo ufw deny from  to any port  

或者您可以指定协议:

 sudo ufw deny proto tcp from  to any port  

(用tcpudp替换tcp ,具体取决于你想要的协议)

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

如果问题是您通过sshd守护程序(SSH服务器服务)看到重复尝试进入系统,则此答案很有用。

注意:根据14.04, denyhost支持已被删除 。

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

老答案

您没有明确说明您看到的是哪种问题,但如果问题是有人试图通过powershellssh攻击进入您的系统(如果您的系统配置良好但仍然很烦人,那几乎很危险),我建议您看看DenyHosts 。

您可以使用apt-get install denyhosts从存储库安装它,它只是开箱即用,自动阻止任何尝试登录您的计算机并且失败三次的主机。

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

IP-ADDRESS替换为您的实际IP地址。 例如 ,如果您因任何原因希望阻止IP地址192.168.0.100 ,请按以下方式键入命令:

 iptables -A INPUT -s 192.168.0.100 -j DROP 

如果您只想阻止从ip 192.168.0.100到端口80的一个端口的访问,请键入command:

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