• iptables-ipset仅允许国内访问


    前言:

        境外肉鸡攻击有点多,并业务无境外访问需求,IDC机房网络防火墙无法实现8K多条的china大陆地址导入;为实现仅china大陆地址访问,在业务入口主机(DNAT端口映射或DNAT端口转发),使用iptables防火墙+ipset过滤实现访问控制,对于访问量不大的业务可考虑使用。

    如仅仅对某端口做过滤,搜本博"iptables-ipset仅允许国内访问---端口白名单"

    如需简单快捷的方式,搜本博“以错误路由方式禁止境外IP来访”篇 (缺点:主机也无法主动请求境外目标了)

    创建ipset得到的备份文件,便于批量添加8k条地址

    创建一个ipset

     ipset create whitelist hash:net maxelem 1000000

    加入一个名单ip

    ipset add whitelist 9.9.9.9

    查看已经ipset配置内容

    ipset list

    1. Name: whitelist
    2. Type: hash:net
    3. Revision: 3
    4. Header: family inet hashsize 1024 maxelem 65536
    5. Size in memory: 16816
    6. References: 0
    7. Members:
    8. 9.9.9.9

    将ipset规则保存到文件

    ipset save whitelist -f whitelist.txt

    查看备份内容

    more  whitelist.txt

    1. create whitelist hash:net family inet hashsize 1024 maxelem 1000000
    2. add whitelist 9.9.9.9

    下载china大陆地址集合并处理格式

    curl -# -O http://ftp.apnic.net/stats/apnic/delegated-apnic-latest

    cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}'|cat >ip.txt

    head -n 2 ip.txt   

    1. 1.0.1.0/24
    2. 1.0.2.0/23

    设置符合ipset备份文件格式

    sed 's/^/&add whitelist /g'  ip.txt  >  add-ip.txt

    cat  add-ip.txt   >> whitelist.txt;  cp whitelist.txt  china_whitelist.txt

    head -n 4   china_whitelist.txt         

    1. create whitelist hash:net family inet hashsize 1024 maxelem 65536
    2. add whitelist 9.9.9.9
    3. add whitelist 1.0.1.0/24
    4. add whitelist 1.0.2.0/23

    先删除前面创建的ipset

    ipset destroy whitelist

    导入ipset规则

    ipset restore -f china_whitelist.txt

    查看目前应用的ipset内容

    ipset list | head -n 12

    1. Name: whitelist
    2. Type: hash:net
    3. Revision: 3
    4. Header: family inet hashsize 2048 maxelem 1000000
    5. Size in memory: 126736
    6. References: 0
    7. Members:
    8. 202.118.64.0/18
    9. 223.212.0.0/15
    10. 103.217.56.0/22
    11. 150.242.184.0/22
    12. 43.246.76.0/22

    去除名单ip

    ipset del whitelist 9.9.9.9

    导入完毕

    禁用centos7firewalld,安装iptables

    systemctl stop firewalld

    systemctl disable firewalld

    yum -y  install iptables-services

    systemctl start iptables

    systemctl enable iptables

    操作

    service  iptables status

    service  iptables stop

    service  iptables restart

    iptables -F

    先放行SSH,以免无法远程

    iptables -I INPUT -p tcp --dport 22 -j ACCEPT

    iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

    service iptables save

    修改内核参数,开启转发功能

    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p

    开启DNAT

     iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.53.22:80

     iptables -t nat -L -n

    (后端主机看实际情况做返程路由,这里不做赘述,当然阿里云等不适用自建DNAT端口映射,可改用DNAT的端口转发,主要看后端有没获取客户端源IP需求)

    应用ipset规则实现白名单,禁止境外ip

    在dnat的端口用FORWARD

    iptables -t filter -I  FORWARD  -m set --match-set  whitelist  src -p tcp --dport 80  -j  ACCEPT

    iptables -t filter -A  FORWARD -p tcp --dport  80 -j DROP

    iptables  -L -n

    使用国内与境外地址分别测试通达性

    curl -I  http://ip+端口

    如实现预期,保存规则永久生效

    service iptables save

    reboot重启ipset集合消失,并且导致iptables启动失败

           因创建的 ipset 存于内存中

    解决:

           yum  -y install ipset-service

           systemctl enable ipset

           ipset restore -f china_whitelist.txt

           service ipset save

    sed -i 's/IPSET_SAVE_ON_STOP="no"/IPSET_SAVE_ON_STOP="yes"/' /etc/sysconfig/ipset-config

    带时间的玩法

    创建默认ip生效时间为1天的ipset集合

    ipset create timeout_list hash:net timeout 86400

    ipset add timeout_list  1.9.9.9  #继承集合默认生存时间

    ipset add timeout_list  2.9.9.9  timeout 3600  #生存时间为1小时

    ipset add timeout_list  3.9.9.9  timeout  0    #生效时间无限

    查看

    ipset  list  timeout_list

    1. Name: timeout_list
    2. ----
    3. Header: family inet hashsize 1024 maxelem 65536 timeout 86400
    4. ----(像redis一样显示时间倒计时)
    5. 1.9.9.9 timeout 86372
    6. 3.9.9.9 timeout 0
    7. 2.9.9.9 timeout 3572

    关于删除ipset和DNAT

    因地址条目过多索引过大,带来的删除ipset和DNAT失败

    删除DNAT异常

    iptables -t nat -L -n --line-numbers

    iptables -t nat  -D POSTROUTING 

    iptables: Index of deletion too big.

    删除ipset异常

    ipset destroy whitelist

    ipset v7.1: Set cannot be destroyed: it is in use by a kernel component

    尝试清空ipset的ip条目再删除

    ipset flush

    结果也是一样

    尝试关闭iptables再删除ipset

    service iptables stop

    ipset destroy whitelist

    随后发现service iptables restart失败 ,提示找不到whitelist,需要导入回去再重启恢复。

    ipset restore -f china_whitelist.txt

    service iptables restart

    最终的清理方式

    iptables  -F

    ipset destroy whitelist

    service iptables save

    iptables -I INPUT -p tcp --dport 22 -j ACCEPT

    iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

    service iptables save

    添加连续ip范围到集合

    ipset add a_list  1.1.2.1-1.1.2.64        

    ipset list a_list

    1. Name: a_list
    2. Members:
    3. 1.1.2.2/31
    4. 1.1.2.1
    5. 1.1.2.16/28
    6. 1.1.2.32/27
    7. 1.1.2.64
    8. 1.1.2.8/29
    9. 1.1.2.4/30

    详细应用移步

    参考文献

    ipset详解 使用ipset提高iptables的控制效率 - 快乐嘉年华 - 博客园

  • 相关阅读:
    爷回青——小米5s Plus刷入LineageOS
    AAC音频格式ADTS头详解
    [深入研究4G/5G/6G专题-55]: L3信令控制-4-软件功能与流程的切分-CU网元的信令
    Kafka是什么?
    李开复再度回应争议;10 月中国游戏厂商及应用出海收入 30 强出炉丨 RTE 开发者日报 Vol.86
    3D数据导出工具HOOPS Publish:3D数据查看、生成标准PDF或HTML文档!
    C语言实例练习
    聊聊动态线程池的9个场景
    Hive 面试题
    java毕业设计大学生入学审核系统mybatis+源码+调试部署+系统+数据库+lw
  • 原文地址:https://blog.csdn.net/endzhi/article/details/127685309