• IPTables 和 Netfilter 框架


    前言

    防火墙是保护服务器的重要工具。 Linux中最常用的基本防火墙软件是iptables。iptables通过与Linux内核网络堆栈(networking stack)中的包过滤钩子(packet filtering hooks)进行交互来工作。 出入网络系统的数据包将在通过网络堆栈时会触发这些钩子。这些内核钩子称为netfilter框架。

    Netfilter 钩子

    一个程序可以注册5个netfilter钩子。 当数据包通过网络堆栈时,将触发与被注册钩子相关的内核模块。下面介绍钩子

    • NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点
    • NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此点,INPUT包过滤在此点进行
    • NF_IP_FORWARD:要转发的包通过此点,FORWARD包过滤在此点进行
    • NF_IP_POST_ROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能(包括地址伪装)在此点进行
    • NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。

    IPTables和链

    iptables防火墙使用表来组织规则。 例如,如果规则处理网络地址转换,它将被放入nat表中。 如果规则决定数据包是否继续发往目的地,它将被放入filter表中。

     

    查看某一张表

    iptables -t filter -L

    Filter表

    Filter表是iptables中使用最广泛的表之一。 Filter表用于决定是否让数据包继续发完目的地,还是拒绝其请求。 Filter表提供了人们在讨论防火墙时所考虑的大量功能。

    NAT表

    NAT表用于实现网络地址转换。 当数据包进入网络堆栈时,将根据规则修改数据包中的源、目标IP地址或端口。

    Mangle表

    根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。

     例如,您可以调整的TTL(生存时间)值。

    Raw表

     

    Security 表

     

    在每个iptables表中,规则在单独的“链”中进一步组织。 虽然表是根据规则一般作用定义的,但内置链表示触发iptables表的netfilter钩子。 链决定何时执行规则。内置链的名称反映了与它们关联的netfilter钩子的名称:

    • PREROUTING:由NF_IP_PRE_ROUTING钩子触发。对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
    • INPUT:由NF_IP_LOCAL_IN钩子触发。进来的数据包应用此规则链中的策略
    • FORWARD:由NF_IP_FORWARD钩子触发。转发数据包时应用此规则链中的策略
    • OUTPUT:由NF_IP_LOCAL_OUT钩子触发。外出的数据包应用此规则链中的策略
    • POSTROUTING:由NF_IP_POST_ROUTING钩子触发。对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)

    查看表中某个链(以filter表的INPUT链为例)

    iptables -t filter -L INPUT

    iptables语法

    规则增删改

    -t指定表,默认是filter

    -P 或 --policy:定义默认策略

    [root@localhost ~]# iptables -P INPUT DROP
    [root@localhost ~]# iptables -L INPUT
    Chain INPUT (policy DROP)
    target     prot opt source               destination         
    DROP       icmp --  anywhere             anywhere            
    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    ACCEPT     all  --  anywhere             anywhere            
    INPUT_direct  all  --  anywhere             anywhere            
    INPUT_ZONES_SOURCE  all  --  anywhere             anywhere            
    INPUT_ZONES  all  --  anywhere             anywhere            
    DROP       all  --  anywhere             anywhere             ctstate INVALID
    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
    View Code

    -A 或 --append:在规则列表最后增加一条规则

    -I 或 --insert:在指定位置插入一条规则。如果不指定位置,则在最上边插入

    [root@localhost ~]# iptables -I INPUT 1 -p icmp -j DROP
    [root@localhost ~]# iptables -L INPUT
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       icmp --  anywhere             anywhere            
    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    ACCEPT     all  --  anywhere             anywhere            
    INPUT_direct  all  --  anywhere             anywhere            
    INPUT_ZONES_SOURCE  all  --  anywhere             anywhere            
    INPUT_ZONES  all  --  anywhere             anywhere            
    DROP       all  --  anywhere             anywhere             ctstate INVALID
    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
    View Code

    -D 或 --delete:删除一个规则

    [root@localhost ~]# iptables -D INPUT 1
    [root@localhost ~]# iptables -L INPUT
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    ACCEPT     all  --  anywhere             anywhere            
    INPUT_direct  all  --  anywhere             anywhere            
    INPUT_ZONES_SOURCE  all  --  anywhere             anywhere            
    INPUT_ZONES  all  --  anywhere             anywhere            
    DROP       all  --  anywhere             anywhere             ctstate INVALID
    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
    View Code

    -R--replace:替换规则列表中的某个规则

    -F--flush:删除表(或链)中所有规则

    iptables -F删除filter表中所有规则

    iptables -F INPUT删除filter表INPUT链中的所有规则

    数据包匹配

    -i --in-interface :指定数据包从哪个网络接口进入,如pppO、eth0和eth1等

    -o --out-interface:指定数据包从哪块网络接口输出,如pppO、eth0和eth1等

    -p --protocol:协议类型指定数据包匹配的协议,如TCP、UDP和ICMP等

    -s --source:指定数据包匹配的源地址。

    -d --destination:指定数据包匹配的目标地址

    --sport:指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口

    --dport:目标端口号:指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口

    实例演示

    禁止XP连接Win2003的远程桌面(TCP,3389端口)

    在任何一个Linux Router上执行

    iptables -t filter -I FORWARD -p tcp -s 192.168.80.123/32 -d 192.168.10.123/32 --deport 3389 -j DROP

    扩展匹配项

    参数-m state

    基于状态检测的包过滤,指定检测哪种状态。
    --state(New,ESTATBLISHED,INVALID,RELATED}
    说明:

    用来比对连接状态,连接状态共有四种:IVALID、ESTABLISHED、NEW和RELATED。
    INVALID:表示该封包的连接编号(SessionID)无法辨识或编号不正确。
    ESTABLISHED:表示该封包属于某个已经建立的连接。
    NEW:表示该封包想要起始一个连接(重设连接或将连接重导向)。
    RELATED:表示该封包是属于某个已经建立的连接,所建立的新连接。例如:FTP-DATA连接必定是源自某个FTP连接。

    范例

    iptables-A INPUT-m state-state RELATED,ESTABLISHED

    参数-micmp-icmp-type

    Ping命令使用icmp协议测试网络是否畅通,Icmp有两种常用类型的数据包即imp-type,常用的类型为echo-reply和echo-request。如下图所示PC1ping PC2,发出去的数据包是iamp协议echo-reply类型的数据包,PC2返回来的数据包是iamp协议的echo-reply类型的数据包。

     

     

  • 相关阅读:
    expect
    grep
    Python函数
    Python的set
    Python字典
    Python循环
    Python条件判断
    Python列表
    Python字符串
    Python组织代码块的形式
  • 原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/10004569.html
Copyright © 2020-2023  润新知