用iptables阻止中国


10

我刚刚登录了一个GitLab服务器,发现自上次检查服务器以来,它的登录失败为18.974次-将近5天。我检查了Ip,似乎几乎所有的Ip都来自中国,并试图通过SSH和Brute Force获得访问权限。我开始阻止一些Ip,但是后来我意识到这是浪费时间,更好的主意是封锁整个国家。

我有什么办法可以用iptables阻止整个中国或任何其他国家?

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

有任何想法吗 ?谢谢!


4
我以不同的方式解决了相同的问题。我通过关闭密码和基于挑战的身份验证来加强客户GitLab服务器上的SSH,并且仅允许使用SSL密钥登录。也许这将适合您的情况?阻止IP范围可能会减少“噪音”,但不会为您提供真正的保护以防止暴力破解。
blendenzo

到目前为止,它没有用。gitlab服务器仍然启动,我闯入了0次。SSH acces仅通过ssh-keys进行,并且我禁用了root登录。只是,我想学习iptables的那么糟糕..
Caranfil Alegzandru

1
您还可以将ssh切换到路由器中的非默认端口。这使我的ssh bot攻击尝试次数从每天数百次降至零次。
有机大理石

Answers:


7

使用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地址的完整列表。但是,该列表既长又令人惊讶,而且非常动态。我自己决定不阻止整个列表。


这^!可能是我收到的最好的答案。这可能是一个愚蠢的问题,但是我想所有这些规则都会进入bash脚本中,对吗?我在理解iptables方面仍然有一些问题,但是我觉得很有趣。
Caranfil Alegzandru'1

是的,我使用bash脚本。有些,我也使用过,使用直接的iptables恢复方法,这种方法加载起来更快。我进行了更改,因为在同一脚本中包含了一些非iptables命令。
Doug Smythies

12

使用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

添加这样的一行:

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

这将在每天凌晨5点运行/etc/block-china.sh。运行脚本的用户将需要是root或具有root特权。

资源


为什么将其限制为仅TCP协议?似乎无需指定协议即可工作。建议使用较新的汇总列表,因为它们要短得多:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies 18/12/20

重新启动后,此处没有任何可还原ipset的内容。
道格·史密斯

4

您可能需要安装类似fail2ban之类的东西,以阻止尝试登录服务器并失败的ip。


我还可以使用csf防火墙,并从配置文件中阻止我想要的每个国家。问题是我真的很想使用iptables,因此我可以了解更多信息。
Caranfil Alegzandru'1

您将必须查看哪些国家/地区为其分配了哪些ip地址块,以找出阻止对象。不知道它是否会超级准确。您可以使用iptables -L显示当前的iptables规则,使用iptables-save显示运行了哪些命令来创建所述规则,然后设计自己的规则并使用测试机进行测试以了解它。这就是我学到的。
凯尔·H

0

您可以将geoip-module用于iptables:https : //linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

一旦我们的系统升级并安装了依赖项,我们现在将xtables-addons安装在我们的计算机中。为此,我们将使用wget 从官方xtables-addons项目站点下载最新的tarball 。下载完成后,我们将解压缩tarball,然后编译并安装到我们的计算机中。

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

接下来,我们将运行xtables-addons扩展随附的名为xt_geoip的模块,该模块将从MaxMind下载GeoIP数据库并将其转换为识别的二进制形式xt_geoip。下载后,我们将对其进行构建并将其移至所需的 xt_geoip路径,即/usr/share/xt_geoip

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

这是将iptables与geoip模块一起使用的基本语法,以阻止源自某个国家或发往某个国家的流量。在这里,我们需要使用两个字母的ISO3166代码代替国家/地区,例如,美国(美国),爱尔兰(IE),爱尔兰(印度),印度(印度),中国(中国)等等。

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]

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.