第7章:网络---iptables命令与netfilter

复制代码
iptables命令与netfilter
https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptables/page/2
====================================================================================
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
网络地址转换(Network Address Translate)
数据包内容修改
以及数据包过滤的防火墙功能
iptables命令与netfilter
复制代码

常用场景中,报文的流向:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING

复制代码
四表五链(filter表、nat表、mangle表、raw表)、(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)

filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw

表(功能)<–>   链(钩子):
raw     表中的规则可以被哪些链使用:PREROUTING,OUTPUT
mangle  表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat     表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
filter  表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT

优先级次序(由高而低):
raw –> mangle –> nat –> filter
    4张表中的规则处于同一条链的目前只有output链,它就是传说中海陆空都能防守的关卡。



PREROUTING       的规则可以存在于:raw表,mangle表,nat表。
INPUT            的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD          的规则可以存在于:mangle表,filter表。
OUTPUT           的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING      的规则可以存在于:mangle表,nat表。
四表五链(filter表、nat表、mangle表、raw表)、(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)
复制代码

 

复制代码
iptables命令参数

    -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter)
    -L选项,查看-t选项对应的表的规则
    -v选项,查看出更多的、更详细的信息
        详细信息的说明详见 https://www.zsythink.net/archives/1493
    -n选项,表示不对IP地址进行名称反解,直接显示IP地址
    –-line-numbers即可显示规则的编号
    -x选项,表示显示精确的计数值(-v选项显示的详细信息,当数值较大时,可能会自动进行单位换算,使用-x则显示精确数值)

    -N选项可以创建自定义链
    -I表示insert,表示在链的首部插入规则。
    -A表示append,表示在链的尾部追加规则
    -s为source之意,表示源地址。
    -j选项,指明当”匹配条件”被满足时,所对应的动作
    -D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则
    -F选项为flush之意,即冲刷指定的链。此操作相当于删除操作,在没有保存iptables规则的情况下,请慎用。
    -R选项修改指定的链中的规则,在修改规则时指定规则对应的编号即可(有坑,慎行)
        使用-R选项修改规则时,必须指明规则原本的匹配条件,那么我们则可以理解为,只能通过-R选项修改规则对应的动作了,所以我觉得,如果你想要修改某条规则,还不如先将这条规则删除,然后在同样位置再插入一条新规则,这样更好,当然,如果你只是为了修改某条规则的动作,那么使用-R选项时,不要忘了指明规则原本对应的匹配条件。
        
iptables命令参数
复制代码

 

复制代码
iptables基本匹配条件;iptables扩展匹配条件(tcp扩展模块、multiport扩展模块、udp扩展模块、icmp扩展模块、iprange模块、string模块、time模块、connlimit模块、limit模块、state扩展模块)
===================================================================================================
基本匹配条件
    -s用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。
        iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP
        iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT
        iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT
    -d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段。
        iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
        iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT
        iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT
    -p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh)
        iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
        iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT
    -i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。
        iptables -t filter -I INPUT -p icmp -i eth4 -j DROP
        iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP
    -o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。
        iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
        iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP

扩展匹配条件
    tcp扩展模块:当使用-p选项指定了报文的协议时,如果在没有使用-m指定对应的扩展模块名称的情况下,使用了扩展匹配条件,  iptables默认会调用与-p选项对应的协议名称相同的模块。所以-m有时是可以省略的。
        –sport:用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围
        #示例
            iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
            iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22:25 -j REJECT
            iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

        –dport:用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围
        #示例
            iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
            iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
            iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT

        –tcp-flags:用于匹配报文的tcp头的标志位
        #示例
            iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
            iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
            iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
            iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT

        –syn:用于匹配tcp新建连接的请求报文,相当于使用”–tcp-flags SYN,RST,ACK,FIN  SYN”
        #示例
            iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT

    multiport扩展模块:”–dports扩展条件”并不属于”tcp扩展模块”,而是属于”multiport扩展模块”
        -p tcp -m multiport –sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开
        -p udp -m multiport –dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开
        #示例
            iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
            iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
            iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
            iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
            iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

    udp扩展模块
        –sport:匹配udp报文的源地址
        –dport:匹配udp报文的目标地址
        #示例
            iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
            iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT
            #可以结合multiport模块指定多个离散的端口

    icmp扩展模块
        –icmp-type:匹配icmp报文的具体类型
        #示例
            iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
            iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT
            iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT
            iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT
            iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
        
    iprange模块:指定一段连续的IP地址范围
        –src-range:指定连续的源地址范围
        –dst-range:指定连续的目标地址范围
        #示例
            iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP
            iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP
            iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP
     

    string模块:指定要匹配的字符串
        –algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。
        –string:指定需要匹配的字符串
        #示例
            iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
            iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
     

    time模块:根据时间段区匹配报文
        –timestart:用于指定时间范围的开始时间,不可取反
        –timestop:用于指定时间范围的结束时间,不可取反
        –weekdays:用于指定”星期几”,可取反
        –monthdays:用于指定”几号”,可取反
        –datestart:用于指定日期范围的开始日期,不可取反
        –datestop:用于指定日期范围的结束时间,不可取反
        #示例
            iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
            iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
            iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 6,7 -j REJECT
            iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --monthdays 22,23 -j REJECT
            iptables -t filter -I OUTPUT -p tcp --dport 80  -m time ! --monthdays 22,23 -j REJECT
            iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
            iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
            iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT
     

    connlimit 模块:限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对”每个客户端IP”,即对单IP的并发连接数限制。
        –connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。
        –connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对”某类IP段内的一定数量的IP”进行连接数量的限制,如果不明白可以参考上文的详细解释。
        #示例
            iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
            iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
            iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT
     

    limit模块:对”报文到达速率”进行限制
        –limit-burst:类比”令牌桶”算法,此选项用于指定令牌桶中令牌的最大数量,上文中已经详细的描述了”令牌桶”的概念,方便回顾。
        –limit:类比”令牌桶”算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。
        #示例 #注意,如下两条规则需配合使用,具体原因上文已经解释过,忘记了可以回顾。
            iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
            iptables -t filter -A INPUT -p icmp -j REJECT

    state扩展模块
        NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW。
        ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。
        RELATED:从字面上理解RELATED译为关系
        INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文。
        UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接。
        使用state扩展模块解决,我们只要放行状态为ESTABLISHED的报文即可,因为如果报文的状态为ESTABLISHED,那么报文肯定是之前发出的报文的回应,如果你还不放心,可以将状态为RELATED或ESTABLISHED的报文都放行,这样,就表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙
        iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables基本匹配条件;iptables扩展匹配条件(tcp扩展模块、multiport扩展模块、udp扩展模块、icmp扩展模块、iprange模块、string模块、time模块、connlimit模块、limit模块、state扩展模块)
复制代码

 

复制代码
iptables处理动作;iptables扩展动作
========================================================================
处理动作
处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。
    ACCEPT:允许数据包通过。
    DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。#不进行响应
    REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。#即提示"端口不可达"
    SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
    MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
    DNAT:目标地址转换。
    REDIRECT:在本机做端口映射。
    LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
    
----------------------------------------------------------------------------
扩展动作:扩展动作可以直接使用,不用像使用”扩展匹配条件”那样指定特定的模块。
    REJECT动作
        –reject-with:当没有明确设置–reject-with的值时,默认提示信息为icmp-port-unreachable,即端口不可达
        iptables -I INPUT 2 -j REJECT --reject-with icmp-host-unreachable

    LOG动作
        –log-level选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug。
        –log-prefix选项可以给记录到的相关信息添加”标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。

    如果想要NAT功能能够正常使用,需要开启Linux主机的核心转发功能。
        echo 1 > /proc/sys/net/ipv4/ip_forward

    SNAT相关操作
        配置SNAT,可以隐藏网内主机的IP地址,也可以共享公网IP,访问互联网,如果只是共享IP的话,只配置如下SNAT规则即可。
        iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP

        如果公网IP是动态获取的,不是固定的,则可以使用MASQUERADE进行动态的SNAT操作,如下命令表示将10.1网段的报文的源IP修改为eth0网卡中可用的地址。
        iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE

    DNAT相关操作
        配置DNAT,可以通过公网IP访问局域网内的服务。
            注:理论上来说,只要配置DNAT规则,不需要对应的SNAT规则即可达到DNAT效果。
                但是在测试DNAT时,对应SNAT规则也需要配置,才能正常DNAT,可以先尝试只配置DNAT规则,如果无法正常DNAT,再尝试添加对应的SNAT规则,SNAT规则配置一条即可,DNAT规则需要根据实际情况配置不同的DNAT规则。
            iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 公网端口 -j DNAT --to-destination 私网IP:端口号
            iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 8080 -j DNAT --to-destination 10.1.0.1:80
            iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网IP
         
        在本机进行目标端口映射时可以使用REDIRECT动作。
            iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080     #配置完成上述规则后,其他机器访问本机的80端口时,会被映射到8080端口。
iptables处理动作;iptables扩展动作
复制代码

 

复制代码
查看规则;插入规则;修改规则
===================================================================================
查看规则
        -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter)
        -L选项,查看-t选项对应的表的规则
        -v选项,查看出更多的、更详细的信息
        -n选项,表示不对IP地址进行名称反解,直接显示IP地址
        –-line-numbers即可显示规则的编号
        -x选项,表示显示精确的计数值(-v选项显示的详细信息,当数值较大时,可能会自动进行单位换算,使用-x则显示精确数值)
    sudo iptables -t filter -nvxL Forbidden_ssh_open_vpn --line-number
    查看表
        iptables -L        #默认查看filter表
        iptables -t raw -L
        iptables -t mangle -L
        iptables -t nat -L

    查看表的某链
        iptables -L    INPUT       #查看filter表的INPUT链
        iptables -nvL INPUT        #查看filter表的INPUT链,-v显示详细信息,-n不进行反向解析
    
    
    示例:
        iptables -t 表名 -L                #查看对应表的所有规则,-t选项指定要操作的表,省略”-t 表名”时,默认表示操作filter表,-L表示列出规则,即查看规则。
        iptables -t 表名 -L 链名        #查看指定表的指定链中的规则。
        iptables -t 表名 -v -L            #查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出”计数器”的信息
        iptables -t 表名 -vL
        iptables -t 表名 -n -L            #表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。
        iptables --line-numbers -t 表名 -L        #表示查看表的所有规则,并且显示规则的序号,–line-numbers选项表示显示规则的序号
        iptables -t 表名 -v -x -L                #表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值
        iptables --line -t filter -nvxL
        iptables --line -t filter -nvxL INPUT
    
--------------------------------------------------------------------------------------
插入规则
        -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter)
        -I表示insert,表示在链的首部插入规则。
        -A表示append,表示在链的尾部追加规则
        -s为source之意,表示源地址。
        -j选项,指明当”匹配条件”被满足时,所对应的动作
        
    iptables -t 表名 -A 链名 匹配条件 -j 动作                    #在指定表的指定链的尾部添加一条规则
    iptables -t 表名 -I 链名 匹配条件 -j 动作                    #在指定表的指定链的首部添加一条规则
    iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作            #在指定表的指定链的指定位置添加一条规则
    sudo iptables -t filter -I INPUT -s 192.168.254.6 -j ACCEPT    
    sudo iptables -t filter -I INPUT 2 -s 192.168.254.6 -j ACCEPT    #插入的规则为第二条
    sudo iptables -t filter -A INPUT -s 192.168.254.6 -j ACCEPT    
    sudo iptables -t filter -I Forbidden_ssh_open_vpn 2 -s 192.168.254.6 -j ACCEPT    #插入规则时,可以在链后面指定数值,即将插入的规则放在第几条;例如此处为2,即新规则插入后为第2条    
    sudo iptables -t filter -I Forbidden_ssh_open_vpn -s 192.168.254.6 -j ACCEPT

----------------------------------------------------------------------------------------
修改规则
        -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter)
        -R选项修改指定的链中的规则,在修改规则时指定规则对应的编号即可(有坑,慎行)
            使用-R选项修改规则时,必须指明规则原本的匹配条件,那么我们则可以理解为,只能通过-R选项修改规则对应的动作了,所以我觉得,如果你想要修改某条规则,还不如先将这条规则删除,然后在同样位置再插入一条新规则,这样更好,当然,如果你只是为了修改某条规则的动作,那么使用-R选项时,不要忘了指明规则原本对应的匹配条件。
        -P选项指定要修改的链的默认策略
        iptables -t 表名 -R INPUT 1 -s 192.168.254.6 -j ACCEPT    
        iptables -t 表名 -P FORWARD DROP
        
        iptables -t 表名 -P 链名 动作                                            #设置指定表的指定链的默认策略(默认动作),并非添加规则。
        iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作            #修改指定表中指定链的指定规则
        若要设置黑名单,推荐将白名单的最后一条规则设置为所有都拒绝,而不建议将默认动作修改为DROP。此时操作了一次-F,清空了规则表,那么相当于坑了自己,所有IP都不能登录管理了。
查看规则;插入规则;修改规则
复制代码
复制代码
删除规则;保存规则;重载规则
=========================================================================
删除规则
        -t选项,指定要操作的表(filter、nat、mangle、raw;默认为filter)
        -D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则
        -F选项为flush之意,即冲刷指定的链。此操作相当于删除操作,在没有保存iptables规则的情况下,请慎用。
        
        iptables -t 表名 -D 链名 规则序号                #按照规则序号删除规则,删除指定表的指定链的指定规则
        iptables -t 表名 -D 链名 匹配条件 -j 动作        #按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则。
        iptables -t 表名 -F 链名                        #删除指定表中对应链中的规则
        iptables -t 表名 -F                                #删除指定表中的所有规则
    方法1:根据规则的编号去删除规则
        sudo iptables -t filter -D INPUT 3
    方法2:根据具体的匹配条件与动作删除规则
        sudo iptables -t filter -D Forbidden_ssh_open_vpn -s 192.168.254.6 -j ACCEPT
    方法3:清空表的所有链规则,很危险。。。
        iptables -t 表名 -F                    #清空整张表
        iptables -t 表名 -F 链名            #清空指定表的某链
        
------------------------------------------------------------------------
保存规则(上面的修改方式都是临时的)
        
    centos6:
        service iptables save
        使用”service iptables save”命令即可保存规则,规则默认保存在/etc/sysconfig/iptables文件中。当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样

    centos7:
        我们需要yum源安装iptables与iptables-services(iptables一般会被默认安装,但是iptables-services在centos7中一般不会被默认安装)
        在centos7中安装完iptables-services后,即可像centos6中一样,通过service iptables save命令保存规则了,规则同样保存在/etc/sysconfig/iptables文件中。
        
        centos7配置iptables-service的步骤:
        #配置好yum源以后安装iptables-service
        # yum install -y iptables-services
        #停止firewalld
        # systemctl stop firewalld
        #禁止firewalld自动启动
        # systemctl disable firewalld
        #启动iptables
        # systemctl start iptables
        #将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务
        # systemctl enable iptables
        
    其他通用方法:
        iptables-save命令;使用iptables-save并不能保存当前的iptables规则,但是可以将当前的iptables规则以”保存后的格式”输出到屏幕上。所以,我们可以使用iptables-save命令,再配合重定向,将规则重定向到/etc/sysconfig/iptables文件中即可。
        iptables-save > /etc/sysconfig/iptables

--------------------------------------------------------------------------
重载规则:
    我们可以将/etc/sysconfig/iptables中的规则重新载入为当前的iptables规则,但是注意,未保存入/etc/sysconfig/iptables文件中的修改将会丢失或者被覆盖。
    iptables-restore命令
    iptables-restore < /etc/sysconfig/iptables      #再次提醒:重载规则时,现有规则将会被覆盖。
    
删除规则;保存规则;重载规则
复制代码

 

#注意,这只是加载到临时iptables
iptables-save > iptables_20220224.bak #备份iptabes rules
iptables-restore < iptables_20220224.bak #恢复iptables rules

 

复制代码
iptables自定义链;iptables作为网络防火墙
=====================================================================
iptables自定义链
当默认链中的规则非常多时,不方便我们管理。
想象一下,如果INPUT链中存放了200条规则,这200条规则有针对httpd服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,假如,我们突然想要修改针对httpd服务的相关规则,难道我们还要从头看一遍这200条规则,找出哪些规则是针对httpd的吗?这显然不合理。


-N选项可以创建自定义链
-E选项可以修改自定义链名
-X选项可以删除自定义链,但是删除自定义链时,需要满足两个条件:
    1、自定义链没有被任何默认链引用,即自定义链的引用计数为0。
    2、自定义链中没有任何规则,即自定义链为空。


创建自定义链
    #示例:在filter表中创建IN_WEB自定义链
    iptables -t filter -N IN_WEB
引用自定义链
    #示例:在INPUT链中引用刚才创建的自定义链
    iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB
重命名自定义链
    #示例:将IN_WEB自定义链重命名为WEB
    iptables -E IN_WEB WEB
删除自定义链
    删除自定义链需要满足两个条件
        1、自定义链没有被引用
        2、自定义链中没有任何规则
    #示例:删除引用计数为0并且不包含任何规则的WEB链
    iptables -X WEB

--------------------------------------------------------------------------------------------------
iptables作为网络防火墙

    #如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文。
    #使用如下命令查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启
    cat /proc/sys/net/ipv4/ip_forward
    #使用如下两种方法均可临时开启核心转发,立即生效,但是重启网络配置后会失效。
    方法一:echo 1 > /proc/sys/net/ipv4/ip_forward
    方法二:sysctl -w net.ipv4.ip_forward=1
    #使用如下方法开启核心转发功能,重启网络服务后永久生效。
    配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中将 net.ipv4.ip_forward设置为1
     
    #由于iptables此时的角色为"网络防火墙",所以需要在filter表中的FORWARD链中设置规则。
    #可以使用"白名单机制",先添加一条默认拒绝的规则,然后再为需要放行的报文设置规则。
    #配置规则时需要考虑"方向问题",针对请求报文与回应报文,考虑报文的源地址与目标地址,源端口与目标端口等。
    #示例为允许网络内主机访问网络外主机的web服务与sshd服务。
    iptables -A FORWARD -j REJECT
    iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
    iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT
    iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
    iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT
     
    #可以使用state扩展模块,对上述规则进行优化,使用如下配置可以省略许多"回应报文放行规则"。
    iptables -A FORWARD -j REJECT
    iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
    iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
    iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

    一些注意点:
    1、当测试网络防火墙时,默认前提为网络已经正确配置。
    2、当测试网络防火墙时,如果出现问题,请先确定主机防火墙规则的配置没有问题。
iptables自定义链;iptables作为网络防火墙
复制代码

 

复制代码
iptables常用配置心得小结
    1、规则的顺序非常重要。
        如果报文已经被前面的规则匹配到,IPTABLES则会对报文执行对应的动作,通常是ACCEPT或者REJECT,报文被放行或拒绝以后,即使后面的规则也能匹配到刚才放行或拒绝的报文,也没有机会再对报文执行相应的动作了(前面规则的动作为LOG时除外),所以,针对相同服务的规则,更严格的规则应该放在前面。
    2、当规则中有多个匹配条件时,条件之间默认存在”与”的关系。
        如果一条规则中包含了多个匹配条件,那么报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到。
    3、在不考虑1的情况下,应该将更容易被匹配到的规则放置在前面。
        在没有顺序要求的情况下,不同类别的规则,被匹配次数多的、匹配频率高的规则应该放在前面。
    4、当IPTABLES所在主机作为网络防火 墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。
    5、在配置IPTABLES白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT规则实现白名单机制,而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP,当链中的规则被清空时,管理员的请求也将会被DROP掉。
iptables常用配置心得小结
复制代码

-m 使用iptables模块模块
-m comment #使用comment扩展模块,用于增加注释
-m tcp #使用tcp模块模块,例如 --dport 就需要用到tcp扩展模块
iptables扩展模块---帮助

iptables -m comment -h
iptables -m physdev -h
iptables -m tcp -h #并不是所有显示的内容都是扩展模块的帮助,只有后半段“match option”内容才是扩展模块的帮助内容

 

iptables匹配physdev
https://blog.csdn.net/sinat_20184565/article/details/124392500
physdev匹配帮助信息如下。
–physdev-in 匹配报文入方向虚拟网桥的物理接口名称,最后的字符+匹配随后的任何字符。
–physdev-out 匹配报文出方向虚拟网桥的物理接口名称。
–physdev-is-in 匹配由网桥接收到的报文,
–physdev-is-out 匹配由网桥发送的报文。
–physdev-is-bridged 匹配在网桥内部中转发的报文,仅在FORWARD和POSTROUTING点有效。


iptables nat的实现根基:conntrack
https://blog.csdn.net/qq_43684922/article/details/127346084
conntrack 是 Linux 下的一个内核模块,这个名字是 connection track 的缩写, 顾名思义,这个模块就是用来做连接跟踪的。
我们知道NAT是在连接跟踪的基础上实现的,所以连接跟踪肯定是在NAT之前建立的。从这里注册的钩子函数的优先级可以看到,NAT的优先级是NF_IP_PRI_NAT_SRC = -100而连接跟踪的优先级是NF_IP_PRI_CONNTRACK = -200,在Netfilter框架中优先级数值越小,优先级越高,越先被调用。所以可以看到NAT是在连接跟踪建立之后进行的。

 

 

复制代码
如何追踪Iptables的规则 
https://blog.csdn.net/joker_zhou/article/details/125653153
https://blog.csdn.net/qq_43684922/article/details/126815699



加载模块
modprobe nf_log_ipv4

打开IPV4的日志
sysctl net.netfilter.nf_log.2=nf_log_ipv4

修改/etc/rsyslog.conf的messages文件输出内容
cat /etc/rsyslog.conf | grep -e "^kern"
kern.*;*.info;mail.none;authpriv.none;cron.none                /var/log/messages
1
2
这里是指将/etc/rsyslog.conf的 /var/logs/messages 行增加 kern.*,将追踪的信息添加到/var/log/messages文件上

重启日志
systemctl restart rsyslog
1
增加Iptables的规则(例如)
插入 Trace动作, 该动作只能在 PREROUTING和OUTPUT的RAW表中插入,

iptables -t raw -A PREROUTING -p icmp -j TRACE
iptables -t raw -A OUTPUT -p icmp -j TRACE
1
2
查看/var/log/messages日志文件输出即可
如何追踪Iptables的规则
复制代码

 

 

 

参考文档:
https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptables

 

posted @   雲淡風輕333  阅读(121)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示