我有一台 Debian Stretch VPS,有 4 个 IPv4 地址。我想运行几个程序,并将它们绑定到特定的 IP 地址(以便从不同的 IP 发出传出 HTTP 请求)。例如命令
~$ curl icanhazip.com
将输出特定的不同 IP。
我做了什么:
0)从我的 ISP 订购额外的 IP
1) 编辑 /etc/network/interfaces 并添加额外的 IP:
# Initial configuration after ordering VPS
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
allow-hotplug ens3
iface ens3 inet static
address 194.67.205.100
netmask 255.255.252.0
gateway 194.67.204.1
# Next lines were added by me
auto ens3:1
iface ens3:1 inet static
address 185.125.216.101
netmask 255.255.252.0
auto ens3:2
iface ens3:2 inet static
address 185.125.216.102
netmask 255.255.252.0
auto ens3:3
iface ens3:3 inet static
address 185.125.216.103
netmask 255.255.252.0
2)然后我为每个 IP 创建了 netns
ip netns add ns1
ip netns add ns2
and so on
3)尝试向新创建的网络添加接口:
# ip link set ens3:1 netns ns1
4) 此时 SSH 连接断开。如果我使用 VNC 登录并执行ip a
,我会看到整个物理接口 ens3 及其所有子接口都从主网络中消失了。
命令输出截图
我做错了什么?如何将程序绑定到不同的源 IP 地址?
PS 我正在使用 Python 开发一个简单的网站抓取工具,需要不同的 IP 来加快解析速度(每秒发出更多请求)并避免被禁止。
答案1
给定的物理接口只能位于一个网络命名空间中,因此您的每个别名不能位于其自己的命名空间中。一旦您开始移动一个,所有内容都会移动,这解释了您的观察结果。
请参阅这个问题:位于其自己的 netns 命名空间中的辅助 IP对于为什么会这样,既要解释一下,也要提出一个解决方案macvlan
(或者你也可以进行桥接、IP 转发或 NAT)。