一、iptables

    linux的防火墙是由iptables和netfilter组成的,iptables是工作在用户空间的工具,netfilter是工作在内核空间的框架,它由五个被称为钩子的函数组成,分别为 PREROUTING INPUT OUTPUT FORWARD POSTROUTING 。具体的来说共有四张表五个链,也可以自定义链的。四张表为 RAW MANGLE NAT FILTER

能够工作在filter(过滤作用)表上的链有,INPUT OUTPUT FORWARD ,工作在nat(地址转换作用)表上的链有,PREROUTING OUTPUT POSTROUTING ,能够工作在mangle(拆开、修改、封装作用)表上的链有,PREROUTING INPUT FORWARD OUTPUT POSTROUTING,能够工作在raw(保持原样)表上的链有,PREROUTING OUTPUT。iptables不是服务,但有服务脚本;服务脚本的主要作用在于管理保存的规则,

以及装载及移除iptables/netfilter相关的内核模块;共有如下模块iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack。可以通过/proc/net/ip_conntrack查看到当前连接跟踪的情况,可以通过/proc/sys/net/ipv4/ip_conntrack_max更改最大跟踪数,如果超过这个数量就会丢包,而且当访问量很大是容易导致内存被占用过多,且容易发生丢包。在该目录下面/proc/sys/net/ipv4/netfilter/可以更改一下配置,如果想要永久生效,必须写到/etc/sysctl下面,且通过sysctl -p加载。可以通过Iptstate查看当前的跟踪会话。



为什么使用自定义链

可以通过自定义链把具有大访问量的规则放在里面,这样当不是请求自定义链里面的规则就不需要经过自定义链,这样可以提高非自定义链的执行速度。


每个规则都有两个内置的计数器,它们分别记录被匹配的报文个数和被匹配的报文大小之和。

二、规则格式

iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法

匹配标准:

通用匹配

-s, --src: 指定源地址

-d, --dst:指定目标地址

-p {tcp|udp|icmp}:指定协议

-i INTERFACE: 指定数据报文流入的接口

可用于定义标准的链:PREROUTING,INPUT,FORWARD

-o INTERFACE: 指定数据报文流出的接口

可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD

扩展匹配(通过扩展模块提供匹配功能)

隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}

                        -p tcp

--sport PORT[-PORT]: 源端口

--dport PORT[-PORT]: 目标端口

--tcp-flags mask comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;

--tcp-flags SYN,FIN,ACK,RST SYN = --syn

--syn

-p icmp

--icmp-type 

0: echo-reply 回复

8: echo-request 请求

-p udp

--sport

--dport


显式扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能

-m EXTESTION --spe-opt


state: 状态扩展

结合ip_conntrack追踪会话的状态

NEW: 新连接请求

ESTABLISHED:已建立的连接

INVALID:非法连接

RELATED:相关联的

-m state --state NEW,ESTABLISHED -j ACCEPT


首先要装载ip_conntrack_ftp和ip_nat_ftp模块


iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT


multiport: 离散的多端口匹配扩展

--source-ports

--destination-ports

--ports

-m multiport --destination-ports 21,22,80 -j ACCEPT


                        -m iprange ip地址范围匹配

                                --src-range

                                --dst-range

                        -m connlimit 连接数限制

                              !  --connlimit-above n 通过accept达到最大连接数限制 

                            

                         -m limit

                                --limit rate

                                --limit-burst

命令:

管理规则

-A:附加一条规则,添加在链的尾部

-I CHAIN [num]: 插入一条规则,插入为对应CHAIN上的第num条;

-D CHAIN [num]: 删除指定链中的第num条规则;

-R CHAIN [num]: 替换指定的规则;

管理链:

-F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链

-P CHAIN: 设定指定链的默认策略;

-N:自定义一个新的空链

-X: 删除一个自定义的空链

-Z:置零指定链中所有规则的计数器;

-E: 重命名自定义的链;

查看类:

-L: 显示指定表中的规则;

-n: 以数字格式显示主机地址和端口号;

-v: 显示链及规则的详细信息

-vv: 

-x: 显示计数器的精确值

--line-numbers: 显示规则号码


动作(target):

ACCEPT:放行

DROP:丢弃

REJECT:拒绝

DNAT:目标地址转换

SNAT:源地址转换

REDIRECT:端口重定向

MASQUERADE:地址伪装

LOG:日志

MARK:打标记


保存规则的方法:

 service iptables save 执行后把规则保存在/etc/sysconfig/iptables

 iptables-save > /etc/sysconfig/iptables.2013041801

 iptables-restore < /etc/sysconfig/iptables.2013041801

        必须把规则保存在/etc/sysconfig/iptables中才能在开机重启后及时生效


三、关于单个链上多个表的优先级

    prerouting链上:raw>mangle>nat

    input链上:mangle>filter

    output链上:raw>mangle>nat>filter

    forward链上:mangle>filter>

    postrouting链上:mangle>nat



四、应用

    

1、开放FTP服务

    ip_nat_ftp ip_conntrack_ftp 

    vim /etc/sysconfig/iptables-config 添加IPTABLES_MODULES="ip_nat_ftp ipconntrack_ftp"

    iptables -t filter -A INPUT -d 192.168.10.22 -p tcp -m state --state ESTABLISHED,RELATED -j accept

    iptables -A OUTPUT -s 192.168.10.22 -p tcp -m state --state ESTABLISHED,RELATED -j accept

    RELATED这个状态是专门给FTP用的


2、开放WEB服务

    iptables -A INPUT -d 192.168.10.22 -p tcp --dport 80 -mstate --state NEW,ESTABLISHED

-j accept 

 iptables -A OUTPUT -s 192.168.10.22 -p tcp --sport 80 -mstate --state NEW,ESTABLISHED

-j accept


3、合并ESTABLESHED

    iptables -I INPUT -d 192.168.10.22 -p tcp -m state --state ESTABLISHED,RELATED

    

4、多端口的合并

    iptables -A INPUT -d 192.168.10.22 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j accept



5、通过扩展模块,完成地址段的放行,支持!取反

    iptables -A INPUT -p tcp -m iprange --src-range 192.168.10.1-192.168.10.22  --dport 22 -m state --state NEW,ESTABLISHED 


6、最大连接数限制

    iptables -A INPUT -d 192.168.10.22 -p tcp --dport 80 -m connlimit ! --connlimit-above 2

-j accept 


7、

    iptables -A INPUT -d 192.168.10.22 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 3 -j accept

    每分钟3个,每次共处理3个


8、新建链表

    iptables -N hailang

    iptables -A hailang -d 255.255.255.255  -p icmp -j DROP

    iptables -A hailang -d 192.168.16.22 -j RETURN 处理完后返回调用处

    iptables -I INPUT -j hailang 调用hailang自定义表