我有一個帶有 4 個 IPv4 位址的 Debian Stretch VPS。我想運行多個程序,將它們綁定到特定的 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)嘗試將介面加入新建立的netns中:
# ip link set ens3:1 netns ns1
4) 此時 SSH 連線中斷。如果我使用 VNC 登入並執行ip a
,我會看到整個實體介面 ens3 及其所有子介面從主 netns 中消失。
命令輸出截圖
我做錯了什麼?如何將程式綁定到不同的來源IP位址?
PS我正在使用Python開發一個簡單的網站抓取工具,需要不同的IP來加速解析(每秒發出更多請求)並避免禁止。
答案1
給定的實體介面只能位於一個網路命名空間中,因此每個別名不能位於各自的命名空間中。一旦你開始移動一個,所有的東西都會移動,這解釋了你的觀察。
看這個問題:其自己的 netns 命名空間中的輔助 IP解釋為什麼會這樣,以及基於的解決方案macvlan
(或者你可以做橋接、IP轉送或NAT)。