标题比较晦涩难懂,简单解释下:假如一个服务器有五个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都要利用起来,按照上面的方法,多次操作即可。