首页 > 代码库 > 负载均衡之iptables/nat模式

负载均衡之iptables/nat模式

IptablesNAT结合,也能够实现简单的负载均衡。

简介

iptables的前身叫ipfirewall(内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

这个工具主要用在防火墙方面,我对防火墙只有一些肤浅的了解,这里主要是要借助iptables做简单的负载均衡。

 

只允许外部网络通过TCP与服务器的80端口建立连接

Iptables –F INPUT

Iptables –A INPUT - i eth0 –p tcp –dport80 –j ACCEPT             

Iptables –P INPUT    DROP

 

小应用

假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?

分析:对于ping这个协议,进来的为8ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来

 

在出去的端口上:iptables -A OUTPUT-p icmp --icmp-type 8 -j ACCEPT

在进来的端口上:iptables -A INPUT -picmp --icmp-type 0 -j ACCEPT

 

小扩展:对于127.0.0.1比较特殊,我们需要明确定义它

                     iptables -AINPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

                     iptables -AOUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

 

实现本机端口重定向

Iptables –t nat –A PREDOUT ING –I eth0 –p tcp –dport80 –j REDIRECT  --to-port 8000

将所有从外部网络进入服务器80端口的请求转移到了8000端口。能够隐藏某些服务的实际端口,也可以将一个端口快速切换到其他端口的服务上,提高端口管理的灵活性。

      

Iptables 负载均衡

首先,要开启服务器被允许转发数据包:

Echo 1 > /proc/sys/net/ipv4/ip_forward

然后,要在作为调度器(负载均衡)执行规则:

Iptables –t nat –A PREDOUTING –I eht0 –p tcp –dport 8001 –j DNAT –to-destination10.0.0.100:80

将调度器外网网卡上8001端口收集的所有请求转发到10.0.0.114这台服务器的80端口;

同样,继续执行

Iptables –t nat –A PREDOUTING –I eht0 –p tcp –dport 8002 –j DNAT –to-destination10.0.0.101:80

 

这两条规则进入了netfilter的过滤表,可以通过iptables命令查看。

我们创建了转发规则,那么数据包已经能够被转发了;但是还少一了数据回来的一步,必须将实际服务器的默认网关设置为NAT服务器。也就是说,NAT服务器必须为实际的服务器网关。

给服务器添加默认网关:

Route add default gw 10.0.0.50

10.0.0.50 NAT服务器地址。

缺陷

这种负载均衡貌似简单,但是没有调度器应该有的调度能力和调度策略,如果有选择,我还是不要用了吧。

 

Iptables 定义规则

        格式:iptables [-t table]COMMAND chain CRETIRIA -j ACTION

               -t table 3filter nat mangle

               COMMAND:定义如何对规则进行管理

               chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的

               CRETIRIA:指定匹配标准

               -j ACTION :指定如何进行处理

 

       对于filter来讲一般只能做在3个链上:INPUTFORWARDOUTPUT

       对于nat来讲一般也只能做在3个链上:PREROUTINGOUTPUTPOSTROUTING

       mangle则是5个链都可以做:PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING

 

Iptablescommand说明

1.链管理命令(这都是立即生效的)

       -P :设置默认策略的(设定默认门是关着的还是开着的)

              默认策略一般只有两种

              iptables -P INPUT(DROP|ACCEPT) 默认是关的/默认是开的

              比如:

              iptables -P INPUT DROP这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。

        -F: FLASH,清空规则链的(注意每个链的管理权限)

           iptables -t nat -F PREROUTING

           iptables -t nat -F 清空nat表的所有链

        -N:NEW 支持用户新建一个链

            iptables -Ninbound_tcp_web表示附在tcp表上用于检查web的。

        -X: 用于删除用户自定义的空链

            使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了

        -E:用来Rename chain主要是用来给用户自定义的链重命名

            -E oldname newname

         -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)

            iptables -Z :清空

 

2.规则管理命令

         -A:追加,在当前链的最后新增一个规则

         -I num : 插入,把当前规则插入为第几条。

            -I 3 :插入为第三条

         -R numReplays替换/修改第几条规则

            格式:iptables -R 3…………

         -D num:删除,明确指定删除第几条规则

       

3.查看管理命令-L

        附加子命令

        -n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。

        -v:显示详细信息

        -vv

        -vvv :越多越详细

        -x:在计数器上显示精确值,不做单位换算

        --line-numbers : 显示规则的行号

        -t nat:显示所有的关卡的信息

      

       进来的拒绝出去的允许,进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去。默认规则都使用拒绝

              iptables -L -n--line-number :查看之前的规则位于第几行

    改写INPUT

        iptables -R INPUT 2 -s172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --stateNEW,ESTABLISHED -j ACCEPT

        iptables -R OUTPUT 1 -mstate --state ESTABLISHED -j ACCEPT

 

    

负载均衡之iptables/nat模式