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]