iptables防火墙

标签(空格分隔): Linux 运维 防火墙 iptables


iptables防火墙_第1张图片
iptables

iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter 项目的一部分。由iptables程序包提供.术语 iptables 也经常代指该内核级防火墙。iptables 可以直接配置,也可以通过许多 前端[broken link: invalid section]
和 图形界面[broken link: invalid section]
配置。iptables 用于 ipv4,ip6tables 用于 ipv6。
nftables 已经包含在 Linux kernel 3.13 中,以后会取代 iptables 成为主要的 Linux 防火墙工具。(摘自archwiki)

iptables的4表5链

Iptables,(带状态追踪的包过滤式)防火墙规则管理工具 组成部分(4表 5链 各种规则)如下:

netfilter: 防火墙框架,位于内核空间.
ip header(ipv4):
hook function: 报文的行走路线 5条'链'
    input
    output
    forward
    preroutings
    postroutings

内置链(chain)相当于围墙上的各道门,iptables上对应的hook function(勾子函数)
❶ PREROUTING
❷ INPUT
❸ FORWARD
❹ OUTPUT
❺ POSTROUTING

表,也称功能(tables)(门上的各种规则)
❶ raw:关闭nat表上启用的连接追踪机制.剥离外部附加功能,以原始状态呈现
❷ mangle ['mæŋg(ə)l]: 拆解报文,做出修改,并重新封装起来.
❸ nat: network address translation网络地址转换,修改源IP或目标IP,也可以改端口(源端口目标端口)
❹ filter: 过滤,防火墙

表与链的关系与报文的流向

功能(tables) --> 链(chain)
    tables规则在每道门(chain)执行次序(从高到低)如下
    raw:    REROUTING, OUTPUT
    mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
    nat:    PREROUTING, OUTPUT, POSTROUTING, [INPUT](CentOS7)
    filter: INPUT, FORWARD, OUTPUT
报文流向
    注入本机: PREROUTING --> INPUT
    由本机流出: OUTPUT --> POSTROUTING
    经由本机转发: PREROUTING --> FORWARD --> POSTROUTING

iptables命令的详细使用

iptables命令:将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语法格式

iptables [-t table] COMMAND chain cretieria [-m matchname [per-match-options]] -j targetname [per-target-options]`  
    -t table    # 指定规则所作用的表,raw, mangle, nat, [filter]
    chain       # 指定规则所作用的链 PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING
    COMMAND     # 对链及这个链上的规则的管理(增删查改)
    cretieria   # 匹配条件

COMMAND参数对链与规则的管理

    `链管理`
    -N:new,自定义一条新的规则链,默认是不会被引用的,仅在默认链上通过某规则进行调用方可生效,因此每个自定义链都有引用计数。
        示例: iptables -t filter -N in_web
    -X CHAIN_NAME: delete,只能删除自定义的规则链(空的且引用计数为0),如果没有加链名,则会删除所有自定义空链。
    -E old_name new_name: rename,重命名自定义链,(引用计数为0才可以,正在被引用的链不能重命名)。
    
    -P: Policy,设置默认策略,对filter表中的链而言,其默认的策略有ACCEPT DROP REJECT   #注意这里不需要-j参数
        示例: iptables -t filter -P INPUT DROP|ACCEPT|REJECT
    -F: flush, 清空指定的规则链或删除指定链上的规则。如果没有跟链名则是删除指定表的所有链。      
        示例:iptables [-t table] -F [chain[rulenum][options...]]
    -Z CHAIN_NAME: zero, 置零指定的链
        iptables的每条规则都有两个计数器:
            1.匹配到的报文的个数(pkts)
            2.匹配的所有报文的大小之和(bytes)

    `规则管理(自己编写的)`
    -A: append,在末尾追加一条链规则. 
        例: iptables -t filter -A INPUT -s 192.168.1.10 -d 192.168.1.123 -j ACCEPT

    -I: insert,插入,要指明rulenum,省略时默认插入到第1条。

    -D: delete, 删除指定链上的指定规则,指明规则序号或规则本身。
        例: iptabls -D INPUT 1 [-j DROP]
            
    -R: replace,iptables [-t table] -R chain rulenum rule-specification;替换指定链上的指定规则.
        例: iptables -t filter -R INPUT 1 -s 10.1.0.71 -j DROP   
    注:不同类别的规则顺序上面应该为使用较频繁的放上(前)面,相同类型的规则的话那么应该将匹配范围小的放在较上(前)面.

    `查看选项`
    -L:               list,列出指定链上的所有规则。
    -n:               numberic,以数字格式显示地址和端口。
    -v:               verbose, 详细信息。
    -vv,-vvv:        更详细的信息。
    -x:               exactly,显示计数器结果的精确值。
    --line-numbers:   显示链上的某条规则的序号。

iptables命令的匹配条件(cretieria)(多个条件之间默认是与关系)

基本匹配条件:无需加载任何模块,由iptables/netfilter自行

[!] -s, --source address[/mask][,...]: 检查报文中的源IP地址是否符合此处指定的地址或范围。
例: iptables -t filter -A INPUT -s 
           
[!] -d, --destination address[/mask][,...]: 检查报文中的目标IP地址是否符合此处指定的地址范围。

[!] -p, --protocol protocol: 传输层的协议(tcp, udp, udplite, icmp, esp, ah, sctp or all)类型 如没有指定的话则为all
    
[!] -i, --in-interface name: 数据报文流入的接口.只能用在INPUT,  FORWARD 与 PREROUTING链上。
例: "iptables -t filter -R INPUT -s 172.16.100.6 -d 172.16.100.67 -p icmp -i eno16777736 -j DROP"
[!] -o, --out-interface name: 数据报文即将离开本机经由的接口.只能用在FORWARD,  OUTPUT and POSTROUTING链上。

-m:显示指明要使用的扩展模块
-j, --jump TARGET: 跳转目标(即处理动作)

扩展匹配条件:需要加载扩展模块,方可生效. #CentOS中可以man iptables-extensions查看具体内容说明

㈠ 隐式扩展(不需要手动加载扩展模块); 因为它们是对协议的扩展,所以但凡使用-p指明了协议,就表示已经指明了要扩展的模块。
    -p {tcp|udp|icmp}
        tcp:
            [!] --source-port,--sport port[:port]: 匹配报文的源端口(可给出多个连续的端口)
            [!] --destination-port,--dport port[:port]: 匹配报文的目标端口(同上)
            示例: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 22 -j DROP #禁止访问本机tcp的22号端口即ssh服务

            [!] --tcp-flags mask comp: 带2个参数,其取值为(SYN(建立连接) ACK(ACK) FIN(关闭连接) RST(连接重置) URG() PSH(有数据传输) ALL NONE)
                mask是我们必须要检查的标识位(值为0或1),而comp是我们必须要设置的.
                "iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
                will only match packets with the SYN flag set, and the ACK,
                FIN and RST flags unset."--> 要检查的标识位有SYN,ACK,FIN,RST,其中SYN必须值为1,余下的必须为0.即匹配tcp第一次"握手" 即确认是一个新请求

            [!] --syn: 相当于--tcp-flags SYN,ACK,FIN,RST SYN

        udp:
            [!] --source-port,--sport port[:port]:
                Source port or port range specification.  See the description
                of the --source-port option of the TCP extension for details.

            [!] --destination-port,--dport port[:port]
                Destination  port  or  port  range  specification.See the
                description of  the  --destination-port option of the TCP
                extension for details.

        icmp: --protocol icmp被指定了才生效,提供下面的选项.   # 互联网控制报文协议  主要是用于探测网络上主机或服务的可用性
            [!] --icmp-type {type[/code]|typename}
                This allows specification of the ICMP type, which  can  be  a
                numeric  ICMP  type,  type/code pair, or one of the ICMP type
                names shown by the command
                iptables -p icmp -h
                两个最常见的type/code(更详细的类型与代码请GOOGLE)      
                echo-request: 8/0  # ping出去的报文
                echo-reply: 0/0    # ping返回的报文

            示例: iptables -A INPUT -s 0.0.0.0/0 -d 172.16.100.67 -p icmp --icmp-type 8 -j DROP # 限制任何人ping自己
                 iptables -A OUTPUT -d 0.0.0.0/0 -s 172.16.100.67 -p icmp --icmp-type 0/0 -j DROP  # 

㈡ 显式扩展(指明需要手动加载扩展模块), -m matchname [per-match-options]

    1、multiport
        以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified. 

        [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
        [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
        [!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;
        例: iptables -t filter -A INPUT -d 10.1.0.6 -p tcp -m multport --dports 22,23,80 -j ACCEPT
          iptables -t filter -A OUTPUT -s 10.1.0.6 -p tcp -m multport --sports 22,23,80 -j ACCEPT
    2、iprange
        以连续的ip地址范围指明多地址匹配条件();

        [!] --src-range from[-to]  
        [!] --dst-range from[-to]
            示例: 

    3、string
        对报文中的应用层数据做字符串匹配检测(string或--hex-string 与 --algo必须给);
        [!] --string pattern
        [!] --hex-string pattern        # 没有给出偏移量的话指代全文
        --algo {bm|kmp}:字符串匹配检查算法;
        --from offset: 从最开始处偏移多少个字符
        --to offset: 从最尾端向前偏移多少个字符
        示例: iptables -A OUTUT -d 172.18.20.0/24 -s 172.18.20.96 -p tcp --sport 80 -m string --string "sex" --algo bm -j REJECT

    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...]    1~7代表周一到周日,也可用 Mon,Tue,Wed, ...等英文标识
            示例: iptables -t filter -I INPUT -d 10.1.0.6 -p tcp --dport 23 -m time --timestart  16:00:01 --timestop 09:59:59 --weekdays Sat,Sun -j REJECT     

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

        --connlimit-upto n:连接数小于等于阈值;  # 单ip并发连接数据<= n
        --connlimit-above n:连接数超出阈值;    # 单ip并发连接数 > n 
        例: iptables -t filter -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

    6、limit -->基于收发报文的速率进行匹配;
        --limit rate[/second|/minute|/hour|/day]   # 包的速率,如每分钟多少个包 每小时多少个包 
        --limit-burst NUMBER   # 默认值为5, 最大允许匹配的初始化包数量  想象一下摩天轮
         例:iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT

    7、**state   # 对系统安全性有很大的提升   cat /proc/sys/net/nf_conntrack_max 查看   在调度器主机千万不要开启此功能
        状态(state_name)检测:连接追踪机制(conntrack) tcp udp icmp 都支持   
                    NEW:    新连接
            ESTABLISHED:    已建立的连接
                RELATED:    相关联的连接,由某个已存在的连接发起请求之后建立的(第一次的)连接.
                INVALID:    无法识别的连接, state表中有数据,但因为某种原因而无法识别了.
              UNTRACKED:    未被追踪连接。     

        需要安装相关的内核模块:
            modprobe nf_conntrack
            modprobe nf_conntrack_ipv4
            modprobe nf_conntrack_ftp   --> 专门用来实现追踪ftp  RELATED状态的

            追踪到的连接:/proc/net/nf_conntrack文件中;

            能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
                建议调整至足够大;

            不同的协议的连接追踪时长不同:
                /proc/sys/net/netfilter/   # 建议调小 

        [!] --state state_name

        如何开放被动模式的ftp服务:
        (1) 装载追踪ftp协议的模块;
        # modprobe nf_conntrack_ftp

        (2) 允许入站命令连接 NEW ESTABLISHED状态的报文
            示例: iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

        (3) 允许放行
        # iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

        (4) 放行出站的ESTABLISHED连接   # 这条规则的好处是基本上控制了入站请求,就不需要新建出站请求了.以不变应万变
        # iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT


    iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -t filter -A INPUT -d 本机IP -p tcp -m multiport --dports 21,22,23,80 -m state --state NEW -j ACCEPT
     
    iptables -t filter -A OUTPUT -s 172.18.20.96 -m state --state ESTABLISHED -j ACCEPT  #以一敌万的配置
    iptables -t filter -P INPUT DROP   #这两条建议使用自定义规则实现,可以防止执行iptables -F命令后无法远程连接    
    iptables -t filter -P OUTPUT DROP

处理动作(target) # man iptables-extensions

-j targetname [per-target-options]
    ACCEPT: 允许访问
    DROP:   拒绝
    REJECT: "礼貌"拒绝
        --reject-with TYPE: TYPE(可以是 icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable... 默认为icmp-port-unreachable)   

    RETURN: 返回调用链  例如自定义链返回

    REDIRECT: 端口重定向(映射) # 在nat表 PREROUTING OUTPUT链上有效
        例:iptables -t nat -A PREROUTING -d 192.168.22.2,192.168.22.3 -p tcp
        --dport 80 -j REDIRECT --to-ports 8080

    LOG: 记录日志
        --log-level:
        --log-prefix: 日志信息的前导信息
        --log-tcp:
        ...

    MARK: 做防火墙转换
        iptables -t mangle -A PREROUTING -d 10.1.0.5 -p tcp -m multiport --dports 80,3306 -j MARK --set-mark 11

    DNAT: 目标地址转换  放在PREROUTING链上  nat表
        示例: iptables -t nat -A PREROUTING -d 10.1.0.6 -p tcp --dport 80 -j DNAT --to-destination 192.168.22.2:80
        iptables -t nat -A PREROUTING -d 10.1.0.6 -p tcp --dport 22 -j DNAT --to-destination 192.168.22.3:8800

    SNAT: 源地址转换  只能放在POSTROUTING或INPUT链上   只在放在nat表
        示例: iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -j SNAT --to-source 10.1.0.6    # 192.168.22网段的主机转换成网关地址10.1.0.6访问外网地址

    MASQUERADE: 地址伪装,   # 只能用在nat表 POSTROUTING链上
        示例: 
    ...

    -j 自定义链名-->即处理动作转到自定义链上去  就像调用一个函数似的

保存和载入iptables规则

保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE
    -n, --noflush:不清除原有规则
    -t, --test:仅分析生成规则集,但不予提交;

    注意:重载文件中的规则,会清除已有规则;

CentOS 6:
    保存规则:service  iptables  save
        保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;
    重载规则:server iptables restart
        默认重载/etc/sysconfig/iptables文件中的规则

    脚本配置文件:/etc/sysconfig/iptables-config
        用于指明要装载的模块;

CentOS 7开机自动生效规则:
    (1) firewalld服务;
    (2) shell脚本,直接记录iptables命令;
    (3) 自定义unit file或init script;

iptables规则优化的思路

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

你可能感兴趣的:(iptables防火墙)