iptables基础原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables基础原理相关的知识,希望对你有一定的参考价值。

MF:more fragment,分片标记

DF:don‘t fragment,不能分片

Fragment Offset:片偏移量,第一片为0,报文大小为100,第二片Fragment Offset = 101

TTL:time-to-live,经过网关后减1,为零报文后消失


icmp:Internet Control Message Protocol,互联网控制报文协议,3层半协议。


帧首部 + IP header + TCP header + Http + data


有限状态机:LISTEN,SYN_RCVD,ESTABLISHED

技术分享


linux网络防火墙

Linux2.4后,

netfilter:framework

iptables:数据报文过滤、NAT、mangle等规则生成工具

功能主要根据IP header和TCP header实现的。


防火墙:硬件、软件都可以;规则(匹配规则、处理办法)

技术分享


内部攻击防火墙无法防御。


对于服务器端,拒绝所有未知报文;

    开放:堵

    关闭:通

技术分享


规则

匹配顺序:从上到下匹配,匹配到后不再往下匹配;未匹配到继续向下匹配。

对于两条规则

1)两条规则无关联,则匹配范围大的规则放在上面。

2)两条规则有关联,则较为严格的规则放在上面。


1)匹配标准

    IP:SIP,DIP

    TCP:SPORT,DPORT, SYN=1,FIN=0,RST=0,ACK=0;SYN=1,ACK=1,FIN=0,RST=0; ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)

    UDP:SPORT,DPORT

    ICMP:icmp-type

2)处理动作



hook function: 钩子函数

input

output

forward

        prerouting

postrouting


源地址转换:内网访问公网某个服务器,在报文离开网卡时,进行源地址转换;

目标地址转换:公网服务器回应,在报文刚进入网卡时(在路由决策之前),修改目标地址


"4表5链"

filter(过滤):表

INPUT

OUTPUT

FORWARD


nat(地址转换):表 network address translation

PREROUTING

OUTPUT

POSTROUTING


mangle(拆开、修改、封装):表

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

注意:在input链中,netfilter和mangle的规则的功能不同,可以分类存放,但不能混合存放


raw():

PREROUTING

OUTPUT

技术分享

自定义链

可以将同类的与其他规则无关的规则放入自定义链,可以精简主链,加快执行效率。

1)自定义链在被调用时,发挥作用,若没有被任意一条规则匹配,有返回机制;

2)用户可以删除自定义的空链

3)默认链无法删除


每个规则都有两个内置计数器:

    被匹配的报文个数

    被匹配的报文大小之和


iptables

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

COMMAND

1)管理规则

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

    -I CHAIN [num]:插入在CHAIN上作为第num条规则,不写默认为第一条

    -D CHAIN [num]:删除CHAIN中第num条规则,也可以指定匹配规则

    -R CHAIN [num]:替换指定的规则,也可以指定匹配规则


2)管理链

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

    -P|--policy CHAIN 处理办法: 设定指定链的默认策略;

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

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

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

    -E|--rename-chain old-chain-name new-chain-name: 重命名自定义的链;


3)查看链,不指定-t,默认为filter表

    -L:显示指定表中的规则,此选项会反解主机名,端口号为服务名

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

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

-vv: 

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

--line-numbers: 显示规则号码,service iptables status也可以显示规则号码


匹配标准

1)通用匹配

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

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

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

    -i INTERFACE: 指定数据报文流入的接口,eth0,eth1,lo

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

    -o INTERFACE: 指定数据报文流出的接口,eth0,eth1,lo

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


2)扩展匹配,依赖于扩展模块(.so)

    1))隐含扩展,不用特别指明由哪个模块进行的扩展,因为此时使用-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 tcp -m tcp --dport ,-m tcp省略了,所以称为隐含扩展 

    -p icmp

        --icmp-type 

             0: echo-reply 

             8: echo-request

    -p udp

--sport port[-port]:指定端口,可以是连续的端口,不可以是离散的

        --dport port[-port]:指定端口,可以是连续的端口,不可以是离散的

   

    2))显式扩展,可以使用额外的匹配机制

    -m EXTESSION --spe-opt

        state:状态扩展

            此处是根据IP报文确定的状态,不是TCP报文,结合ip_conntrack追踪会话的状态

            NEW: 新连接请求

            ESTABLISHED:已建立的连接

            INVALID:非法连接

            RELATED:相关联的,和ftp服务有关,首先要装载ip_conntrack_ftp和ip_nat_ftp模块

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


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

    --source-ports

    --destination-ports

    --ports

            连续端口用分号隔开,最多为15个


        iprange:匹配IP范围

            --src-range

            --dst-range

            iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT


        connlimit: 连接数限制,同一个客户端地址同时允许发送请求的限制

    ! --connlimit-above n

       iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j ACCEPT


        limit 令牌桶

    --limit RATE:限制单位时间内流量上限 10/s

    --limit-burst:

        # iptables -R INPUT 3 -d 192.168.8.41 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 15 -m state --state NEW,ESTABLISHED -j ACCEPT,经测试,对外部的ping具有限制,但是ping本机没有限制,果然是通过lo实现的


   string

    --algo {bm|kmp}

    --string "STRING"


rpm -ql iptables 可以查看相关库文件


TARGET EXTENSIONS man帮助检索标记

-j|--jump target处理动作

ACCEPT,放行

DROP,丢弃

REJECT,拒绝,返回错误信息

DNAT,目标地址转换

SNAT,源地址转换

MASQUERADE,地址伪装

REDIRECT,端口重新向

MARK,标记

LOG,日志


iptables不是服务,但有服务脚本;服务脚本的主要作用在于管理、保存规则

装载及移除iptables/netfilter相关的内核模块;

iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack(管理地址转换的连接追踪)


保存规则

# service iptables save

默认位置:/etc/sysconfig/iptables

自定义保存和加载规则

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

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


应用

1、sshd

# iptables -t filter -A INPUT -s 192.168.8.104 -d 192.168.8.41 -p tcp --dport 22 -j ACCEPT

# iptables -t filter -A OUTPUT -s 192.168.8.41 -d 192.168.8.104 -p tcp --sport 22 -j ACCEPT


2、ping使用icmp协议

任何主机可以ping通本机,本机不能ping通任何主机

# iptables -A INPUT -d 192.168.8.41 -p icmp --icmp-type 8 -j ACCEPT

# iptables -A OUTPUT -s 192.168.8.41 -p icmp --icmp-type 0 -j ACCEPT

本机能ping任何主机,任何主机不能ping本机

# iptables -A INPUT -d 192.168.8.41 -p icmp --icmp-type 0 -j ACCEPT

# iptables -A OUTPUT -s 192.168.8.41 -p icmp --icmp-type 8 -j ACCEPT


3、DNS的iptables规则

4条tcp+4条udp,如下图


技术分享


4、反弹式木马

server只开放80端口

server不能主动发送报文,来控制反弹式木马攻击


技术分享

ip_conntrack 根据IP报文进行连接追踪

/proc/net/ip_conntrack 保存了每一个客户端和当前主机建立的连接关系,和会话所处状态

/proc/sys/net/ipv4/ip_conntrack_max 定义ip_conntrack最多同时追踪的连接数目,超过此数目部分连接将会被丢弃

说明:/proc下的内容保存在内存中


为什么ip_conntrack适用于并发比较小的服务器?

对于一个繁忙的服务器,装载modprobe ip_conntrack模块后,此模块会自动追踪用户连接;当超过上面定义的ip_conntrack_max时,ip_conntrack会占用大量的内存空间,并且后续的连接将无法建立。因此此功能只适用于并发比较小的服务器,并且需要调大ip_conntrack_max


iptstate 

    -t:连接数目

 

某些版本的linux上(rhel 5.8),手动加载ip_conntrack后,关闭iptables后,ip_conntrack仍未关闭,此时可以restart iptables后,在service iptables stop 即可关闭ip_conntrack模块的加载。


注意:在ip_conntrack模块未加载情况下,使用以下命令会触发加载ip_conntrack模块

# iptables -t nat -L

如何禁用此模块


5、使用状态追踪对报文的控制

1)sshd

# iptables -A INPUT -d 192.168.8.41 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -s 192.168.8.41 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

注意:模块ip_conntrack、nfnetlink将被加载激活            


2)httpd

# iptables -A INPUT -d 192.168.8.41 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -s 192.168.8.41 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

/proc/sys/net/ipv4/netfilter/定义了连接超时时间

永久有效,在/etc/sysctl.conf下增加条目


3)ping任何主机

# iptables -A INPUT -d 192.168.8.41 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -s 192.168.8.41 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT


6、规则合并

1)Chain OUTPUT (policy DROP 4885 packets, 324K bytes)

num   pkts bytes target     prot opt in     out     source               destination         

1     2444  249K ACCEPT     tcp  --  *      *       192.168.8.41         0.0.0.0/0           tcp spt:22 state ESTABLISHED 

2       69 20743 ACCEPT     tcp  --  *      *       192.168.8.41         0.0.0.0/0           tcp spt:80 state ESTABLISHED 

3        3   252 ACCEPT     icmp --  *      *       192.168.8.41         0.0.0.0/0           icmp type 8 state ESTABLISHED

合并为

# iptables -I OUTPUT 1 -s 192.168.8.41 -m state --state ESTABLISHED -j ACCEPT

放行了所有协议,但是所有端口好像是有点问题


2)# iptables -nvL

Chain INPUT (policy DROP 410 packets, 37516 bytes)

 pkts bytes target     prot opt in     out     source               destination         

   12  1008 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           

 7424  397K ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.8.41        tcp dpt:22 state NEW,ESTABLISHED 

  213 18268 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.8.41        tcp dpt:80 state NEW,ESTABLISHED 

  

为了提高检查效率,只要是EATABLISHED直接放行,NEW的话匹配下面的规则

# iptables -I INPUT -d 192.168.8.41 -p tcp -m state --state ESTABLISHED -j ACCEPT

将NEW也合并

# iptables -I INPUT 2 -d 192.168.8.41 -p tcp -m multiport --destination-ports 22,80 -m state --state NEW -j ACCEPT


7、ftp服务

首先要装载ip_conntrack_ftp和ip_nat_ftp模块

# vim /etc/sysconfig/iptables-config

IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp ip_nat_ftp"

注意:也有可能已经做成了内核模块/lib/modules/2.6.18-398.el5/kernel/net/ipv4/netfilter/ip_conntrack_ftp.ko

添加规则

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

iptables -A OUTPUT -s 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT


8、本机127.0.0.1

# iptables -I INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

# iptables -I OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

或者

# iptables -I INPUT -i lo -j ACCEPT

# iptables -I OUTPUT -o lo -j ACCEPT





来自为知笔记(Wiz)



本文出自 “hiyang” 博客,请务必保留此出处http://hiyang.blog.51cto.com/10728919/1785314

以上是关于iptables基础原理的主要内容,如果未能解决你的问题,请参考以下文章

iptables系列之基础原理

iptables 命令记录

iptables的原理和基本用法

iptables command 常用命令列表

iptables基础知识

iptables基础知识