AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 534092
Accepted
zigojacko
zigojacko
Asked: 2013-08-28 04:24:35 +0800 CST2013-08-28 04:24:35 +0800 CST 2013-08-28 04:24:35 +0800 CST

在 shell 脚本中的 iptables 块之间添加睡眠/延迟

  • 772

在一台服务器上,我们试图阻止对中国国家的任何访问。

我们希望使用 iptables 而不是通过 .htaccess 来实现这一点。

但是,我们遇到的问题是,当一次添加多个 iptables 时(我们在这里为中国谈论超过 1000 个 ip 子网),一个会失败(错误 'iptables: Unknown error 18446744073709551615' 然后随后所有其他人将失败)意味着我们必须iptables -F继续添加这些规则。

一些测试得出的结论是,问题似乎出在尝试一次运行很多(甚至一次 10+ 似乎会引发错误)时,而不是服务器只是不喜欢某些特定规则。

所以我想知道是否尝试在每个 iptables 规则运行之间添加一个睡眠(或其他一些延迟)可能会改善这个过程?

我们现在尝试了多种方法来实现这些 iptables,但如果可能的话,我们希望使用来自 nixCraft 的这个脚本,如下所示。

#!/bin/bash
### Block all traffic from AFGHANISTAN (af) and CHINA (CN). Use ISO code ###
ISO="af cn"

### Set PATH ###
IPT=/sbin/iptables
WGET=/usr/bin/wget
EGREP=/bin/egrep

### No editing below ###
SPAMLIST="countrydrop"
ZONEROOT="/root/iptables"
DLROOT="http://www.ipdeny.com/ipblocks/data/countries"

cleanOldRules(){
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
}

# create a dir
[ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT

# clean old rules
cleanOldRules

# create a new iptables list
$IPT -N $SPAMLIST

for c  in $ISO
do
    # local zone file
    tDB=$ZONEROOT/$c.zone

    # get fresh zone file
    $WGET -O $tDB $DLROOT/$c.zone

    # country specific log message
    SPAMDROPMSG="$c Country Drop"

    # get 
    BADIPS=$(egrep -v "^#|^$" $tDB)
    for ipblock in $BADIPS
    do
       $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
       $IPT -A $SPAMLIST -s $ipblock -j DROP
    done
done

# Drop everything 
$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST

# call your other iptable script
# /path/to/other/iptables.sh

exit 0

但是,我对 shell 脚本并不是特别熟悉,并且不确定在这个脚本中的什么时候我可以在 iptables 处理之间添加某种延迟,如果可能的话。请有人能指出我正确的方向吗?谢谢。

linux
  • 2 2 个回答
  • 1147 Views

2 个回答

  • Voted
  1. Best Answer
    dsmsk80
    2013-08-28T05:12:33+08:002013-08-28T05:12:33+08:00

    当与更多规则一起使用时,Netfilter/iptables 不能很好地扩展,因为它们应该按顺序匹配。但是从 Linux 内核 2.6.36 开始,有一个称为IP 集的新特性,它通过使用散列技术帮助消除这些规则。简而言之,它是如何工作的:

    1)创建IP集

    ipset create set01 hash:net
    

    2) 将 IP 范围添加到集合中

    ipset add set01 192.168.1.0/24
    ipset add set01 192.168.2.0/24
    ipset add set01 192.168.3.0/24
    ipset add set01 192.168.4.0/24
    ...
    ...
    

    3) 使用 netfilter/iptables 规则连接该集合,该规则拒绝来自集合 set01 的任何具有源 IP 地址的数据包

    iptables -A INPUT -m set --match-set set01 src -j REJECT
    

    如您所见,我没有创建 4 个几乎相同的 iptables 规则,而是创建了一个 IP 集 set01,然后我添加了一些 IP 范围(只是一个示例,实际上可能有数百万个),最后我通过单个 iptables 规则。因此,与其维护一长串类似的 iptables 规则,不如根据区域文件创建一个 IP 集,然后一步阻止它。

    请查看相关的 ipset 手册页以获取更多详细信息。

    • 4
  2. mgjk
    2013-08-28T05:45:28+08:002013-08-28T05:45:28+08:00

    我同意 dsumsky 的观点,即您可能需要一种新方法。但是要为每加载 4 个条目延迟 1 秒,要插入的代码将是这样的:

    i=0  # delay iterator
    
    BADIPS=$(egrep -v "^#|^$" $tDB)
    for ipblock in $BADIPS
    do
       # delay to help rules load properly.
       if [[ $i == 5 ]]
       then
             sleep 1
             i=0
       fi
    
       i=$((i+1))
    
       $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
       $IPT -A $SPAMLIST -s $ipblock -j DROP
    done
    

    您可以使用如下代码块来试验代码:

     #!/bin/bash
     i=0
     while [ 1 ]
     do
        i=$((i+1))
        if [[ $i == 5 ]]
        then
                sleep 1
                i=0
        fi
    
    
        echo hello $i
    done
    
    • 1

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve