使用 iptables 封锁中国

使用 iptables 封锁中国

我刚刚登录 GitLab 服务器,发现自上次检查服务器以来,已有 18,974 次登录失败 - 差不多 5 天。我检查了 IP,似乎几乎所有 IP 都来自中国,并试图通过 SSH 和暴力破解获得访问权限。我开始屏蔽一些 IP,但后来我意识到这是在浪费时间,更好的主意是屏蔽整个国家。

有没有什么办法可以用 iptables 封锁整个中国或者其他国家?

我在网上找到了一些文章,但几乎都是 bash 脚本。我是 Linux 新手,所以我不太了解所有这些脚本。我发现 iptables 非常有趣,我想了解更多。

有什么想法吗?谢谢!

答案1

使用 ipset 封锁中国

您无法手动将几千个 IP 地址添加到 iptables 中,甚至自动添加也不是什么好主意,因为这会导致大量 CPU 负载(至少我读到过)。相反,我们可以使用专为此类事情设计的 ipset。ipset 处理大量 IP 地址列表;您只需创建一个列表,然后告诉 iptables 在规则中使用该列表。

注意:我假设以下所有操作都是以 root 身份完成的。如果您的系统基于 sudo,请进行相应调整。

apt-get install ipset

接下来,我编写了一个小型 Bash 脚本来完成所有工作,您应该能够从其中的注释中理解它。创建一个文件:

nano /etc/block-china.sh

以下是您要粘贴的内容:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

保存文件。使其可执行:

chmod +x /etc/block-china.sh

这还没有做任何事情,但当我们运行脚本时,它会在一分钟内完成。首先,我们需要在 iptables 中添加一条规则,该规则引用上述脚本定义的新 ipset 列表:

nano /etc/iptables.firewall.rules

添加以下行:

-A INPUT -p tcp -m set --match-set china src -j DROP

保存文件。为了清楚起见,我的完整 iptables.firewall.rules 现在如下所示:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

目前,服务器没有任何变化,因为没有应用任何新规则;为此,请运行 block-china.sh 脚本:

/etc/block-china.sh

这应该会显示一些输出,因为它会提取一份新的基于中文的 IP 列表,然后大约几秒钟后,它将完成并将您带回到命令提示符。

要测试它是否有效,请运行:

iptables -L

您现在应该看到一条阻止中国的新规则——输出应该如下所示:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

几乎完成了!这有效,并且会在重新启动后继续工作。但是,IP 地址会发生变化,并且该列表会随着时间的推移而变得陈旧。如果您想提取并应用更新的 IP 列表,只需再次运行 block-china.sh 脚本即可。

我们还可以通过 cron 作业设置机器自动执行此操作:

crontab -e

添加如下一行:

0 5 * * * /etc/block-china.sh

这将在每天早上 5 点运行 /etc/block-china.sh。要在重启时启用它,请添加另一行,例如:

@reboot /etc/block-china.sh

运行该脚本的用户需要是 root 用户或具有 root 权限。

来源

答案2

可以使用 iptables 自动识别并阻止 ssh 的坏人,这可以通过使用模块来实现recent。必须添加以下段你的通用ESTABLISHED,RELATED线路:

[…]
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT

[…]
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

现在,中国最近(过去一两年)的问题是,他们变得非常聪明,一旦他们从一个 IP 地址被阻止,他们就会切换到同一子网上的另一个 IP 地址并继续。这冒着用尽默认最近表条目的风险(我认为默认值是 200)。我监视这一点,然后查找实际的 IP 段,并永久阻止整个段。就我而言,我不在乎附带损害,即阻止无辜的人:

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12   -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
[…]

上述内容中:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

您可以以 iptables 或其他格式获取中国或任何国家/地区的完整 IP 地址列表这里。然而,这个列表既长得惊人,又变化多端。我决定不屏蔽整个列表。

答案3

您可能需要安装类似 fail2ban 之类的程序,以便它阻止尝试登录您的服务器并失败的 IP。

答案4

你习惯IP2Location 防火墙列表生成针对中国的 iptables。

该文件的格式如下。在 shell 中运行它,你应该可以屏蔽所有中国 IP 地址。

iptables -A INPUT -s 8.8.8.8/24 -j DROP

相关内容