• 使用 IPSET 添加 CDN 节点 IP(IPv4/IPv6)到防火墙白名单


    明月的服务器一直使用的是 iptables,随着近几年 IPv6 的普及,明月切身体会到还是 IPSET 最方便了,无论你是 IPv4 还是 IPv6 都可以方便的管理,无论你是加入白名单还是黑名单,都非常的简单高效!今天就参照明月自己的实操给大家分享一下。

    使用 IPSET 添加 CDN 节点 IP(IPv4/IPv6)到防火墙白名单

    IPSET 介绍

    IPSET 是 iptables 的扩展,它允许你创建 匹配整个地址集合的规则。而不像普通的 iptables 链只能单 IP 匹配, ip 集合存储在带索引的数据结构中,这种结构即时集合比较大也可以进行高效的查找,除了一些常用的情况,比如阻止一些危险主机访问本机,从而减少系统资源占用或网络拥塞,IPSET 也具备一些新防火墙设计方法,并简化了配置。

    官网:https://ipset.netfilter.org/

    首先,我们可以利用 IPSET 根据不同的 CDN 服务商来创建不同的合集(set),甚至可以区别 IPv4/IPv6 来创建不同的合集分别的用在 iptables 规则里。因为明月目前使用的是 CloudFlare+奇安信网站卫士双 CDN ,所以就以此为例来创建不同的 IPSET 合集。

    1. ipset create QNX360 hash:net #创建奇安信网站卫士节点 IPv4 合集
    2. ipset create CloudFlare hash:net #创建 CloudFlare 节点 IPv4 合集
    3. ipset create CloudFlare6 hash:net family inet6 #创建 CloudFlare 节点 IPv6 合集

    目前奇安信网站卫士只提供 IPv4 节点 IP,所以只创建一个 IPv4 的QNX360合集即可。而 CloudFlare 的节点包含 IPv4/IPv6,所以我们加了family inet6参数,给 CloudFlare 的 IPv6 节点又创建一个CloudFlare6合集,一共是三个合集。

    考虑到大部分 CDN 节点 IP 数量都不少,所以明月建议大家提前将 CDN 节点 IP 单独保存到文件进行导入,可以减少出错的概率保证数据的准确性,上述三个合集需要的 CDN 节点 IP 文件内容如下:

    奇安信网站卫士节点

    1. add QNX360 183.146.28.0/24
    2. add QNX360 123.6.81.0/24

    CloudFlare 的 IPv4 节点

    1. add CloudFlare 103.21.244.0/22
    2. add CloudFlare 103.22.200.0/22
    3. add CloudFlare 103.31.4.0/22
    4. add CloudFlare 104.16.0.0/13
    5. add CloudFlare 104.24.0.0/14
    6. add CloudFlare 108.162.192.0/18
    7. add CloudFlare 131.0.72.0/22
    8. add CloudFlare 141.101.64.0/18
    9. add CloudFlare 162.158.0.0/15
    10. add CloudFlare 172.64.0.0/13
    11. add CloudFlare 173.245.48.0/20
    12. add CloudFlare 188.114.96.0/20
    13. add CloudFlare 190.93.240.0/20
    14. add CloudFlare 197.234.240.0/22
    15. add CloudFlare 198.41.128.0/17

    CloudFlare 的 IPv6 节点

    1. add CloudFlare6 2400:cb00::/32
    2. add CloudFlare6 2606:4700::/32
    3. add CloudFlare6 2803:f800::/32
    4. add CloudFlare6 2405:b500::/32
    5. add CloudFlare6 2405:8100::/32
    6. add CloudFlare6 2a06:98c0::/29
    7. add CloudFlare6 2c0f:f248::/32

    CloudFlare 节点 IP 来源:https://www.cloudflare.com/zh-cn/ips/

    上述三个合集的节点 IP 可以合并保存在一个.txt 文件里,如:ip.txt(记得这里的 TXT 文件必须是纯文本编辑器以 UTF-8 编码保存哦,不要用记事本!不要用记事本!不要用记事本!重要的事儿说三遍!),因为每行都有 add 命令添加 IP 到各自的 IPSET 合集里,所以保存到一个文件里是没有问题的,我们只需要让 IPSET 导入这个 TXT 文件就可以了:

    1. ipset restore -f ip.txt #导入 ip.txt 里的节点到对应的 IPSET 合集里
    2. ipset list #列出当前所有合集

    可以看到如下的内容:

    1. Name: QNX360
    2. Type: hash:net
    3. Revision: 6
    4. Header: family inet hashsize 1024 maxelem 65536
    5. Size in memory: 592
    6. References: 1
    7. Number of entries: 2
    8. Members:
    9. 183.146.28.0/24
    10. 123.6.81.0/24
    11. Name: CloudFlare
    12. Type: hash:net
    13. Revision: 6
    14. Header: family inet hashsize 1024 maxelem 65536
    15. Size in memory: 1424
    16. References: 1
    17. Number of entries: 15
    18. Members:
    19. 103.22.200.0/22
    20. 131.0.72.0/22
    21. 197.234.240.0/22
    22. 108.162.192.0/18
    23. 172.64.0.0/13
    24. 190.93.240.0/20
    25. 198.41.128.0/17
    26. 141.101.64.0/18
    27. 104.16.0.0/13
    28. 162.158.0.0/15
    29. 104.24.0.0/14
    30. 173.245.48.0/20
    31. 103.21.244.0/22
    32. 188.114.96.0/20
    33. 103.31.4.0/22
    34. Name: CloudFlare6
    35. Type: hash:net
    36. Revision: 6
    37. Header: family inet6 hashsize 1024 maxelem 65536
    38. Size in memory: 2032
    39. References: 1
    40. Number of entries: 7
    41. Members:
    42. 2a06:98c0::/29
    43. 2606:4700::/32
    44. 2405:8100::/32
    45. 2400:cb00::/32
    46. 2803:f800::/32
    47. 2c0f:f248::/32
    48. 2405:b500::/32

    可以看到都已经导入到各个合集里了,这时候我们就可以让 iptables 决定这些合集是加入白名单规则还是黑名单规则了,具体白名单规则命令如下:

    1. iptables -A INPUT -p tcp -m set --match-set QNX360 src -m multiport --dports 443,80 -j ACCEPT #允许奇安信网站卫士 CDN 节点访问 80443 端口
    2. iptables -A INPUT -p tcp -m set --match-set CloudFlare src -m multiport --dports 443,80 -j ACCEPT #允许 CloudFlare 的 IPv4 节点访问 80443 端口
    3. ip6tables -A INPUT -p tcp -m set --match-set CloudFlare6 src -m multiport --dports 443,80 -j ACCEPT #允许 CloudFlare 的 IPv6 节点访问 80443 端口

    反之黑名单命令如下:

    1. iptables -A INPUT -p tcp -m set --match-set QNX360 src -m multiport --dports 443,80 -j DROP #禁止奇安信网站卫士 CDN 节点访问 80443 端口
    2. iptables -A INPUT -p tcp -m set --match-set CloudFlare src -m multiport --dports 443,80 -j DROP #禁止 CloudFlare 的 IPv4 节点访问 80443 端口
    3. ip6tables -A INPUT -p tcp -m set --match-set CloudFlare6 src -m multiport --dports 443,80 -j DROP #禁止 CloudFlare 的 IPv4 节点访问 80443 端口

    注意上述命令的差异,涉及 IPv4 的命令是 iptables,涉及 IPv6 的是 ip6tables,不要搞混了,否则是不会生效的哦!同样的重载 iptables 和保存 iptables 也是要区分 IPv4 和 IPv6 的:

    1. systemctl reload iptables.service #重载 IPv4 规则
    2. service iptables save #保存 IPv4 规则
    3. systemctl reload ip6tables.service #重载 IPv6 规则
    4. service ip6tables save #保存 IPv6 规则

    好了,至此就通过 IPSET 导入了两个不同 CDN 服务商的节点 IP 了,如果后期节点 IP 有所调整,只需要在 IPSET 里清理掉对应合集重新导入新的 IP 节点即可,注意区分 IPv4/IPv6 即可。比如变更 CloudFlare 节点 IP,我们只需要清楚 CloudFlare 合集后再导入即可:

    1. ipset flush CloudFlare
    2. ipset flush CloudFlare6

    至于导入 TXT 格式,参考上面的合集 TXT 修改即可,推荐使用 EditPlus 的搜索替换来快速的修改文本【推荐下用了十多年的老牌纯文本编辑器——EditPlus】。

    如果您只用了 CloudFlare,可以直接使用下面的命令完成 iptables 节点 IP 加白:

    1. #添加 cloudflare ips-v4 到 iptables 白名单的命令
    2. for i in `curl https://www.cloudflare.com/ips-v4`; do iptables -I INPUT -p tcp -m multiport --dports http,https -s $i -j ACCEPT; done
    3. #添加 cloudflare ips-v6 iptables 白名单的命令
    4. for i in `curl https://www.cloudflare.com/ips-v6`; do ip6tables -I INPUT -p tcp -m multiport --dports http,https -s $i -j ACCEPT; done

    这个更加的简单高效,明月采用的 IPSET 主要是为了方便后期运维需要的,毕竟明月是专业干这个的嘛!

  • 相关阅读:
    C++11产生随机数
    firefox_dev_linux下载安装配置(部分系统自带包请看结尾)
    java object转json格式,转对象存储
    iOS视频捕获实践篇
    【Koltin Flow(三)】Flow操作符之中间操作符(一)
    ts重点学习143-描述文件声明
    QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器
    【人工智能学习之图像操作(四)】
    Semaphroe + CountDown
    蓝桥ACM培训-搜索
  • 原文地址:https://blog.csdn.net/cpublic/article/details/139421921