Iptables学习笔记

混江龙づ霸主 提交于 2020-04-06 03:38:25

Iptables

    Firewall:隔离工具,packets filter firewall(包过滤防火墙);工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文进行某预定义的处理机制的一套组件;

    硬件防火墙:在硬件级别实现部分过滤功能的防火墙,另外一部分功能基于软件实现;

    软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;

 

    主机防火墙:服务范围为当前主机;

    网络防火墙:服务范围为防火墙背后的局域网;

 

Iptables/netfilter: 防火墙是在内核中实现的;

    Netfilter:防火墙框架,framework;位于内核空间;

    Iptables:命令行工具程序,位于用户空间,仅仅是规则管理工具;说白了就是在netfilter的门上放检测机制的;

    

    Netfilter:

        Hooks function:钩子函数;

            Prerouting:路由之前

Input:

            Forward:

            Output:

            Postrouting:路由之后;

 

    Iptables:

        CHAINS链

            PREROUTING

            INPUT

            FORWARD

            OUTPUT

            POSTROUTING

 

    报文流向:

        到本机某进程的报文先进入PEROUTINGàINPUT

        由本机转发的报文先进入PEROUTINGàFORWARDàPOSTROUTING        

由本机某进程发出的报文:OUTINGàPOSTROUTING

 

Tables:

    Filter:过滤;

    Nat:network address translate,网络地址转换;

    Mangle:拆解报文,做出修改,并重新封装,通常用来做防火墙标记;

    Raw:关闭nat表上启用的连接追踪机制;

            

    优先级次序(由高而低):

        Rawàmangleànatàfilter

    功能和钩子的对应关系:

        Raw:只适用于PREROUTING和OUTPUT;

        Mangle:PREROUTINGàINPUTàFORWARDàOUTPUTàPOSTROUTING,都适用;

        Nat:只适用于PREROUTING,INPUT,OUTPUT,POSTROUTING;

        Filter:只适用于INPUT,FORWARD,OUTPUT;

        

Iptables规则的组成部分:

    匹配条件:

        网络层首部:source ip,destination ip;

        传输层首部:source port,destination port;

        扩展检查机制:

    处理动作:target

        ACCEPT允许, DROP丢弃, REJECT拒绝,

 

A请求b同步; b同意并请求a也同步;建立连接;三次握手;

四次断开:

    A请求与b的链接断开,b同意断开;但是b不会同时请求说把我发给你的请求也断开,为什么这么做呢?因为我们的TCP协议允许半链接,也就是,a能发,b能收,但是没有b发a收这一段;因此在断开的时候可以只断开一半;这一就是为什么断开需要4次;

 

对于iptables来讲,真正能生效的是规则;规则是在用户空间编写的然后送往内核中的,那么送往内核的何处了呢?我们的规则是在什么时候生效的?很显然内核如果能接受数据那一定是运行中的内核,而不是磁盘上的内核文件,那运行中的内核在哪呢?在内存中还是磁盘上?很显然是在内存中,iptables所编写的规则是送往内存中的内核上的,那么这些规则在服务器重启之后将会消失不见,所以为了能让我们下一次重启计算机后依然有规则可用,要将规则保存在配置文件中;

 

安装:

    Netfilter:位于内核中的tcp/ip协议栈报文处理框架;

    Iptables:

        Centos5/6:iptables命令编写规则;

                Iptables –t filter –F

                Service iptables save

        Centos7:firewalld;firewall-cmd,firewall-config

                Systemctl stop firewalld

Systemctl disable firewalld 第二个视频15:00左右再听一遍

 

程序包:iptables;iptstatus(非必要,状态追踪器)

 

Iptables命令:

    规则:根据制定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则规则后面指定的处理动作进行处理;

    匹配条件:源地址,目标地址,传输层协议

    扩展匹配条件:需要借助于扩展模块进行制定的匹配条件

  1. 隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;
  2. 显式扩展:隐式扩展之外的其他扩展匹配条件;

处理动作:

基本动作:ACCEPT,DROP

        扩展动作:需要借助于扩展模块进行,但无需显式制定,仅需指明动作;

    添加规则时需要考量的问题:

  1. 报文流经的位置:用于判断将规则添加至哪个链,
  2. 要确定实现的功能:用于判断将规则添加至哪个表;
  3. 报文的方向:用于判断哪个为源,哪个为目标;
  4. 指定的匹配条件:用于编写能够正确匹配目标报文的规则;

 

Iptables命令的使用格式:

    iptables [-t table] {-A|-C|-D} chain rule-specification

 

iptables [-t table] -I chain [rulenum] rule-specification

 

iptables [-t table] -R chain rulenum rule-specification

 

iptables [-t table] -D chain rulenum

 

iptables [-t table] -S [chain [rulenum]]

 

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

 

iptables [-t table] -N chain

 

iptables [-t table] -X [chain]

 

iptables [-t table] -P chain target

 

iptables [-t table] -E old-chain-name new-chain-name

 

        rule-specification = [matches...] [target]

 

        match = -m matchname [per-match-options] 扩展条件,可省略;

 

        target = -j targetname [per-target-options] 指明处理动作;

    

    规则管理格式:

        Iptables [-t table] COMMAND chain criteria [-m matchname [per-match-options]] [-j targetname [per-target-options]]

                -t 指定将规则写在哪张表上;

                COMMAND    子命令

                -m 指定扩展条件;

                -j 指明处理动作;

    

    -t talbe:指明要管理的表,默认为filter;

    COMMANDS:

        链管理:

            -P iptables [-t table] -P chain target,定义链的默认策略;其target一般可使用ACCEPT或DROP;

            -N    iptables [-t table] -N chain 新建一条自定义链,但是自定义链默认是不会被引用的;仅在默认链上通过某规则进行调用方可生效;因此,每个自定义链都有其引用计数;

    pkts:表示由此规则所匹配到的报文的个数;

    bytes:表示由此规则所匹配到的包的大小之和;

    target:表示该规则的目标;

    prot:protocol,表示该规则所匹配的协议;

    opt:选项

    in:表示从哪个网卡接口流进来;

    out:表示报文由哪个网卡接口流出;

    source:源地址;

    destination:目标地址;

    (policy ACCEPT 870 packets, 131K bytes):如果报文没有被规则匹配到,则默认由默认策略所匹配(policy ACCEPT)被默认策略所匹配的包有870个,这870个包的大小之和有131个字节;

    示例:CentOS 7

        Yum install httpd vsftpd telnet-server samba –y

        Iptables –t filter –P INPUT DROP 更改默认策略为DROP

    

    此时,input规则链的默认规则就是DROP,由于我们没有写任何规则,也就意味着我们没有放行任何人的请求,所以这时候,所有的请求都会被阻断;

    如何自定义链:

        Iptables –t filter –N in_web

    这时候就多了一个链in_web,表示放开所有跟web相关的报文,最好见名知意;这时候就没有默认规则了,而是(0 references)0此引用,表示没有被引用;

            -X iptables [-t table] -X [chain],表示删除自定义链规则,如果没有加制定的自定义链,则表示将所有自定义链删除;并且只能删除自定义的空的应用计数为0的链;

            -F iptables [-t table] -F [chain [rulenum]] [options...],清空制定的链或删除指定链上的规则;CentOS6和7的语法可能不同;

            -E iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为0的链;

             -Z iptables [-t table] -Z [chain [rulenum]] [options...] 至零计数器;

规则:

        -A:append,iptables [-t table] -A chain rule-specification,表示追加规则到指定的链;

        -I:insert,iptables [-t table] -I chain [rulenum] rule-specification,插入规则,到指定的链中的指定位置,默认为链首;

-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum;删除指定的链上的指定规则;方式有两种,删除时指明匹配条件也可以指明规则号码进行匹配;

        -R:replace;iptables [-t table] -R chain rulenum rule-specification;表示将指定的链的指定的规则替换为为新的规则;

        查看:

            -L:list;iptables [-t table] -L [chain [rulenum]] [options...];表示列出规则;

                    -n:表示数字格式显示,如果不写,iptables则试图把每一个地址反解为主机名;

                    -v:verbose;详细显示格式信息;

                    --line-numbers:显示链上的规则编号;

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

        计数器:

            每条规则以及链的默认策略分别有各自的两个计数器:

  1. 匹配到的报文的个数:pkts;
  2. 匹配到的所有报文的大小之和:bytes;    

 

 

 

Iptables(2)

    匹配条件:

        基本匹配条件:

        扩展匹配条件:

            隐式扩展:

            显式扩展:

    

    注意:多重条件之间隐含逻辑为"与"操作;必须要同时满足;

    

    基本匹配条件:

    PARAMETERS

        [!] -s, --source address[/mask][,...] 检查报文中的源ip地址是否符合此处制定的地址或地址范围;"!"号表示取反;一次有多个地址或地址块可以用逗号隔开;但是不要加空格,会报语法错误;

        实例:

    

    上图中,input链的默认规则是drop的,但是允许10.10.3.0/24网段的主机访问该主机的所有服务;

    

    这时候,该规则的计数器开始有了数据;

 

实例2:

iptables -t filter -I INPUT -s 10.10.3.36 -j REJECT

    

    上图的规则意思为拒绝10.10.3.0/24网段的10.10.3.36主机访问本机的任何服务;

    不同类别的规则,应该把访问比较频繁的服务对应的规则放前面;对于同一类别的服务,要把匹配范围较小的放前面,匹配范围较大的放后面;

    条件替换
    

    将之前的REJECT修改为DROP;数字1代表第一条规则;

    如果动作是DROP:请求主机会等待访问主机的回应;如果动作是REJECT,则访问主机会直接拒绝请求主机的请求,并给予回应;

 

查看规则号码

 

删除规则

    指明规则号

    

    指明匹配条件

    

 

[!] -d, --destination address[/mask][,...] 检查报文中的目标ip地址是否符合此处指定的地址或地址范围;

    

[!] -p, --protocol protocol 检查报文中传输层的协议类型支持tcp,udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or the special keyword "all"

 

实例:

    iptables -A INPUT -s 10.10.3.0/24 -d 10.10.3.36 -p tcp -j ACCEPT

    不但指定了源地址和目标地址而且还指定了只允许tcp协议通过,这时候,可以访问该主机的web服务,但是其他的服务则无法提供,例如ping;

 

[!] -i, --in-interface name 检查报文进入本机时的接口是否符合本处指定的接口;仅适用于INPUT , FORWARD and PREROUTING;

 

[!] -o, --out-interface name 检查报文即将离开本机时经由的接口是否符合本处指定的接口;仅适用于FORWARD , OUTPUT and POSTROUTING;

    

-m, --match match 显式指明要使用的扩展模块;

 

-j, --jump target 指明要处理的动作,也可以是用户自定义的链,如果要使用的内建的链,有两种情形,可以是简单target也可是时扩展target;

 

 

扩展匹配条件

隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展,此处主要指使用-p{tcp/udp/icmp}给定协议后可直接对给定的协议所进行的扩展;

    -m tcp;-m udp;-m icmp

检查tcp udp icmp首部;

 

    在CentOS7上需要man iptables-extensions来获取;

-p tcp:可直接使用tcp协议对应的扩展选项;

    [!] --source-port,--sport port[:port] 匹配报文中的传输层的源端口;可给出多个连续的端口;

 

    [!] --destination-port,--dport port[:port] 匹配报文中的传输层的目标端口;可给出多个连续的端口;

 

实例:

    只开放本机的ssh服务给本地网络

    上图中的-m tcp 是可以省略的;

    上图中,将input和output的默认策略都改为DROP就不会担心将自己挡在外面了;

 

[!] --tcp-flags mask comp 标志位的检查机制

        Mask 掩码

        Comp 比较值

    标志位:SYN ACK FIN RST URG PSH;

        Mask:要检查的标志位列表,以逗号分隔;例如:--tcp-fags SYN,ACK,FIN,RST

        Comp:mask给定的众标志位中,其值必须为1的标志位列表;余下的必须为0;

                    --tcp-flags SYN,ACK,FIN,RST,SYN;

    简写格式:[!] –syn,就相当于--tcp-flags SYN,RST,ACK,FIN SYN

 

-p udp:可直接使用udp协议对用的扩展选项;

    [!] --source-port,--sport port[:port] 匹配报文中的传输层的源端口;可给出多个连续的端口;

 

    [!] --destination-port,--dport port[:port] 匹配报文中的传输层的目标端口;可给出多个连续的端口

-p icmp:可直接使用icmp协议对应的扩展选项;

    [!] --icmp-type {type[/code]|typename}

        --icmp-type 0/0:匹配对ping请求的响应报文;

        --icmp-type 8/0:匹配ping请求报文

 

开放本机的ping请求报文;允许别人ping本机;

iptables -A INPUT -s 10.10.3.0/24 -d 10.10.3.79 -p icmp --icmp-type 8/0 -j ACCEPT

开放10.10.3.0/24网段的地址可以对10.10.3.79进行ping;但是现在ping报文能进来,但是出不去;

    上图中可以看见,只有10.10.3.44这台主机进来的ping报文,没有出去的,所以也是ping不通的;

开放本机的ping响应报文;

iptables -A OUTPUT -d 10.10.3.0/24 -s 10.10.3.79 -p icmp --icmp-type 0/0 -j ACCEPT

    上图所示当开放了本机的ping响应报文后,通过抓包看见本机已经响应了10.10.3.44的ping报文;

 

    这时候别人ping本机可以ping通,但是本机向外ping不通;是因为我们仅允许响应报文出栈,没有允许请求报文出栈;

要求本机能ping任何网络

    iptables -A OUTPUT -s 10.10.3.79 -d 0.0.0.0/0 -p icmp --icmp-type 8 -j ACCEPT

    现在报文能出去,但是进不来;

iptables -A INPUT -d 10.10.3.79 -s 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT

现在本机向外ping的报文就能出去了;

 

 

显式扩展:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;

  1. Multiport:

    以离散或连续的方式定义的多端口匹配条件;Up to 15 ports can be specified最多只允许给出15个端口;A port range (port:port) counts as two ports. It can only be used in conjunction with one of the following protocols: tcp, udp, udplite, dccp and sctp.指明端口匹配的条件是port:port,被记为两个端口;

    [!] --source-ports,--sports port[,port|,port:port]...指定多个源端口

            Port,port 表示连续

            Port:port 表示离散

        [!] --destination-ports,--dports port[,port|,port:port]...指定多个目标端口

 

[!] --ports port[,port|,port:port]... 匹配此处指定的源目标端口

 

实例:

    开放本机的22 23 80端口

上图中一条规则,开放3条服务;

 

2.Iprange

以连续的ip地址范围指明多地址匹配条件;

[!] --src-range from[-to] 匹配源地址

From to就表示从哪个地址开始到哪个地址结束之间的连续的地址范围;

[!] --dst-range from[-to] 匹配目标地址

 

3. string

对报文中的应用层数据做字符串匹配检测;

[!] --string pattern

[!] --hex-string pattern 为了在匹配时性能更好,效率更高,可以将字符串做16进制编码进行匹配;

--algo {bm|kmp} 字符串匹配检查算法;bm和kmp算法性能不相上下;

--from offset

--to offset

From和to可以指定检查报文的某段;而不用检查整个报文,不指定则检查整个请求报文;

 

Iptables –I OUTPUT –s 192.168.0.102 –d 0.0.0.0/0 –p tcp --dport 80 –m string --string "test"--algo bm -j REJECT

表示当主机192.168.0.102去访问web页面时,返回的报文中如果包含test字样的报文则不被放行;

 

4.Time

根据报文到达的时间与指定的时间范围进行匹配度检测;

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 开始时间

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束时间

--timestart hh:mm[:ss] 每天的几点几分几秒开始

--timestop hh:mm[:ss] 每天的几点几分几秒结束

[!] --monthdays day[,day...] 每月哪几天的时间段

[!] --weekdays day[,day...] 每周哪几天的时间段

 

拒绝该主机的telnet服务在非工作时间访问;

Iptables –I INPUT –d 192.168.0.102 –p tcp –dport 23 –m time –timestart 16:00:01 --timestop 09:59:59 –weekdays Wed –j REJECT

拒绝其他主机在星期3的下午4点到第二天9点59分使用telnet连接192.168.0.102主机;

 

5.connlimit

根据每客户端IP做并发连接数限制,即限制单IP可同时发起的连接请求;

--connlimit-upto n 连接数上限;

--connlimit-above n 连接数下限

 

Iptables –I INPUT –d 192.168.0.102 –p tcp –dport 22 –m connlimit –connlimit-above 2 - j REJECT

外部同一台主机最多能起的ssh连接数是两个,超过两个则被阻断;

 

6.limit

基于收发报文的速率进行匹配;

--limit rate[/second|/minute|/hour|/day]

--limit-burst number

 

Iptables –A INPUT –d 192.168.0.102 –p icmp –icmp-type 8 –m limit –limit-burst 3 –limit 20/minute –j ACCEPT

指定ping请求是8,-m做速率限制,峰值速率为3个,速率为每分钟20个,只要在这个范围内则允许;前三个没有时间限制,后面的每3秒一个;

Iptables –A OUTPUT –s 192.168.0.102 –p icmp –icmp-type 0 –j ACCEPT

放行icmp报文的出向;

 

7.state

    [!] --state state

    状态检测:连接追踪机制(conntrack)

我们的iptables或者netfilter能够在内核当中的某段内存上用一个哈希表记录下来每一个连接的源ip,目标ip,源端口,目标端口,什么时候与本机建立了连接?已经持续了多长时间,这个哈希表中会记录得清清楚楚,那么记录下来以后,再有一个新的请求到达时,我们跟该表相比较,如果这个源地址和源端口都存在了,我们就认为这个连接此前是来过的;

每一个新的请求到达时,我们都将其记录在该表上,那也就意味着每一个连接请求到达时,我们就先检查该表,看看有没有跟这个请求的源端口,源ip,目标端口,目标ip相匹配的,如果有,就表明其此前访问过,如果没有,就将其加入该表中;

一个能够检查连接到达时是否此前访问过的功能就叫做连接追踪;很显然,连接追踪需要一段内存空间来存储,这段内存空间是有固定大小的,能存多少条也是确定的,在该表中的每一个条目都有一个计时器,一旦时间到了,将被自动删除;如果该表的空间满了,也没有超时,则新的请求进来则无法对其追踪,则该新请求会被拒绝;所以当我们启用连接追踪功能以后,如果本机的并发访问数量非常大的话,会导致某些请求会被拒绝服务;

我们连接追踪到的内容放在/proc/net/nf_conntrack文件当中,那么到底能存多少个追踪条目呢?取决于这个文件/proc/sys/net/nf_conntrack_max;具体能有多大,取决于服务器的内存大小,该大小是可以调整的;

 

    连接追踪机制有这么几个状态:

        New:一个新连接

        ESTABLISHED:已建立的链接

        RELATED:相关联的连接

        INVALID:无法识别的连接

        UNTRACKED:未被追踪的连接

 

要想完成连接追踪功能,我们得使用一个内核模块,nf_conntrack;在CentOS6和7上可能名称不一样;

如果我们能够用lsmod |grep nf_conntrack能看到该模块,则表示连接追踪功能有效了,

 

    Nf_conntrack模块只能追踪正常状态的连接,不能追踪那些相关联状态的连接,要想追踪那些ftp的数据连接和命令连接,我们还需要另外一个模块nf_conntrack_ftp,是专门用于实现追踪related状态的,该模块默认是不会被装载的,要想追踪related状态,需要手动装入;

相关内核模块:

    nf_conntrack

    nf_conntrack_ipv4

    nf_conntrack_ftp

 

不同的协议的链接追踪时长:

    /proc/sys/net/netfilter/

 

 

    比如我们做了防火墙,屏蔽了除80以外的所有端口,那很显然,该80端口可以接收请求进来,也可以响应出去,但是有可能是我们的服务器被被别人种下一个木马,这个木马扫描了宿主机发现只有80端口是开放的,所以该木马通过80端口偷偷的出去连接它的控制端,这会从80端口真正的发起一个连接出去,但这一定是非正常状态,在我们服务器正常工作状态下决不允许这种情况发生的,为了使我们的服务器更加安全,我们可以这样设置规则,我们的80端口只允许进来为new的连接请求,出去的只能是ESTABLISHED;只要有别人请求进来,服务器给予响应,响应时它就是ESTABLISHED,但是只有第一次请求才为NEW,第二次请求也是ESTABLISHED,因此,入栈时我们允许为NEW,ESTABLISHED,但是出去的只允许为ESTABLSHED,像这种反弹式木马就没办法做到悄悄地通过80端口去连接它的控制端;这样防火墙将变得更加安全;

    我们也可以这么认为,如果我们的默认策略统统为DROP时,那么任何一个能进来的,我们都应该让它出去,任何一个能进来时,当它出去为ESTABLISHED都放行有危险吗?没有危险,一般来讲,状态为ESTABLISHED,一定是对某个请求的响应,假设在这种状态之下,我们可以仅允许OUTPUT时为ESTABLISHED状态,不管是什么连接,凡是ESTABLISHED状态的统统放行,这时候一条规则就能放行所有服务了,实现了规则优化的目的,当然有了连接追踪以后,我们还可以放行被动模式的ftp服务了,我只开放21号端口,别人请求响应都正常,但是,当数据连接来的时候,被动模式下,客户端会请求服务器的随机端口,防火墙不可能开放这些端口,但是我能判断出这个连接是RELATED,所以这个时候就检查状态,如果它请求的是我的随机端口,但是状态为RELATED,我们就放行,而不用开放这一端口,基于状态连接就能达到数据连接的目的,而不用开放端口;

 

实例:默认input和output都是DROP;

    本机的ssh/web/ftp服务,我们允许别人来访问,但是我们绝不允许别人通过22,23,80端口主动连接别人;

iptables –A INPUT –d 192.168.0.102 –p tcp –m multiport --dport 22,23,80 –m state --state NEW,ESTABLISHED –j ACCEPT

 

iptables –A OUTPUT –m state --state ESTABLISHED –j ACCEPT

 

假如我允许别人ping本机,

iptables –A INPUT –d 192.168.0.102 –p icmp --icmp-type 8 –m state --state NEW,ESTABLISHED –j ACCEPT

 

我对所有协议都检查状态,你只要是ESTABLISHED的都放行;这时候我们就可以集中精力好好研究放行入栈的请求了;

 

那么如和开放本机的ftp服务呢?

iptables –I INPUT –m state --state ESTABLISHED –j ACCEPT

 

iptables –R INPUT 2 –d 192.168.0.102 –p tcp –m multiport –dports 21:23,80 –m state --state NEW –j ACCEPT

 

iptables –R INPUT 1 –m state --state RELATED,ESTABLISHED –j ACCEPT

 

systemctl start vsftpd.service     启动vsftpd.service服务

 

另一台主机上:lftp 192.168.0.102

    发现访问不了;

    

lsmod |grep ftp 追踪ftp的模块没有被装载;

 

modprobe nf_conntrack_ftp 装载模块;

 

断开lftp连接,再次请求,则成功;

 

 

如何开放被动模式的ftp服务:

    装载追踪ftp协议的模块

        modprobe nf_conntrack_ftp

 

    

 

放行入栈命令连接

        iptables –A INPUT –d SERVER-IP –p tcp --dport 21 –m state --state NEW,ESTABLISHED –j ACCEPT

 

    放行入栈数据连接

iptables –A INPUT –d SERVER-IP –p tcp –m state --state RELATED,ESTABLISHED –j ACCEPT

 

    放行出栈连接

iptables –A OUTPUT –s SERVER-IP –m state --state ESTABLISHED –j ACCEPT

 

 

处理动作:

    -j targetname [per-target-options]

        简单target

            ACCEPT DROP

        扩展target

            REJECT

             --reject-with type 指明拒绝理由

    icmp-net-unreachable     网络不可达

    icmp-host-unreachable     主机不可达

    icmp-port-unreachable     端口不可达

icmp-proto-unreachable    协议不可达

                icmp-net-prohibited        网络被禁止

                icmp-host-prohibited     主机被禁止

                icmp-admin-prohibited    管理被禁止

默认为:icmp-port-unreachable

 

            LOG

turn on kernel logging of matching packets.打开内核中匹配报文的日志记录功能;

--log-level level        指明日志级别

                        emerg, alert, crit, error, warning,notice, info or debug.

                --log-prefix prefix 日志信息的前导信息;

                

iptables –I INPUT 2 –d 192.168.0.102 –p tcp --dport 22 –j LOG --log-prefix "openssh from kernel" 加到第2条,只记录NEW状态的信息;

然后在/var/log/messages中就可以找到其log信息;

 

 

保存和载入规则

    iptables-save

在CentOS7中,要以输出重定向的方式保存规则;

            iptables-save > /etc/sysconfig/iptables CentOS7中,该文件默认不存在,文件名可以自定义,能做到见名知意;

        在CentOS6中,该文件默认是存在的,保存方式为service iptables save;

    iptables-restore

在CentOS7中,可以将保存的各种不同应用场景的iptables规则文件以输入重定向的方式将其重载回iptables,但是之前的就会被覆盖

        iptables-restore < /etc/sysconfig/iptables

            -n, --noflush 不清除原有规则

            -t, --test 仅分析生成规则集,但不予提交;

 

CentOS 6:

    保存规则:service iptables save

        保存规则与/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;

    重载规则:service iptables restart

        默认重载/etc/sysconfig/iptables文件中的规则

    脚本配置文件:/etc/sysconfig/iptables-config

        可以用于指明要装在的模块,比如说nt_conntrock_ftp;

 

CentOS 7开机自动生效规则:

  1. firewalld服务;
  2. shell脚本,直接记录iptables命令;
  3. 自定义unit file或init script;

 

 

规则优化思路:

  1. 优先放行双方向状态为ESTABLISHED的报文;
  2. 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
  3. 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
  4. 设置默认策略:白名单机制;
    1. 可使用iptables –P设定默认策略;
    2. 建议在规则链的最后定义规则作为默认策略;

 

 

iptables/netfilter

    主机防火墙主要工作在呢他filter的input和output链上,因为他们主要作用在于主机内部的某一进程进行通信,一个外来的报文要想到达本机,得先经由input链,但是在到达input链之前要先到达prerouting,但是prerouting跟过滤功能没有重叠关系,因此在到达本机的外来报文的过滤功能只能在input上实现,本地主机与外部通信,则经由output和postrouting,但是在postrouting上无法实现过滤功能;

    forword的主要作用在于,所有经由本机的一个接口进来的报文,在本地路由功能发生决策以后,发现目标地址不是本机,我们需要帮忙转发至其他网络当中去,这种应用场景我们称之为转发功能;而转发时的报文势必要经由forword链,但是除了这个链,它会经由3条链,分别是刚刚进入本机的preroutingà到达本机路由决策以后,发现目标非本地,如果打开本机的核心转发功能则

 

 

 

 

实验环境:

    

192.168.22.2 192.168.22.1 10.1.0.6 10.1.0.67

(1)打开firewall的核心转发功能;并且分别在内网和外网上配置http服务,并且能互相访问;echo 1 > /proc/sys/net/ipv4/ip_forward

 

(2)iptables –A FORWARD –j DROP

 

(3)放开由内而外的服务

iptables –I FORWARD –s 192.168.22.0/24 –p tcp --dport 80 –j ACCEPT

这只是放行了请求报文出去,所以任然内网不能访问外网;

iptables –I FORWARD –d 192.168.22.0/24 –p tcp --sport 80 –j ACCEPT

放行进来的报文,这时候内网就能访问外网了;

 

使用状态追踪;

iptables –D FORWARD 2 删除刚才放行进来报文的规则;

 

添加凡是响应报文我们都放行;

iptables –I FORWARD –m state --state ESTABLISHED –j ACCEPT

 

开放内网主机ssh连接外网主机

iptables –R FORWARD 2 –s 192.168.22.0/24 –p tcp –m multiport --dport 80,22,23,21 –m state --state NEW –j ACCEPT

 

这时候80和ssh是正常的,但是要想让ftp服务正常服务,必须打开related服务;

装载模块:modprobe nf_conntrack_ftp;

 

iptables –R FORWARD 1 –m state --state ESTABLISHED,RELATED –j ACCEPT

 

现在由内而外请求ftp就可以正常进行了;lftp 10.1.0.67

 

    iptables/netfilter网络防火墙:

        添加规则与forward链,注意几个问题:

            (1)请求和响应报文均会经由FORWARD链,要注意规则的方向性;

(2)如果可以启用conntrack机制,注意网关主机所能够追踪的连接数的最大数量要符合要求;

 

 

NAT    :地址转换

    当内网想访问外网的时候,源IP是1的ip,目标ip是internet的任意主机ip4,这时候源ip和目标ip不在同一个网段,则内网报文发给网关ip2;ip2经由本机路由表查询发现该报文需要经由ip3发出去,于是该报文在路由完以后就扔给ip3的消息队列了,ip3拿到这个报文向外发送的时候,得先改地址,再发送,所以这个报文马上被外网网卡发出去之前将地址做修改,怎么改呢?当报文送达到ip3的时候,源ip是ip3,目标ip是ip4.        

    外网回应的时候,响应报文发送时,源ip是ip4,目标地址是ip3,当ip3收到报文之后就去查NAT表,查到此前是由某一个ip1访问了ip4的,因此该报文送达到本机的网卡之后,在路由发生之前要将目标地址修改为ip1,源ip修改为ip2,

 

    源地址转换:SNAT POSTROUTING

        静态转换:外网地址是固定的;

        动态转换:外网地址是不固定的,需要临时探测外网地址是什么然后转换;

    This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.只能放在nat表上,仅支持POSTROUTING或INPUT;

--to-source [ipaddr[-ipaddr]]

实例:

iptables –t nat –A POSTROUTING –s 192.168.22.0/24 –j SNAT --to-source 10.1.0.6

将内网地址出去的时候转换为公网地址10.1.0.6出去;

用192.168.22.0/24段的地址ping10.1.0.67,在67上tcpdump会发现是10.1.0.6在ping;

在10.1.0.6上的内网网卡上抓包会发现是192.168.22.0/24位的地址在ping;

也可以查看日志/var/log/httpd/access_log

 

MASQUERADE 地址伪装

    This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.

    MASQUERADE可以实现动态转换之目的,它知道当内网中的主机发出访问请求时,通过哪一块网卡出去,而且会自动找到那个网卡上已生效的ip地址,将其作为源地址,因此可以不用使用--to-source 而去自行判断用哪个;这时候就有问题了,每一次请求到达时我们得看看到底哪个地址可用。因此在访问量较大时会很影响性能;

--to-ports port[-port]

 

 

 

 

 

 

 

    目标地址转换:DNAT PREROUTING

This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

--to-destination [ipaddr[-ipaddr]][:port[-port]]

 

实例

iptables –t nat –A PREROUTING –d 10.1.0.6 –p tcp --dport 80 –j DNAT --to-destination 192.168.22.2:80

    后面冒号的80可以不用写,表示,目标地址是80,转换时也是80;

 

iptables –t NAT –A PREROUTING –d 10.1.0.6 –p tcp --dport 22022 –j DNAT --to-destination 192.168.22.3:22

当外网主机访问10.1.0.6:22022的ssh服务时,则被转换为192.168.22.3:22的ssh服务,达到隐藏内网ssh端口之目的;

 

REDIRECT 端口映射

    This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.仅在当前主机完成端口映射;

--to-ports port[-port]

 

在192.168.22.2这台主机上起http服务,并将默认80端口修改为8080,然后就在192.168.22.2这台主机上起iptables规则,通过REDIRECT完成端口转换;

iptables –t nat –A PREROUTING –d 192.168.22.2 –p tcp --dport 80 –j REDIRECT --to-port 8080

测试:curl http://192.168.22.2:80

 

 

自定义链的使用:

iptables –A FORWARD –m state --state ESTABLISHED –j ACCEPT

 

iptables –N web_in

 

iptables –A web_in –d 192.168.22.0/24 –p tcp --dport 80 –m state --state NEW –j ACCEPT

 

iptables –A FORWARD –j REJECT

这时候请求http服务是不可以的;

 

调用web_in

iptables –I FORWARD 2 –d 192.168.22.0/24 –p tcp --dport 80 –j web_in

再次请求就可以了;

RETURN 返回

iptables –A web_in –j RETURN 如果所有规则都不匹配时返回web_in;

    注意:自定义链一旦被引用和有规则时,是不允许被删除的;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!