admin 发表于 2024-9-11 03:48:42

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

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

指定任意IPv6作为出口IP
参考资料

[*]
谁不想要 2^64 个 IP 的代理池 ? - zu1k

[*]谁不想要 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


查看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。
添加路由
将获得的ipv6网段添加到路由表中:
ip route add local 240?:????:????:????::/64 dev eno1

[*]将 240?:????:????:????::/64 替换为实际的ipv6网段
[*]将 eno1 替换为实际的网卡名称
[*]dev 是 device 的缩写,表示指定网络接口设备

查看路由
ip -6 route show
如果只想显示公网地址,可以过滤掉包含 fe80:: 和 lo 的地址:
ip -6 route show | grep -v 'fe80::' | grep -v 'lo'
可以看到,240?:????:????:???::/64 dev eno1 已经添加到路由表中。
启用 ip_nonlocal_bind
sudo nano /etc/sysctl.conf
在文件末尾添加内容并保存:
net.ipv6.ip_nonlocal_bind = 1
使配置生效:
sudo sysctl -p
安装 ndppd
sudo apt install ndppd
配置 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网段

启动 ndppd
sudo systemctl start ndppd
设置开机自启:
sudo systemctl enable ndppd
测试出口地址
随机选择一个同网段下的ipv6地址,测试出口IP:
curl --int 240?:????:????:????:abcd:9876:5678:0123 http://ifconfig.me/ip

[*]--int 是 --interface 的缩写,用于指定出口IP

如果之前的步骤都正确,输出的ipv6地址应该和 --int 指定的相同。
Python 示例

      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


   
   
"
页: [1]
查看完整版本: IPv6 出口 IP 指定教程:分配网段内任意 IPv6 地址。