首页 > 代码库 > 负载均衡之iptables/nat模式
负载均衡之iptables/nat模式
Iptables和NAT结合,也能够实现简单的负载均衡。
简介
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这个协议,进来的为8(ping),出去的为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 :3个filter nat mangle
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理
对于filter来讲一般只能做在3个链上:INPUT,FORWARD,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING,OUTPUT,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
Iptables的command说明
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 num:Replays替换/修改第几条规则
格式: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模式