Linux iptables

iptables:
    Firewall:防火墙,是一种隔离工具,工作于主机或网络的边缘,对于进出本主机或网络的数据包,根据事先定义好的检测规则做匹配检测,如果匹配则做出相应的动作(接收、转发或丢弃等),如果不匹配此条则依次向下匹配,如都不匹配则匹配默认策略,一般用于保护内网;
        工作于内核空间;
        分类:
            主机防火墙
            网络防火墙
                硬件防火墙
                软件防火墙
        数据包进入主机之后有两种走向,一种是数据包的目的是主机本身,通过监听端口将数据包转给对应的应用程序;另一种是数据包的目的不是主机本身,而是通过此主机转发而达到目的主机(需要主机支持主机转发功能);数据包从主机发出需要从用户空间进入内核空间的tcp/ip协议栈,通过匹配路由然后从主机的某块网卡转发出去;
            因为数据包分为进、出、转发等行为,所以我们的防火墙是被分别部署到不同行为的前后的,也就是在数据包必经的路线上,设置了相应的卡点(钩子函数),用于过滤数据包;
                比如进之前需要过滤什么数据包,发之前需要过滤什么数据包,转发之前需要过滤什么数据包;
    iptables/netfilter
        framework:netfilter,内核中用于过滤用的框架,用于提供hook function(钩子函数);
        我们知道防火墙是用来过滤数据包的,可以帮我们阻挡我们不需要的数据,那我们要怎么过滤呢?我们知道防火墙是通过在某些数据包必经路线上设定一些规则,来过滤掉数据包;这个设置规则的工具就是iptables,它处于用户空间;
        使用iptables设置的规则会马上传递给内核实行,但是不是永久储存,关机即消失,所以我们通常是通过运行脚本(配置文件)在开机时重新设置防火墙规则;虽然我们现在将它称之为防火墙服务,但是它本质并不是服务,因为它没有运行任何进程,每次都是通过配置文件来重新生成规则;

    功能:
        filter:过滤,之所以被称之为防火墙就是因为这个功能;
        nat:network address translation,网络地址转换,实现nat服务器;
        mangle:拆解报文,修改报文,封装报文;
        raw:关闭nat表上启用的连接追踪机制;
            连接追踪机制就是可以识别出某个报文此前来访问过;
    链(内置):(钩子函数)
        PREROUTING:路由前匹配的链
        INPUT:进入主机匹配的链
        FORWARD:转发链
        OUTPUT:从主机发出匹配的链
        POSTROUTING:路由后匹配的链
            这是netfilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。
            相当于在不同的卡点设置了检查站,对数据包的进、出、转发做出相应的检测;
            
    流入:PREROUTING --> INPUT
    流出:OUTPUT --> POSTROUTING
    转发:PREROUTING -->  FORWARD --> POSTROUTING
    各种功能的分别实现:
        filter:INPUT,FORWARD,OUTPUT
        nat:PREROUING(DNAT),OUTPUT,POSTROUTING(SNAT)
        mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
        raw:PREROUTING,OUTPUT
    路由发生的时刻:
        报文进入本机后:
            判断目标主机;
        报文发出之间:
            判断经由哪个接口送往下一跳;
    iptables:四表五链
        添加规则时的考量点:
            要实现哪种功能:判断添加在哪张表上;
            报文流经的路径:判断添加在那个链上;
        链:链上规则的次序即为检查的次序,因此隐含一定的法则;
            同类规则(访问同一应用),匹配范围小的放上面;
            不同类规则,(访问不同应用),匹配到报文频率较多的放上面;
            合并那些可由一条规则描述的多条规则;
            设置默认策略
        功能的优先级次序:raw --> mangle --> net --> filter
    规则:
        组成部分:报文的匹配条件,匹配到之后的处理动作
            匹配条件:根据协议报文特征
                基本匹配条件:源ip,目标ip,源端口,目标端口等
                扩展匹配条件:比如连接追踪等功能;
            处理动作:
                内建处理机制
                自定义处理机制
            Note:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效;
        
    iptables:规则管理工具
        添加,修改,删除,查看显示等;
        规则和链有计数器:
            pkgs:由规则或链所匹配到的报文的个数;
            bytes:由规则或链匹配到的所有报文大小之和;
            
        iptables命令:
            iptables [-t table] {-A|-C|-D} chain rule-specification
            
            ip6tables [-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
            
            iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET
                table:表名称
                    filter
                    nat
                    mangle
                    raw
                SUBCOMMAND:参数选项
                    链管理:
                        -F:省略链名称,则清空指定表上的所有链的防火墙规则,默认为filter表
                        -N new_chainname:创建新的自定义链规则
                        -X:删除用户自定义的空的规则链
                        -Z:清除规则计数器的统计信息
                        -P:设置链的默认策略,一般有ACCEPT,DROP REJECT
                        -E:重命名自定义链
                    规则管理:
                        -A:将新规则追加至指定链的尾部
                        -I:将新规则插入至指定链的指定位置
                        -D:删除指定链上的制定规则
                            有两种方式:
                                指定匹配条件
                                指定规则编号
                        -R:替换指定链上的指定规则
                    查看:
                        -L:--list,列出指定链上的规则
                            -n:以数字格式显示地址和端口号
                            -v:显示详细信息
                                -vv,-vvv
                            --line-numbers:显示规则的编号
                            -x:显示计数器计数结果的精确值
                CHAIN:链名称
                    PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
                CRETERIA:匹配标准
                    基本匹配:
                        [!] -s,--source IP_address/Network:检查报文中源ip地址是否符合此处指定的地址范围,"!"表示取反;
                        [!]-d,--destination IP_address/Network:检查报文中目的地址是否符合此处指定的地址范围;
                        -p,--protocol {tcp|udp|icmp}:检查报文的协议类型;
                        -i,--in-interface IFACE:数据报文的流入接口,仅能用于PREROUTING,FORWARD,INPUT链上;
                        -o,--out-interface IFACE:数据报文的流出接口,仅能用于POSTROUTING,FORWARD,OUTPUT链上;
                    扩展匹配:-m match_name --spec_options
                        例如:-m tcp --dport 80
                        隐式扩展:对 -p protocol指明的协议进程的扩展可省略-m选项;
                            -p tcp
                                --sport PORT_NUM:源端口号
                                --dport PORT_NUM:目标端口号
                                --tcp-flags LIST1 LIST2:检查LIST1中所指明的标志位,其中LIST2中所指明的标志位必须为1,剩余的必须为0,LIST1中没有指明的不做检查;
                                    SYN,ACK,FIN,RST,PSH,URG
                                --syn:检查是否为tcp连接的第一次请求;
                            -p udp
                                --sport PORT_NUM:源端口号
                                --dport PORT_NUM:目标端口号
                            -p icmp
                                --icmp-type NUM:icmp类型;
                                    0:echo-reply,响应类型
                                    8:echo-request,发出ping的类型
                                    ping别人发出的是类型8,得到回应的类型为0
                        显式扩展:必须使用-m选项指定使用的扩展模块(rpm -ql iptables | grep "\.so");
                            帮助:
                                Centos6:man iptables
                                Centos7:man iptables-extensions
                            扩展模块:
                                multiport扩展:以离散方式定义多端口匹配,最多指定15个端口;
                                    [!] --source-ports,--sports port[,port|,port:port]...:指明多个源端口;
                                    [!] --destination-ports,--dports port[,port|,port:port]...:指明多个目的端口;
                                    [!] --ports port[,port|,port :port]...:指明多个端口,不分源和目的;
                                    例子:
                                        ~]#iptables -A INPUT -s 192.168.10.0/24 -d 172.16.10.0/24 -p tcp -m multiport --dports 22,80 -j ACCEPT
                                        ~]#iptables -A OUTPUT -s 172.16.10.0/24 -d 192.168.10.0/24 -p tcp -m multiport --sports 22,80 -j ACCEPT
                                iprange扩展:指明连续的(一般不能扩展为整个网络)IP地址范围;
                                    [!] --src-range from[-to]:指明连续的源IP地址范围;
                                    [!] --dst-range from[-to]:指明连续的目的地址范围;
                                    例子:
                                        ~]#iptables -A INPUT  -d 172.16.10.0/24 -p tcp -m multiport --dports 22:24,80 -m iprange --src-range 192.168.10.1-192.168.10.100 -j ACCEPT
                                        ~]#iptables -A OUTPUT -s 172.16.10.0/24 -p tcp -m multiport --sports 22:24,80 -m iprange --dst-range 192.168.10.1-192.168.10.100 -j ACCEPT
                                string扩展:检查出现在报文中的字符串;
                                    --algo {bm|kmp}
                                        bm = Boyer-Moore
                                        kmp = Knuth-Pratt-Morris
                                    [!] --string pattern
                                    例子:
                                        iptables -A OUTPUT -m string --algo bm --string 'movie' -j ACCEPT
                                time扩展:根据报文到达的时间与指定的时间范围进行匹配;
                                    --datestart:指定年月日
                                    --datestop
                                    
                                    --timestart:指定时分秒
                                    --timestop
                                    
                                    --monthdays:指定某个月中的某些天
                                    --weekdays:指定星期
                                connlimit扩展:根据每个客户端ip(也可以是地址块)做并发连接数数量匹配;
                                    --connlimit-above n:连接的数量大于n;
                                    --connlimit-upto n:连接的数量小于等于n;
                                limit扩展:基于收发报文的速率做检查;
                                    令牌通过滤器:
                                    --limit rate[/second|/minute|/hour|/day]     rate:为指定的个数   例如:30/minute
                                    --limit-burst number
                                state扩展:根据连接追踪机制检查连接状态;
                                    调整连接追踪功能所能够容纳的最大连接数量:
                                        /proc/sys/net/nf_conntrack_max
                                    已经追踪到并记录下的连接:
                                        /proc/net/nf_conntrack
                                    可追踪的连接状态:
                                        NEW:新发出的请求,连接追踪模板中不存在此连接相关的信息条目,因此,将其识别为第一次发出的请求;
                                        ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
                                        RELATED:相关的连接,如ftp协议的命令连接与数据连接之间的关系;
                                        INVALIED:无法识别的连接;
                                    --state STATE1,STATE2,…
                                    
                                    Note:iptables的连接追踪数量达到最大值后,连接碰到各种状态的超时后就会从表中删除;
                                    解决办法一般有两个:
                                        1.加大ip_conntrack_max值
                                            vim /etc/sysctl.conf
                                                net.ipv4.ip_conntrack_max=393665
                                                net.ipv4.netfilter.ip_conntrack_max=393665
                                        2.降低ip_conntrack timeout时间
                                            vim /etc/sysctl.conf
                                                net.netfilter.nf_conntrack_tcp_timeout_established=300
                                                net.netfilter.nf_conntrack_tcp_timeout_time_wait=120
                                                net.netfilter.nf_conntrack_tcp_timeout_close_wait=60
                                                net.netfilter.nf_conntrack_tcp_timeout_fin_wait=120
                            
                TARGET:处理动作
                    -j TARGET :跳转至指定的target
                        ACCEPT:接受
                        DROP:丢弃
                        REJECT:拒绝
                        RETURN:返回调用的链
                        REDIRECT:端口重定向
                        LOG:记录日志
                        MARK:作防火墙标记
                        DNAT:目标地址转换
                        SNAT:源地址转换
                        MASQUERADE:地址伪装
                        自定义链:由自定义链上的规则进行匹配检查
                        ……
                        
                通过iptables工具在某个表里的某个链上根据某些参数选项设置某些符合匹配标准的规则,然后做出相应的处理动作;
            
                问题:如何开放被动模式的ftp服务?
                    关于ftp模式的解释:https://www.cnblogs.com/ajianbeyourself/p/7655464.html
                    因为ftp监听的是两个接口,所以使用RELATED可以免去很多麻烦,它可以自动判断ftp监听端口进出的关系;
                    1.装载RELATED追踪的专用模块:/lib/modules/$(unamr -r)/kernel/net/netfilter/nf_conntrack_ftp.ko
                        ~]#modprobe /lib/modules/$(unamr -r)/kernel/net/netfilter/nf_conntrack_ftp.ko
                    2.放行请求报文:
                        命令连接:NEW,ESTABLISHED
                        数据连接:RELATED,ESTABLISHED
                            RELATED只在第一次刚建立连接时使用;
                        例子:
                            ~]#iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
                            ~]#iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
                    3.放行响应报文:
                        ESTABLISHED
                        例子:
                            ~]#iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
                    
        
                如何保存及重载规则:
                    保存规则至指定文件:
                        iptables-save >  /PATH/TO/SOMEFILE
                    从指定文件重载规则:
                        iptables-restore < /PATH/TO/SOMEFILE
                    Centos 6:
                        service iptables save  <==>  iptables-save > /etc/sysocnfig/iptables
                        service iptables restart  < ==> iptables-restore < /etc/sysconfig/iptables
                    Centos 7:引入了新的iptables前端管理工具:firewall
                        firewall-cmd:命令行工具
                        firewall-config:图形化界面工具
                        关于firewall的文章:http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html
                    
                NAT:Network Address Translation,网络地址转换,可以用于实现私网地址访问公网服务器(SNAT),或者用于实现内网服务器对公网开放(DNAT),还可以用于隐藏内网地址,增加安全性;位于网络层、传输层,内核空间;
                Proxy:代理,位于应用层,用户空间;
                    nat表:
                        PREROUTING(DNAT):先转换后路由
                            当内网提供服务器给外网访问时,首先会根据事先设定的规则判断是否需要转换,如果是就将外网主机所访问的公有ip地址转换为内网服务器所在的私有ip地址,并且将这个转换记录下来,然后将数据包发给内网服务器;
                            当内网服务器返回数据包时,nat根据之前记录的信息,再将地址转换回去;
                                iptables -t nat -A PREROUTING -d ExtIP -p udp|tcp --dport PORT_NUM -j DNAT --to-destination InterserverIp[:PORT_NUM]
                        例子:iptables -t nat -A PREROUTING -d 111.222.33.44 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.20
                        OUTPUT
                        POSTROUTING(SNAT):先路由后转换
                            当内网主机访问外网服务器时,首先会将内网私有源ip地址转换为事先设置的可以访问外网的公有ip地址,并且将这个转换记下来,然后去访问服务器;
                            当服务器返回数据包时,nat根据之前记录的信息,再将地址转换回去;
                                iptables -t nat -A POSTROUTING -s LocalIp ! -d LocalIp -j SNAT --to-source Extip
                                iptables -t nat -A POSTROUTING -s LocalIp ! -d LocalIp -j MASQUERADE
                                MASQUERADE:用于所转换的外网地址不固定时,例如ADSL拨号上网;
                        例子:iptables -t nat -A POSTROUTING -s 192.168.10.20 ! -d 192.168.10.20 -j SNAT --to-source 111.222.33.44
                    proxy代理:
                        proxy位于应用层,所以会解封装数据包,来查看其使用的为什么协议,然后根据具体协议作代理,所以可以基于代理做访问控制,增加安全性;一般一种协议的代理只能使用其专有的应用软件来代理;
                            
                tcp_wrapper:tcp包装器
                    对基于tcp协议开发并提供服务的应用程序,提供的一层访问控制工具;
                    基于库调用实现其功能:libwrap库
                    判断服务是否能够由tcp_wrapper进行访问控制:
                        1.动态编译:ldd命令
                            可以通过使用:ldd $(which command) | grep "libwrap" 查看是否调用了libwrap库;
                        2.静态编译:strings命令查看应用程序文件,查看其结果中是否出现
                            hosts.allow
                            hosts.deny
                    在配置文件中为各服务分别定义访问控制规则实现访问控制:
                        /etc/hosts.allow
                        /etc/hosts.deny
                        配置文件语法:
                            daemon_list:client_list [:options]
                                daemon_list:
                                    应用程序的文件名称,而非服务名;
                                    应用程序文件名称列表,彼此之间使用","分隔;
                                        例如:sshd,vsftpd
                                            ALL表示所有服务;
                            client_list:
                                IP地址
                                主机名
                                网络地址:必须使用完整格式的掩码,不能使用前缀格式的掩码
                                    简短格式的网络地址:例如172.16. 表示172.16.0.0/255.255.255.0;
                                ALL:表示所有主机
                                KNOWN:所有可以解析到主机名的主机;
                                UNKNOWN:所有无法解析到主机名的主机;
                                PARANOID:主机名的正反解不匹配;
                            EXCEPT:除了;
                                hosts.allow
                                    vsftpd:172.16. EXCEPT 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1
                                        表示允许192.16.网段的主机,不允许192.16.100.0网段,但是除了172.16.100.0中的172.16.100.1这个地址;
                            [:options]
                                deny:拒绝,用于hosts.alloww文件中,用于实现deny功能;
                                allow:允许,用于hosts.deny文件中,用于实现allow功能;
                                spawn:启动额外应用程序;
                                    vsftpd:ALL:spawn /bin/echo `date` login attempt from %c %s, %d >> /var/log/vsftpd.deny.log
                                        表示将关于vsftpd的带有时间的相关信息追加至指定文件中;
                                        %c:client ip
                                        %s:server ip
                                        %d:daemon ip

注:根据马哥视频做的学习笔记,如有错误,欢迎指正;侵删

posted @ 2018-10-29 09:10  郭伟001  阅读(161)  评论(0编辑  收藏  举报