一元网络论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 36|回复: 0

IPv6 出口 IP 指定教程:分配网段内任意 IPv6 地址。

[复制链接]

1万

主题

1万

帖子

5万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
55822
发表于 2024-9-11 03:48:42 | 显示全部楼层 |阅读模式
[/url]背景
使用自建IP池进行爬虫时,充分利用IPv6可以获得大量出口IP。家用网络通常分配一个/64网段,理论上可以获得264个出口IP。如果目标站点风控策略比较宽松,只封禁单个IP,则可以实现爬虫IP自由。
本篇文章整理了利用IPv6实现无限IP的步骤,并提供Python requests示例,希望能帮助到有类似需求的伙伴。本文只包含最简单的实现过程,更高级的实现方式,如使用nginx或openresty,将在后续更新中进行补充。
以下为正文:

[url=#p-1767829-ipv6-ip-2]
指定任意IPv6作为出口IP
[/url]参考资料

  • 谁不想要 2^64 个 IP 的代理池 ? - zu1k
  • [url=https://zu1k.com/posts/tutorials/http-proxy-ipv6-pool/]谁不想要 2^64 个 IP 的代理池 ? - zu1k

  • 基于ip6tables构建随机出口 - Type Boom
  • 基于ip6tables构建随机出口 - Type Boom

  • 利用 IPV6 绕过B站的反爬 | yllhwa’s blog
  • 利用 IPV6 绕过B站的反爬 | yllhwa's blog

  • 创建一个自己的 IPv6 代理池 (ndppd + openresty) - 企鹅大大的博客
  • 创建一个自己的 IPv6 代理池 (ndppd + openresty) - 企鹅大大的博客

  • IPv6地址分配统计 - 运营商·运营人 - 通信人家园 - Powered by C114
  • IPv6地址分配统计 - 运营商·运营人 - 通信人家园 - Powered by C114


    [/url]查看ipv6地址
    ip -6 addr show scope global
    输出形如:
    2: eno1:
    mtu 1500 state UP qlen 1000
        inet6 240?:????:????:????:abcd:1234:5678:90ab/64 scope global temporary dynamic
           valid_lft 258952sec preferred_lft 85972sec
        inet6 240?:????:????:????:1234:5678:abcd:1124/64 scope global temporary deprecated dynamic
           valid_lft 258952sec preferred_lft 0sec
        inet6 240?:????:????:????:7890:3456:abcd:0101/64 scope global dynamic mngtmpaddr noprefixroute
           valid_lft 258952sec preferred_lft 172552sec
    可以看到,240?:????:????:????::/64 是分配到的ipv6网段。三大运营商的ipv6地址开头分别为:中国联通:2408,中国移动:2409,中国电信:240e。
    [url=#p-1767829-h-5]
    添加路由
    将获得的ipv6网段添加到路由表中:
    ip route add local 240?:????:????:????::/64 dev eno1
  • 将 240?:????:????:????::/64 替换为实际的ipv6网段
  • 将 eno1 替换为实际的网卡名称
  • dev 是 device 的缩写,表示指定网络接口设备

    [/url]查看路由
    ip -6 route show
    如果只想显示公网地址,可以过滤掉包含 fe80:: 和 lo 的地址:
    ip -6 route show | grep -v 'fe80::' | grep -v 'lo'
    可以看到,240?:????:????:???::/64 dev eno1 已经添加到路由表中。
    [url=#p-1767829-ip_nonlocal_bind-7]
    启用 ip_nonlocal_bind
    sudo nano /etc/sysctl.conf
    在文件末尾添加内容并保存:
    net.ipv6.ip_nonlocal_bind = 1
    使配置生效:
    sudo sysctl -p
    [/url]安装 ndppd
    sudo apt install ndppd
    [url=#p-1767829-ndpdd-9]
    配置 ndpdd
    sudo nano /etc/ndppd.conf
    添加内容:
    route-ttl 30000
    proxy eno1 {
        router no
        timeout 500
        ttl 30000
        rule 240?:????:????:???::/64 {
            static
        }
    }
  • 将 eno1 替换为实际的网卡名称
  • 将 240?:????:????:????::/64 替换为实际的ipv6网段

    [/url]启动 ndppd
    sudo systemctl start ndppd
    设置开机自启:
    sudo systemctl enable ndppd
    [url=#p-1767829-h-11]
    测试出口地址
    随机选择一个同网段下的ipv6地址,测试出口IP:
    curl --int 240?:????:????:????:abcd:9876:5678:0123 http://ifconfig.me/ip
  • --int 是 --interface 的缩写,用于指定出口IP

    如果之前的步骤都正确,输出的ipv6地址应该和 --int 指定的相同。
    [/url]Python 示例
      
          [url=https://github.com/Hansimov/blog/blob/main/docs/notes/scripts/ip_tester.py]github.com

      
      
        Hansimov/blog/blob/main/docs/notes/scripts/ip_tester.py

          import netifaces
    import random
    import requests
    import requests.packages.urllib3.util.connection as urllib3_cn
    import socket
    from tclogger import logger
    from requests.adapters import HTTPAdapter

    class IPv6Extractor:
        def __init__(self):
            self.interfaces = []
        def extract_prefix(self, addr: str, netmask: str):
            prefix_length = netmask.count("f")
            prefix = addr[: prefix_length // 4 * 5 - 1]
            return prefix, prefix_length * 4
        def get_network_interfaces(self):


      This file has been truncated. show original
      
      
       
       
      "
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|一元网络论坛

    GMT+8, 2024-9-19 12:22 , Processed in 0.128813 second(s), 19 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表