想在一台服务器上用好253个住宅IP,做法是:把整段/24绑定到网卡上,再为每个服务指定出口IP——用Nginx proxy_bind/listen、curl --interface、Python的source_address、按用户SNAT或策略路由,或在Docker中为容器单独建网络——同时维护一张IP分配表,让每个IP只有一个负责人、一个用途。本文以IMIDC原生住宅IP服务器为例逐步讲解,该产品附带/24共253个原生家庭宽带IPv4并提供root权限,起价$2,188/月。
把整段地址都加到服务器网卡上,先临时测试,再写入持久化配置。
交付信息会注明网关、主IP以及IP段是否同网段直连;如与本例不同请以交付信息为准,有疑问可咨询IMIDC技术支持。
# 1) Check what is already configured (interface name may be eth0, ens3, enp1s0...)
ip -4 addr show dev eth0
ip route show default # expect: default via 203.0.113.1 dev eth0
# 2) Add the rest of the block at runtime (lost on reboot - good for a first test)
for i in $(seq 3 254); do
ip addr add 203.0.113.$i/24 dev eth0
done
# 3) Count: should print 253 (203.0.113.2 - 203.0.113.254)
ip -4 addr show dev eth0 | grep -c 'inet 203\.0\.113\.'
Ubuntu等使用netplan的系统,需要写入永久配置。用netplan try应用,配置出错会自动回滚,不至于把自己锁在外面。
# /etc/netplan/50-cloud-init.yaml (excerpt) - keep your existing gateway/DNS lines
network:
version: 2
ethernets:
eth0:
addresses:
- 203.0.113.2/24
- 203.0.113.3/24
# ... one line per address ...
- 203.0.113.254/24
routes:
- to: default
via: 203.0.113.1
# Generate the 253 address lines instead of typing them:
for i in $(seq 2 254); do echo " - 203.0.113.$i/24"; done
# Apply with automatic rollback if you lose SSH:
netplan try
较老的Debian/CentOS可用/etc/network/interfaces或NetworkManager实现同样效果(nmcli con mod eth0 +ipv4.addresses 203.0.113.3/24)。建议在维护窗口重启一次,确认253个地址都能恢复。
253个地址绑定后,任何监听0.0.0.0的服务都会在所有IP上暴露,因此要显式绑定。
listen 203.0.113.20:443,而不是listen 443。# /etc/ssh/sshd_config - management only on the primary IP
ListenAddress 203.0.113.2
把IP分配给任何人之前,先确认流量确实从该IP发出,以及它的地理定位结果。
# Each IP should report itself as the source address
for i in 2 20 50 200; do
printf '203.0.113.%s -> ' "$i"
curl -s --max-time 10 --interface 203.0.113.$i https://ip.example.com; echo
done
把ip.example.com换成你信任的任意“查询本机IP”接口。同时在目标平台可能使用的地理位置数据库中查询这些地址,记下显示的运营商名称。IMIDC交付的是注册在当地运营商名下的IP,但没有任何服务商能保证第三方数据库或平台对每个地址的判定,请如实记录检测结果。
Linux默认使用主IP作为源地址,下面每种方法都能针对某个服务、用户或容器覆盖这一默认值。
| 方法 | 作用范围 | 是否需要改代码 | 适用场景 |
|---|---|---|---|
Nginx listen / proxy_bind | 按站点或location | 只改配置 | 店铺站点、反向代理、API网关 |
curl --interface | 按命令 | 否 | 定时任务、健康检查、脚本 |
Python source_address | 按连接/会话 | 是(改动很小) | 自有自动化程序和API客户端 |
| iptables/nftables按UID做SNAT | 按Linux用户 | 否 | 每位成员或每个任务一个IP |
策略路由(ip rule uidrange) | 按用户设置默认源地址 | 否 | 效果同SNAT,但不用NAT规则 |
| Docker bridge + SNAT | 按容器网络 | 否 | 容器化应用固定出口IP |
| Docker ipvlan L2 | 按容器 | 否 | 需要在自己IP上接受入站的容器 |
# Inbound: each storefront answers only on its own residential IP
server {
listen 203.0.113.20:443 ssl;
server_name shop-tw.example.com;
# ssl_certificate ... ;
}
# Outbound: pick the source IP for upstream requests per site
map $host $egress_ip {
default 203.0.113.21;
shop-tw.example.com 203.0.113.21;
brand-b.example.com 203.0.113.22;
}
server {
listen 203.0.113.22:443 ssl;
server_name brand-b.example.com;
location /api/ {
proxy_pass https://partner-api.example.com;
proxy_bind $egress_ip;
}
}
# Shell / cron jobs
curl --interface 203.0.113.40 -s https://example.com/health
# Python standard library
import http.client
conn = http.client.HTTPSConnection("example.com", timeout=10,
source_address=("203.0.113.41", 0))
conn.request("GET", "/")
print(conn.getresponse().status)
# httpx
import httpx
transport = httpx.HTTPTransport(local_address="203.0.113.42")
with httpx.Client(transport=transport, timeout=10) as client:
print(client.get("https://example.com/").status_code)
# requests (pip install requests-toolbelt)
import requests
from requests_toolbelt.adapters.source import SourceAddressAdapter
s = requests.Session()
s.mount("https://", SourceAddressAdapter("203.0.113.43"))
print(s.get("https://example.com/").status_code)
为每位成员或每个任务建一个Linux用户并固定到一个IP;除非你修改规则,该用户运行的任何程序都不会从其他地址发出。
# One Linux user per team member or job, each pinned to one IP
useradd -m tw_ops01
iptables -t nat -A POSTROUTING -o eth0 -m owner --uid-owner tw_ops01 \
-j SNAT --to-source 203.0.113.50
# nftables equivalent
nft add rule ip nat postrouting oifname "eth0" meta skuid "tw_ops01" snat to 203.0.113.50
# Persist iptables rules (Debian/Ubuntu)
apt install -y iptables-persistent && netfilter-persistent save
# Alternative: policy routing by UID - sets the default source address
# for anything that user runs without an explicit bind
ip route add default via 203.0.113.1 dev eth0 src 203.0.113.60 table 160
ip rule add uidrange 1060-1060 lookup 160 priority 1060
# Check which source the kernel picks for that user
ip route get 198.51.100.10 uid 1060
方案A让容器留在私有bridge网络中,把流量改写为某个住宅IP;方案B直接把住宅IP分配给容器。
# A) Bridge network per IP, with your own SNAT rule
docker network create --subnet 172.30.70.0/24 \
-o com.docker.network.bridge.enable_ip_masquerade=false net_ip70
iptables -t nat -A POSTROUTING -s 172.30.70.0/24 -o eth0 \
-j SNAT --to-source 203.0.113.70
docker run -d --name app70 --network net_ip70 my-app:latest
# B) ipvlan L2: containers own residential IPs directly (shares the host MAC)
# Do NOT also bind these addresses on the host.
docker network create -d ipvlan -o parent=eth0 -o ipvlan_mode=l2 \
--subnet 203.0.113.0/24 --gateway 203.0.113.1 \
--ip-range 203.0.113.192/27 res_ipvlan
docker run -d --name web200 --network res_ipvlan --ip 203.0.113.200 nginx
ipvlan L2复用宿主机的MAC地址,上游交换机一般都能接受;macvlan会为每个容器生成新的MAC,部分机房端口会限制,使用macvlan前请先与IMIDC技术支持确认。较新的Docker版本也提供了指定bridge SNAT源地址的选项,请查阅对应版本的文档。
按用途把整段划分成若干区间,让任何人一眼就能看出某个地址是做什么的。
| 区间 | 数量 | 用途 | 方法 |
|---|---|---|---|
| 203.0.113.2 | 1 | 服务器主IP、SSH、管理 | 系统默认 |
| 203.0.113.10 – .29 | 20 | 入站网站和API | Nginx listen |
| 203.0.113.30 – .79 | 50 | 团队成员的店铺后台 | 按UID SNAT |
| 203.0.113.80 – .159 | 80 | 应用与容器 | Docker SNAT / ipvlan |
| 203.0.113.160 – .239 | 80 | QA、自有网站的广告与SEO核验 | curl / Python |
| 203.0.113.240 – .254 | 15 | 备用与隔离 | 不启用 |
坚持“一个IP一个负责人”的原则。如果每天把IP在不相关的任务之间来回挪,就浪费了稳定独享IP段最大的价值。
像管理代码一样管理IP规划:一份纳入版本控制的文件,作为“谁在用哪个IP”的唯一依据。
# ip-allocation.csv (keep in git; review monthly)
ip,owner,purpose,method,since,notes
203.0.113.2,infra,server primary / SSH only,host,2026-10-01,never used for business traffic
203.0.113.20,web,shop-tw.example.com inbound,nginx listen,2026-10-02,
203.0.113.50,tw_ops01,store back-office,iptables SNAT uid,2026-10-03,
203.0.113.70,app70,price-check API (own SKUs),docker SNAT,2026-10-05,
203.0.113.241,-,quarantine,-,2026-10-09,removed from rotation after 403 spike
用一个小脚本根据这份文件生成防火墙和SNAT规则,这样文档和线上配置就不会脱节。每月复查一次,有成员离职时也要及时更新。
定期检查每个IP,一旦某个IP开始报错或被列入黑名单,要快速处理。
#!/bin/sh
# Daily DNSBL check for the whole block (use your own recursive resolver;
# some blocklists refuse queries from large public resolvers)
for i in $(seq 2 254); do
ip=203.0.113.$i
rev=$(echo "$ip" | awk -F. '{print $4"."$3"."$2"."$1}')
for bl in zen.spamhaus.org bl.spamcop.net; do
host -W 2 "$rev.$bl" >/dev/null 2>&1 && echo "$(date +%F) $ip listed on $bl"
done
done
# Open connections per source IP (spot a runaway job)
ss -Htn state established | awk '{print $3}' | cut -d: -f1 | sort | uniq -c | sort -rn | head
按市场选国家;如果4核配置成为瓶颈,再单独扩展算力。
先把地址绑定到网卡,再按服务设置源地址:Nginx用proxy_bind,curl用--interface,Python用source_address,或按Linux用户设置SNAT/策略路由。如果都不设置,Linux会使用主IP。
可以。可以为每个容器网络设置一条SNAT规则指向一个住宅IP,也可以用ipvlan L2网络直接把住宅IP分配给容器。IMIDC原生住宅IP服务器提供root权限,两种方式都能用。
做账号运营、验证、API调用和轻量网站通常够用,因为每个IP的流量都不大。但它不适合大文件下载或视频分发,如需其他配置可咨询IMIDC销售。
IMIDC原生住宅IP服务器附带/24共253个原生家庭宽带IPv4,提供root权限,六个国家均可在线下单,台北起价$2,188/月。
准备好做IP分配规划了吗?在原生住宅IP服务器页面选择国家,在IP资源页面对比其他方案;如需路由配置协助、定制IP数量或更高配置,请联系IMIDC销售或提交工单。