標題比較晦澀難懂,簡單解釋下:假如一個服務器有五個ip,我們部署了某一個服務,我們可以在配置文件里面修改IP為五個IP,但是服務器始終只有一個出口,最后落地出口還是一個IP,所以我們可以借助Docker,為一個服務綁定一個IP,這樣服務器不管有多少IP,都可以直接利用起來。
流程圖:
普通模式:
優化后:
注意一個最大的問題:程序需要用docker跑。
廢話不多,開整:
先假如機器有五個IP:
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
通過服務器上curl cip.cc可以看到出口IP(舉例):
[root@pds1195 ~]# curl cip.cc
IP : 192.168.1.2
我們將docker綁定ip和指定端口跑起來:
docker run -d --name=speedtest --restart=always -p 192.168.1.2:6688:80/tcp -p -p 192.168.1.2:6688:80/udp ilemonrain/html5-speedtest:alpine
為什么要指定docker綁定的IP?
這個是為了對入口數據進行指定,若只是對出口IP進行限制,可以跳過這一步,直接使用-p綁定端口,然后操作下面的步驟。
然后查看docker的內網ip(docker會在啟動后,指定一個內網ip):
docker inspect speedtest #(speedtest是啟動時候指定的名字,如果未指定,請使用啟動后的顯示的id)
執行后,我們可以在末尾部分找到類似于下面的信息:
"EndpointID": "d5582119d31f9dd929c05a16dea25fa5a7894ac01ccd9f701f741ec47d977551",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"macAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "0e509efa6ad95f89a885838a336fd2d829136fa88a37a17813218e7c8059f8b9",
"EndpointID": "d5582119d31f9dd929c05a16dea25fa5a7894ac01ccd9f701f741ec47d977551",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
里面的"IPAddress": "172.17.0.2"就是內網地址。
接下來,我們將此地址通過iptables的nat方式,映射到指定的ip:192.168.1.2上。
iptables -t nat -I POSTROUTING -p all -s 172.17.0.2 -j SNAT --to-source 192.168.1.2
iptables-save
這樣,程序出口就通過192.168.1.2的ip進行發送。如果五個IP都要利用起來,按照上面的方法,多次操作即可。