Linux iptables 实现负载均衡

379 阅读1分钟

实现思路:

在nat 表之中增加一条规则,如果符合地址范围,那么跳转进入自定义链。自定义链 则利用 statics 模块进行 负载均衡数据转发,转发到具体的某个链。具体的某个链 存储执行地址转换的规则。

步骤:

1:使用docker 创建两个容器 容器的作用是,访问指定端口,返回容器的主机地址。使用容器来模拟主机。

docker run -d -p 8000:8000 --name first -t jwilder/whoami

docker run -d -p 8001:8000 --name second -t jwilder/whoami

2:获得两个容器内 网络命名空间的ip地址

 firstIP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' first)
 secondIp=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' second)

3:创建一条新的链,并添加转发规则

  iptables -t nat -N TRANS_FRONT
  iptables -t nat -I PREROUTING --protocol tcp  --dport 8899   -j TRANS_FRONT

4:创建两条自定义的新链

 iptables -t nat -N TRANS_FIRST
 iptables -t nat -N TRANS_SECOND

5:在TRANS_FRONT链之中,增加规则,使用 statics 模块指定平均跳转的概率

 iptables -t nat -A TRANS_FRONT -m statistic --mode random --probability 0.50000000000 -j TRANS_FIRST

 iptables -t nat -A TRANS_FRONT -m statistic --mode random --probability 1 -j TRANS_SECOND

6:为 TRANS_FIRST TRANS_SECOND 链 增加DNAT 的转换规则

  iptables -t nat -A TRANS_FIRST   --protocol tcp -dport 8899  -j DNAT --to-destination  $firstIP:8000

  iptables -t nat -A TRANS_SECOND  --protocol tcp -dport 8899  -j DNAT --to-destination  $secondIp:8001

7: 多次访问 访问 本机IP地址:8899 , 查看返回结果值 来验证负载均衡

curl 本机ip地址:8899 
curl 本机ip地址:8899