精华内容
下载资源
问答
  • Nftables
    2021-05-27 06:08:53
    1. 简单的防火墙
    2. Typical workstation (separate IPv4 and IPv6)
    3. 编辑规则
    4. 停用iptables及ip6tables, 启动nftables. 
    5. 更多链接
    
    Arch Linux默认启用IPv6, 所以防火墙也要启用ip6.
    iptables: (iptables, ip6tables); nftables: (nft的ip及ip6地址族或inet地址族).
    一个同时支持nftable和iptables的图形化前端是firewalld https://wiki.archlinux.org/title/Firewalld

    1. 简单的防火墙

    nftables带有存储在/etc/nftables.conf文件中的简单安全的防火墙配置。
    启动nftables.service时候会从该文件中加载规则。
    当前规则集可以使用以下命令打印: $ sudo nft list ruleset 查看文件, 一个inet(IPv4/IPv6)类型的filter表, 包含3个规则链, input链包含6条规则... $ cat /etc/nftables.conftable inet filter {
      chain input {
    1 允许 已连接及相关数据包通过
    2 丢弃 失效包
    3 允许 lo环路
    4 允许 icmp
    5 允许 ssh
    6 驳回 其他情况  }
      chain forward { 丢弃 转发 }
      chain output { 放行 }}

    2. Typical workstation (separate IPv4 and IPv6)

    https://wiki.gentoo.org/wiki/Nftables/Examples#Typical_workstation_.28separate_IPv4_and_IPv6.29

     /etc/nftables.rules
    #!/bin/nft -f
    
    flush ruleset
    
    # ----- IPv4 -----
    table ip filter {
    	chain input {
    		type filter hook input priority 0; policy drop;
    		ct state invalid counter drop comment "early drop of invalid packets"
    		ct state {established, related} counter accept comment "accept all connections related to connections made by us"
    		iif lo accept comment "accept loopback"
    		iif != lo ip daddr 127.0.0.1/8 counter drop comment "drop connections to loopback not coming from loopback"
    		ip protocol icmp counter accept comment "accept all ICMP types"
    		tcp dport 22 counter accept comment "accept SSH"
    		counter comment "count dropped packets"
    	}
    
    	chain forward {
    		type filter hook forward priority 0; policy drop;
    		counter comment "count dropped packets"
    	}
    
    	# If you're not counting packets, this chain can be omitted.
    	chain output {
    		type filter hook output priority 0; policy accept;
    		counter comment "count accepted packets"
    	}
    }
    
    
    # ----- IPv6 -----
    table ip6 filter {
    	chain input {
    		type filter hook input priority 0; policy drop;
    		ct state invalid counter drop comment "early drop of invalid packets"
    		ct state {established, related} counter accept comment "accept all connections related to connections made by us"
    		iif lo accept comment "accept loopback"
    		iif != lo ip6 daddr ::1/128 counter drop comment "drop connections to loopback not coming from loopback"
    		ip6 nexthdr icmpv6 counter accept comment "accept all ICMP types"
    		tcp dport 22 counter accept comment "accept SSH"
    		counter comment "count dropped packets"
    	}
    
    	chain forward {
    		type filter hook forward priority 0; policy drop;
    		counter comment "count dropped packets"
    	}
    
    	# If you're not counting packets, this chain can be omitted.
    	chain output {
    		type filter hook output priority 0; policy accept;
    		counter comment "count accepted packets"
    	}
    }
    
    
    与安装nftables自带的增加了一条规则: drop connections to loopback not coming from loopback
    另外包含计数器; IPv4和IPv6分别设置. 可以分别看到各自过滤的数据包.
    要使用这个, 可以直接将内容复制到配置文件: /etc/nftables.conf; 然后重启nftables.service服务即可加载新的配置. $ sudo nft list ruleset 
    合并的inet表 https://wiki.gentoo.org/wiki/Nftables/Examples#Typical_workstation_.28combined_IPv4_and_IPv6.29
    /etc/nftables.rules
    #!/bin/nft -f
    
    flush ruleset
    
    table inet filter {
    	chain input {
    		type filter hook input priority 0; policy drop;
    		ct state invalid counter drop comment "early drop of invalid packets"
    		ct state {established, related} counter accept comment "accept all connections related to connections made by us"
    		iif lo accept comment "accept loopback"
    		iif != lo ip daddr 127.0.0.1/8 counter drop comment "drop connections to loopback not coming from loopback"
    		iif != lo ip6 daddr ::1/128 counter drop comment "drop connections to loopback not coming from loopback"
    		ip protocol icmp counter accept comment "accept all ICMP types"
    		ip6 nexthdr icmpv6 counter accept comment "accept all ICMP types"
    		tcp dport 22 counter accept comment "accept SSH"
    		counter comment "count dropped packets"
    	}
    
    	chain forward {
    		type filter hook forward priority 0; policy drop;
    		counter comment "count dropped packets"
    	}
    
    	# If you're not counting packets, this chain can be omitted.
    	chain output {
    		type filter hook output priority 0; policy accept;
    		counter comment "count accepted packets"
    	}
    }
    
    

    3. 编辑规则

    普通用户若不需要ssh, 可以删除相关行. 若需要增加开放端口, 也可以参照添加行, 修改好文件保存后, 重启服务. 
    或者使用nft命令编辑规则...
    新增规则 $ sudo nft add rule family_typetable_namechain_name handle handle_valuestatement规则附加在处handle_value,这是可选的。如果未指定,则规则将附加到链的末尾。
    插入规则 $ sudo nft insert rule family_type table_name chain_name handle handle_value statement如果handle_value未指定,则规则在链之前。
    删除
    单个规则只能通过其句柄删除。该nft --handle list命令必须用于确定规则句柄。注意该--handle开关,该开关nft在其输出中告知要列出的手柄。
    以下内容确定规则的句柄,然后将其删除。该--numeric参数对于查看某些数字输出(如未解析的IP地址)很有用。 $ sudo nft --handle --numeric list ruleset
    $ sudo nft delete rule inet my_table my_input handle 10

    Atomic reloading
    Flush the current ruleset: $ sudo echo "flush ruleset" > /tmp/nftables Dump the current ruleset: $ sudo nft -s list ruleset >> /tmp/nftablesNow you can edit /tmp/nftables and apply your changes with: $ sudo nft -f /tmp/nftablesADDRESS FAMILIES: (family_type)
    简单防火墙只需使用地址家族的前3个(ip和ip6 或者 inet).
    • ipIPv4 address family. 是默认系列,如果未指定系列,则将使用该系列。
    • ip6IPv6 address family.
    • inetInternet (IPv4/IPv6) address family.
    • arp      ARP address family, handling IPv4 ARP packets.
    • bridge   Bridge address family, handling packets which traverse a bridge device.
    • netdev   Netdev address family, handling packets from ingress.

    4. 停用iptables及ip6tables, 启动nftables.

    $ sudo systemctl disable iptables.serviceRemoved /etc/systemd/system/multi-user.target.wants/iptables.service. $ sudo systemctl disable ip6tables.serviceRemoved /etc/systemd/system/multi-user.target.wants/ip6tables.service. $ sudo systemctl enable nftables.serviceCreated symlink /etc/systemd/system/multi-user.target.wants/nftables.service → /usr/lib/systemd/system/nftables.service.

    5. 更多链接

    https://wiki.archlinux.org/title/Nftableshttps://wiki.gentoo.org/wiki/Nftableshttps://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minuteshttps://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes#Simple_IP.2FIPv6_Firewallhttps://szosoft.blogspot.com/2019/05/linux-nftables.htmlhttps://www.cnblogs.com/sztom/p/10947111.htmlhttps://wiki.archlinux.org/title/Nftables#Simple_firewallhttps://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_to_nftableshttps://kernelnewbies.org/nftables_exampleshttps://wiki.gentoo.org/wiki/Nftables/Examples

    更多相关内容
  • nftables-gui nftables-gui 是 nftables [1] 的图形界面,使用 ncurses 用 c 编写,方便 nft 工具的使用。 它是最终学位项目的一部分,因此将遵循该软件的状态 整个学年 14/15 一直持续到 6 月。 这并不是说以后...
  • 基于nftables的kubernetes代理功能目标nfproxy的目标是提供同时支持ipv4和ipv6的高性能和可扩展的kubernetes代理。 就功能而言,nfproxy不是kube-proxy(iptables)的1:1副本。 如果nfproxy违反了nfproxy的设计原则...
  • nftables-manage-script 轻巧的破折号脚本(/ bin / dash)用于管理基于nftables的防火墙,该防火墙具有定期和原子更新的白名单和黑名单。 在Debian 10(Buster)上测试。 重要的 在默认配置中,防火墙将丢弃未...
  • gonft:nftables Go 包装器

    2021-07-13 02:26:46
    Linux nftables 的高级接口,支持从 Go 代码对 nftables 进行基本操作 注意:这是目前的概念验证,尚未准备好实际使用 要求 库文件 libmnl 包含 nf_tables 子系统的 linux 内核 (>= 3.14) 示例用法 看看
  • 官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
  • 官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
  • 官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
  • 官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
  • Linux Firewalls: Enhancing Security with nftables and Beyond (4th Edition) By 作者: Steve Suehring ISBN-10 书号: 0134000021 ISBN-13 书号: 9780134000022 Edition 版本: 4 出版日期: 2015-02-08 pages 页数:...
  • 官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
  • nftables

    千次阅读 2019-04-29 19:00:00
    nftables 也有表、规则链、规则的概念: 表是规则链的容器 表有几个family: ip/ip6/inet/arp/bridge/netdev; inet=ip和ip6的混合 链是规则的容器 基本链的类型有: filter: 支持ip/ip6/inet/arp/bridge;不支持...

    nftables 也有表、规则链、规则的概念:

    表是规则链的容器
        表有几个family: ip/ip6/inet/arp/bridge/netdev; inet=ip和ip6的混合

    链是规则的容器
           基本链的类型有:
                  filter: 支持ip/ip6/inet/arp/bridge;不支持netdev(好像能支持?)
                  route: 标记数据包,支持ip和ip6,只能用于output钩子。该功能类似iptables的mangle
                  nat: NAT功能,支持ip和ip6.
           基本链的钩子(hook)有:
                  ip/ip6/inet的钩子有: prerouting,input, forward, output, postrouting.
                  arp的钩子有: input, output.
                  netdev的钩子有:ingress
           链的优先级有: 数据包会遍历钩子上的链,直到走完所有链或被丢弃。以下是iptables的优先级参考
                                  here's the list of different priority used in iptables:
                                  NF_IP_PRI_CONNTRACK_DEFRAG (-400): priority of defragmentation
                                  NF_IP_PRI_RAW (-300): traditional priority of the raw table placed before connection tracking operation
                                  NF_IP_PRI_SELINUX_FIRST (-225): SELinux operations
                                  NF_IP_PRI_CONNTRACK (-200): Connection tracking operations
                                  NF_IP_PRI_MANGLE (-150): mangle operation
                                  NF_IP_PRI_NAT_DST (-100): destination NAT
                                  NF_IP_PRI_FILTER (0): filtering operation, the filter table
                                  NF_IP_PRI_SECURITY (50): Place of security table where secmark can be set for example
                                  NF_IP_PRI_NAT_SRC (100): source NAT
                                  NF_IP_PRI_SELINUX_LAST (225): SELinux at packet exit
                                  NF_IP_PRI_CONNTRACK_HELPER (300): connection tracking at exit

           链的默认策略有:accept, drop, queue, continue, return.

     

    规则
          handle 标识某个规则的数字,句柄号。插入规则的时候,position后就需要这个句柄号来定义位置。
          matches 用于创建过滤器的匹配: matches很繁杂,具体参考https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes
          statement 数据包匹配后执行的语句。有log/reject/counter/limit/nat/queue/verdict statement。其中verdict statement可选值为:
                       accept: Accept the packet and stop the remain rules evaluation.
                       drop: Drop the packet and stop the remain rules evaluation.
                       queue: Queue the packet to userspace and stop the remain rules evaluation.
                       continue: Continue the ruleset evaluation with the next rule.
                       return: Return from the current chain and continue at the next rule of the last chain. In a base chain it is equivalent to accept
                       jump <chain>: Continue at the first rule of <chain>. It will continue at the next rule after a return statement is issued
                       goto <chain>: Similar to jump, but after the new chain the evaluation will continue at the last chain instead of the one containing the goto statement

     

     

    钩子之间的关系

                                                 Local
                                                process
                                                  ^  |      .-----------.
                       .-----------.              |  |      |  Routing  |
                       |           |-----> input /    \---> |  Decision |----> output \
    --> prerouting --->|  Routing  |                        .-----------.              \
                       | Decision  |                                                     --> postrouting
                       |           |                                                    /
                       |           |---------------> forward --------------------------- 
                       .-----------.

    4.2内核后多了ingress钩子,ingress钩子与其他钩子的关系如下:
                                     .-----------.             
                                     |           |-----> input ...
    ---> ingress ---> prerouting --->|  Routing  |
                                     | Decision  |
                                     |           |
                                     |           |-----> forward ...
                                     .-----------.


    命令行语法:

    表操作:
    % nft list tables [<family>]                                            # 显示所有表, 如果family不指定,则默认ip.
    % nft list table [<family>] <name> [-n] [-a]                   # 显示name指定的表, -n 表示数字形式显示 -a表示显示handle
    % nft (add | delete | flush) table [<family>] <name>

    链操作:
    % nft (add|create) chain [<family>] <table> <name> [ { type <type> hook <hook> [device <device>] priority <priority> \; [policy <policy> \;] } ]     *注释1*
    % nft (delete | list | flush) chain [<family>] <table> <name>
    % nft rename chain [<family>] <table> <name> <newname>

    规则操作:
    % nft add rule [<family>] <table> <chain> <matches> <statements>
    % nft insert rule [<family>] <table> <chain> [position <position>] <matches> <statements>
    % nft replace rule [<family>] <table> <chain> [handle <handle>] <matches> <statements>
    % nft delete rule [<family>] <table> <chain> [handle <handle>]

    其他:导出配置: % nft export (xml | json)
              事件监控: % nft monitor [new | destroy] [tables | chains | sets | rules | elements] [xml | json]

     

    注释1:  链配置中的policy用来指定该链的默认策略。如果链配置不指定,则创建了一条看不到任何包的非基本链(类似iptables的自定义链) 。如果是netdev类型的链,必须要指定接口设备

     

     

    命令行示例:

    # ------- 表操作 ----------
    % nft add table ip tbl_test1
    % nft flush table ip tbl_test1 # 清掉tbl_test1表的所有规则

    # ------- 链操作 ---------
    % nft add chain ip tbl_test1 chn_test1 {type filter hook input priority 0\; policy accept\;} # 花括号内的是链配置,bash中分号需要转义,如果不想转义,可以写成'{链配置}'的形式。 priority用来定义链的优先级
    % nft add chain netdev tbl_test2 chn_eth0filter '{type filter hook ingress device eth0 priority 0; }' # netdev类型的表必须指定接口
    % nft add chain ip tbl_test1 nonBaseChain2 # 创建一条非基本链,因为非基本链没有挂任何钩子,所以它不能看到任何数据包。它用于排列规则集合(jump到该链)
    % nft delete chain ip tbl_test1 chn_test1 # 删除链,删除前需要flush以下该链(nft flush chain tbl_test1 chn_test1),才能删除

    # ------- 规则操作 ---------
    % nft add rule tbl_test chn_test1 ip daddr 8.8.8.8 counter # 目标地址为8.8.8.8的做计数, 使用nft list table tbl_name -nn 来查看表下的规则
    % nft add rule tbl_test1 chn_test1 tcp dport != 22 accept # 运算符可以有 ==, !=, <=, >=, >, < 如果在bash中,需要\转义,或者使用eq ne le ge gt lt来代替
    % nft add rule tbl_test1 chn_test1 position 2 ip daddr 127.0.0.9 drop # position指定相对位置,后跟handle号。add是在后面添加,insert是在前面插入。(每条规则都有handle号,nft list tbl_name -n -a就可以查看句柄号)。
    % nft replace rule tbl_test1 chn_test handle 3 ip daddr 127.0.0.10 drop # 替换handle指定的规则规则
    % nft delete rule tbl_test1 chn_test handle 3 #删除某规则
    % nft add rule tbl_test1 chn_test ip6 nexthdr tcp # ip6下的tcp

    # --------导入导出、脚本操作--------
    % cat << EOF > /etc/nftables.rules > #!/usr/local/sbin/nft -f > flush ruleset > add table filter > add chain filter input > add rule filter input meta iifname lo accept > EOF % chmod u+x /etc/nftables.rules % /etc/nftables.rules # 使用nft脚本执行。注意上面的解释器: #!/usr/local/sbin/nft
    % nft list ruleset > /etc/nftables.rules # 导出规则集合 % nft flush ruleset # 冲掉规则集 % nft -f /etc/nftables.rules # 导入规则集合(记得先flush规则集,然后再导入)

    # ------ 规则集合 -----
    % nft list ruleset # 列出规则集
    % nft list ruleset ip6 # 列出ip6规则集
    % nft flush ruleset ip6 # 冲掉ip6规则集
    % nft export json >ruleset.json #导出规则集为json

     

     

    脚本:
    可以include,例如:
           #!/usr/sbin/nft -f
           include "ipv4-nat.ruleset"
           include "ipv6-nat.ruleset"
    定义变量:
           define google_dns = 8.8.8.8     #引用示例: add rule tb2 chn2 ip saddr $google_dns counter
           define ntp_server_set = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 } #引用示例:add rule tb2 chn2 ip saddr $ntp_server_set counter 
    格式: 

    #格式1:
    #!/usr/sbin/nft -f
    define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }
    #flush table nat
    table ip nat {
        chain prerouting {
            type filter hook prerouting priority 0; policy accept;
                    ip saddr $ntp_servers counter
        }
    
        chain postrouting {
            type filter hook postrouting priority 100; policy accept;
        }
    }
    
    #格式2:
    #!/usr/sbin/nft -f
    define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }
    add table filter
    add chain filter input { type filter hook input priority 0; }
    add rule filter input ip saddr $ntp_servers counter

     

     

    脚本例子:

    flush ruleset
    
    table t_firewall {
      chain c_incoming {
        type filter hook input priority 0; policy drop;
    
        # established/related connections
        ct state established,related accept
    
        # loopback interface
        iifname lo accept
    
        # icmp
        icmp type echo-request accept
    
        # open tcp ports: sshd (22), httpd (80)
        tcp dport {ssh, http} accept
      }
    }
    
    table ip6 t_firewall6 {
      chain c_incoming {
        type filter hook input priority 0; policy drop;
    
        # established/related connections
        ct state established,related accept
    
        # invalid connections
        ct state invalid drop
    
        # loopback interface
        iifname lo accept
    
        # icmp
        # routers may also want: mld-listener-query, nd-router-solicit
        icmpv6 type {echo-request,nd-neighbor-solicit} accept
    
        # open tcp ports: sshd (22), httpd (80)
        tcp dport {ssh, http} accept
      }
    }

    上面保存位文件,使用命令:ntf -f ruleSet.rs 来生效

     

    matches: (摘录自:https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes,更详细内容看这个链接吧)
    格式:
       obj value
       obj operator value # 例如!=,<=
       obj value1-value2
       obj != value1-value2
       obj {value1,value2,value3}

    ipv4协议:
        ip protocol tcp # 匹配高层协议: icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp
        ip protocol != tcp
        ip protocol 6

    ipv4数据包长度:
        ip length != 333-453
        ip length { 333, 553, 673, 838}

    ipv4 ttl:
        ip ttl 33-55
        ip ttl != 45-50

    ipv4地址:
       ip saddr 192.168.2.0/24
       ip saddr != 192.168.2.0/24
       ip saddr 192.168.3.1 ip daddr 192.168.3.100
       ip saddr != 1.1.1.1
       ip saddr 1.1.1.1
       ip saddr & 0xff == 1
       ip saddr & 0.0.0.255 < 0.0.0.127
       ip daddr 192.168.0.1-192.168.0.250
       ip daddr { 192.168.0.1-192.168.0.250 }
       ip daddr { 192.168.5.1, 192.168.5.2, 192.168.5.3 }

       ip版本号:
       ip version 4

    ct连接状态:
       ct state { new, established, related, untracked }
       ct state != related
       ct state established
       ct state 8

    ct方向:
       ct direction original
       ct direction != original
       ct direction {reply, original}

    ct mark:
    ct mark 0
    ct mark or 0x23 == 0x11

    Meta信息:
        meta iifname "eth0"
        meta iifname {"eth0", "lo"}
        meta iifname "eth*"
        meta oifname "eth0"
        meta iif eth0
        meta oif {eth0, lo}
        meta iiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}

    其他:
       ip hdrlength 15
       tcp flags != syn
       tcp flags & (syn | ack) == syn | ack
       icmp type echo-request
       ether saddr 00:0f:54:0c:11:04
       ether type vlan
       vlan id 4094

     

    Statement:
    限速:
        limit rate 400/minute
        limit rate 400/hour
        limit rate over 1023/second burst 10 packets
        limit rate 1025 kbytes/second
        limit rate 1023000 mbytes/second
        limit rate 1025 bytes/second burst 512 bytes
        limit rate 1025 kbytes/second burst 1023 kbytes
        limit rate 1025 mbytes/second burst 1025 kbytes
        limit rate 1025000 mbytes/second burst 1023 mbytes

    dnat:
       dnat 192.168.3.2
       dnat ct mark map { 0x00000014 : 1.2.3.4}

    snat:
       snat 192.168.3.2
       snat 2001:838:35f:1::-2001:838:35f:2:::100

    masquerade:
       masquerade
       masquerade persistent,fully-random,random
       masquerade to :1024
       masquerade to :1024-2048

    其他:
    reject with icmp type net-prohibited #with <protocol> type <type>
    ip protocol tcp reject with tcp reset
    log
    log level emerg

    转载于:https://www.cnblogs.com/mind-water/p/10789606.html

    展开全文
  • 官方离线安装包,测试可用。请使用rpm -ivh [rpm完整包名] 进行安装
  • 开源项目-google-nftables.zip,Pure go manipulation of Linux nftables (iptables successor), without wrapping libnfntl.
  • 使用 git 管理的 nftables 规则集在我将混合一些我自己的和我在网上看到的想法和概念: git hooks 检查新提交的内容linux net 命名空间来检查规则集是否可以加载原子地替换 nftables 规则集主要是,让 nftables 挂在...
  • 管理Nftables规则和程序包的角色。 受到(3级规则定义和模板)的高度启发,谢谢! 我希望我没有使他的哲学复杂化……(我很确定,我现在确实使它复杂化了:D)^^ 角色变量 nft_enabled :启用或禁用对Nftable的支持...
  • nftables 重要规则进行日志记录,并配置日志切割、nftables 规则固定到文件,保证重启不丢失。最后更新时间:2021/7/13根据官方 wiki 中Logging traffi...


    nftables 重要规则进行日志记录,并配置日志切割、nftables 规则固定到文件,保证重启不丢失。

    最后更新时间:2021/7/13

    根据官方 wiki 中Logging traffic[1]这篇文章的说明:从 Linux 内核 3.17 开始提供完整的日志支持。如果您运行较旧的内核,则必须 modprobe ipt_LOG 以启用日志记录。从 nftables v0.7 开始,支持 log 标志。

    那么我们的内核是5.13.0-1.el7.elrepo.x86_64,nftables 版本是nftables v0.8 (Joe Btfsplk),应该不需要手动加载内核模块。

    前置条件:

    • openvpn 网卡 tun0、openvpn 用户虚拟 IP 网段为 10.121.0.0/16;

    • wireguard 网卡 wg0、wireguard 虚拟 IP 网段 10.122.0.0/16;

    1. nftables 规则创建及测试

    我这边需要在这台 VPN 中枢服务器进行路由转发和控制,并且需要监控哪个 VPN 用户访问了哪些服务的日志;

    1.1. 简单测试-权限粒度从 ip 到目的 ip.端口

    首先测试确定的用户虚拟 IP 到确定的服务器的控制转发规则:

    ## 添加单条规则如下:
    nft add rule ip nat POSTROUTING oifname eth0 ip saddr 10.121.6.6 ip daddr 192.168.5.71 counter log masquerade
    nft add rule ip nat POSTROUTING oifname eth0 ip saddr 10.121.6.6 ip daddr 10.10.210.9 counter log masquerade
    ## 查询到的规则如下
    table ip filter {
     chain INPUT {
      type filter hook input priority 0; policy accept;
      counter packets 248456 bytes 62354809 ## handle 4
     }
    
     chain FORWARD {
      type filter hook forward priority 0; policy accept;
      iifname "wg0" counter packets 97 bytes 6924 accept ## handle 5
      oifname "wg0" counter packets 121 bytes 7776 accept ## handle 6
     }
    
     chain OUTPUT {
      type filter hook output priority 0; policy accept;
     }
    }
    table ip nat {
     chain PREROUTING {
      type nat hook prerouting priority 0; policy accept;
     }
    
     chain INPUT {
      type nat hook input priority 0; policy accept;
     }
    
     chain OUTPUT {
      type nat hook output priority 0; policy accept;
     }
    
     chain POSTROUTING {
      type nat hook postrouting priority 0; policy accept;
      counter packets 76584 bytes 5488498 ## handle 7
      oifname "eth0" ip saddr 10.121.6.6 ip daddr 192.168.5.71 counter packets 1 bytes 60 log masquerade ## handle 27
      oifname "eth0" ip saddr 10.121.6.6 ip daddr 10.10.210.9 counter packets 0 bytes 0 log masquerade ## handle 28
     }
    }
    

    openvpn 客户端 ping 10.10.210.9 和 192.168.5.71 测试,查看日志 tail -100f /var/log/nftables.log,需要先做第二步骤的日志设置

    值得注意的是,短时间内再次 ping 同一个 IP 的话,不会出现新的记录,conntrack -E看也是一样的,有网友说可能是按照比例输出的日志,后面根据生产经验看其实日志是有的,只不过 tail 没全部展现。

    Jul  9 17:32:12 test-openvpn kernel: IN=tun0 OUT=eth0 MAC= SRC=10.121.6.6 DST=10.10.210.9 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=59753 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=716
    Jul  9 17:32:17 test-openvpn kernel: IN=tun0 OUT=eth0 MAC= SRC=10.121.6.6 DST=192.168.5.71 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=36231 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=720
    

    1.2. 权限粒度控制到网段

    若要对用户以及目的地址进行批量配置和控制用户可以目的地址的粒度

    需要新增VPN 用户虚拟 IP 集合目的服务集合(粒度到端口)目的服务器(粒度服务器或网段)

    然后用三条规则控制这样的处理流程。以下是三个集合的创建和新增规则过程【只需要关注 nat 表的 POSTROUTING 链即可】:

    我们需要将刚才的表删掉nft delete table filternft delete table nat,并从头创建覆盖范围更广的通用规则:

    ## -i参数进入交互模式 从头开始创建表filter、nat以及链和新增规则
    nft -i
    add table ip filter
    add chain ip filter INPUT { type filter hook input priority 0; policy accept; }
    add chain ip filter FORWARD { type filter hook forward priority 0; policy accept; }
    add chain ip filter OUTPUT { type filter hook output priority 0; policy accept; }
    add table ip nat
    add chain ip nat PREROUTING { type nat hook prerouting priority 0; policy accept; }
    add chain ip nat INPUT { type nat hook input priority 0; policy accept; }
    add chain ip nat OUTPUT { type nat hook output priority 0; policy accept; }
    add chain ip nat POSTROUTING { type nat hook postrouting priority 0; policy accept; }
    ## 测量流量
    add rule filter INPUT counter
    add rule nat POSTROUTING counter
    
    ## 决定是否增加的测试规则
    add rule ip nat POSTROUTING oifname eth0 ip saddr 10.11.6.6 ip daddr 192.168.5.71 counter masquerade
    add rule ip nat POSTROUTING oifname eth0 ip saddr 10.11.6.6 ip daddr 10.10.210.18 counter masquerade
    
    ## 允许wg0网卡转发流量
    add rule filter FORWARD iifname wg0 counter accept
    add rule filter FORWARD oifname wg0 counter accept
    
    ## user_vips 用户虚拟IP
    add set nat user_vips { type ipv4_addr \; flags interval\; }
    ## dest_addrs 目标地址/网段
    add set nat dest_addrs { type ipv4_addr \; flags interval\; }
    
    ## 查看 退出i交互模式操作
    nft list ruleset
    
    ## 【核心地址】
    ## 添加用户虚拟地址 若想直接给所有虚拟用户添加,则需要删除单个ip,添加成10.121.0.0/16
    nft add element nat user_vips { 10.121.6.6, 10.121.6.7 }
    ##查看结果
    nft list set nat user_vips
    ## 添加目标服务【粒度到端口协议】 【这里此阶段没有测试!】
    nft add element nat dest_svcs { 192.168.5.15 . tcp . 80, 192.168.5.15 . tcp . 22 }
    ## 添加目标网段【粒度粗一些】【此阶段测试了】
    nft add element nat dest_addrs { 10.10.210.99, 192.168.5.77 }
    ##查看结果
    nft list set nat dest_addrs
    
    ## 【核心规则】
    ## tun0 进 精确到端口 tcp协议
    nft insert rule ip nat POSTROUTING oifname eth0 counter log ip saddr @user_vips ip daddr . meta l4proto . tcp dport @dest_svcs masquerade
    ## tun0 进 精确到端口 udp协议
    nft insert rule ip nat POSTROUTING oifname eth0 counter log ip saddr @user_vips ip daddr . meta l4proto . udp dport @dest_svcs masquerade
    ## tun0 进 eth0 出
    nft insert rule ip nat POSTROUTING oifname eth0 counter log ip saddr @user_vips ip daddr @dest_addrs masquerade
    ## tun0 进 wg0 出
    nft insert rule ip nat POSTROUTING oifname wg0 counter log ip saddr @user_vips ip daddr @dest_addrs masquerade
    ##查看结果
    nft list ruleset -a -nn
    table ip filter {
            chain INPUT {
                    type filter hook input priority 0; policy accept;
                    counter packets 1245244 bytes 478473640 ## handle 4
            }
    
            chain FORWARD {
                    type filter hook forward priority 0; policy accept;
                    iifname "wg0" counter packets 429596 bytes 254444866 accept ## handle 5
                    oifname "wg0" counter packets 566722 bytes 80498891 accept ## handle 6
            }
    
            chain OUTPUT {
                    type filter hook output priority 0; policy accept;
            }
    }
    table ip nat {
            set user_vips {
                    type ipv4_addr
                    flags interval
                    elements = { 10.121.6.6, 10.121.6.7 }
            }
    
            set dest_svcs {
                    type ipv4_addr . inet_proto . inet_service
            }
    
            set dest_addrs {
                    type ipv4_addr
                    flags interval
                    elements = { 10.10.210.99, 192.168.5.77 }
            }
    
            chain PREROUTING {
                    type nat hook prerouting priority 0; policy accept;
            }
    
            chain INPUT {
                    type nat hook input priority 0; policy accept;
            }
    
            chain OUTPUT {
                    type nat hook output priority 0; policy accept;
            }
    
            chain POSTROUTING {
                    type nat hook postrouting priority 0; policy accept;
                    oifname "eth0" counter packets 2010 bytes 128703 log ip saddr @user_vips ip daddr @dest_addrs masquerade ## handle 14
                    oifname "wg0" counter packets 24631 bytes 1400846 log ip saddr @user_vips ip daddr @dest_addrs masquerade ## handle 13
                    counter packets 26604 bytes 1536440 ## handle 5
            }
    }
    
    ## 若以后nat表POSTROUTING链的规则粒度改成了更细的粒度,规则数目会变成人数*服务端口数 查询可以这么晒选
    nft list table ip nat -a | grep "10.121.0.3"
    

    2. 日志设置

    简单配置并重启rsyslog服务,则 nftables 规则中写了 log 标志及符合正则的事件流将会出现在日志文件中。

    vim /etc/rsyslog.d/nftables.conf
    ## 写入以下内容 此处的配置将匹配conntrack中符合正则的日志
    :msg,regex,"IN=.*OUT=.*SRC=.*DST=.*" -/var/log/nftables.log
    ## 重启日志服务
    systemctl restart rsyslog
    ## 查看日志
    tail -100f /var/log/nftables.log
    

    如何对日志文件进行管理呢?这就用到了日志切割:参考博客https://zhuanlan.zhihu.com/p/90507023

    ## 为nftables和openvpn设置切割规则,无需重启logrotate服务 因为nftables生产上有测试机器疯狂访问数据库,这里清理日志改成每3月
    vim /etc/logrotate.d/nftables
    /var/log/nftables.log {
        monthly
        rotate 3
        dateext
        compress
        delaycompress
        missingok
        notifempty
        create 644 root root
        postrotate
            /usr/bin/killall -HUP rsyslogd
        endscript
    }
    ## openvpn日志也类似
    vim /etc/logrotate.d/openvpn
    /var/log/openvpn.log {
        monthly
        rotate 5
        dateext
        compress
        delaycompress
        missingok
        notifempty
        create 644 root root
        postrotate
            /usr/bin/killall -HUP rsyslogd
        endscript
    }
    ## 手动测试
    logrotate -vf /etc/logrotate.d/nftables
    logrotate -vf /etc/logrotate.d/openvpn
    ## 测试结果
    -rw-r--r--  1 root   root       69619 Jul 12 15:06 nftables.log
    -rw-------  1 root   root     5959277 Jul 12 14:55 nftables.log-20210712
    -rw-r--r--  1 root   root           0 Jul 12 14:57 openvpn.log
    -rw-------  1 root   root   118663677 Jul 12 15:10 openvpn.log-20210712
    ## 规则说明
    rotate 5 保留五个备份;dateext每次切割结果后面加上日期
    考虑到nftables流量会很大的话,可以只存三个月、或者改成每周切割一次
    

    3. nft 规则的备份恢复

    若要临时备份规则,请如下操作:

    ## 备份
    nft list ruleset >> backup.nft
    ## 恢复(原子性)
    nft -f backup.nft
    

    若想达成 nft 规则开机自动恢复的效果,需要将上面文件中的规则保存到/etc/sysconfig/nftables.conf

    这样重启后无需做任何操作(wireguard、openvpn、nftables 都自动恢复);

    缺点:需要每次服务器重启前尽量将最新的规则覆盖更新到此文件中,这点暂时未考虑方案~

    目前的全部规则如下,ICMP 和 22 端口咱们用云服务器的安全组作了限制,不允许外部访问!

    table ip filter {
            chain INPUT {
                    type filter hook input priority 0; policy accept;
                    counter packets 22510792 bytes 7510722663 ## handle 4
            }
    
            chain FORWARD {
                    type filter hook forward priority 0; policy accept;
                    iifname "wg0" counter packets 10352763 bytes 4340019433 accept ## handle 5
                    oifname "wg0" counter packets 10642518 bytes 1781990328 accept ## handle 6
                    oifname "eth0" log counter packets 26348 bytes 1381110 accept ## handle 8
                    iifname "eth0" log counter packets 23762 bytes 57192818 accept ## handle 9
            }
    
            chain OUTPUT {
                    type filter hook output priority 0; policy accept;
            }
    }
    table ip nat {
            set user_vips {
                    type ipv4_addr
                    flags interval
                    elements = { 10.111.0.0/16, 10.122.0.0/16 }
            }
    
            set dest_svcs {
                    type ipv4_addr . inet_proto . inet_service
            }
    
            set dest_addrs {
                    type ipv4_addr
                    flags interval
                    elements = { 10.1.0.0-10.3.255.255, 10.10.0.0/16,
                                 192.168.0.0/16 }
            }
    
            chain PREROUTING {
                    type nat hook prerouting priority 0; policy accept;
            }
    
            chain INPUT {
                    type nat hook input priority 0; policy accept;
            }
    
            chain OUTPUT {
                    type nat hook output priority 0; policy accept;
            }
    
            chain POSTROUTING {
                    type nat hook postrouting priority 0; policy accept;
                    oifname "eth0" counter packets 10674 bytes 669286 log ip saddr @user_vips ip daddr @dest_addrs masquerade ## handle 14
                    oifname "wg0" counter packets 272649 bytes 14720638 log ip saddr @user_vips ip daddr @dest_addrs masquerade ## handle 13
                    counter packets 35014 bytes 2061579 ## handle 5
            }
    }
    

    4.未成功的方案(ulogd & ulogd2)

    因为系统环境是 centos7,不是 debian,所以 yum 源没有匹配ulogd的软件;于是需求 netfilter 官网下载包,编译安装的方式:

    ## 下载ulogd包并编译安装
    cd /opt
    curl -O https://www.netfilter.org/projects/ulogd/files/ulogd-2.0.7.tar.bz2
    tar xvf ulogd-2.0.7.tar.bz2
    cd ulogd-2.0.7
    ./configure
    ## 编译报错 没有libnetfilter_acct包
    configure: error: Package requirements (libnetfilter_acct >= 1.0.1) were not met:
    No package 'libnetfilter_acct' found
    ## 于是又去官网找libnetfilter_acct
    https://www.netfilter.org/projects/libnetfilter_acct/downloads.html
    ## 下载源码包 编译安装 没有任何报错
    curl -O https://www.netfilter.org/projects/libnetfilter_acct/files/libnetfilter_acct-1.0.3.tar.bz2
    tar xvf libnetfilter_acct-1.0.3.tar.bz2
    cd libnetfilter_acct-1.0.3
    ./configure
    make && make install
    
    ## 但是此时再回去编译ulogd2还是报一样的错误找不到libnetfilter_acct包
    ## 这里并不了解是不是因为源码编译安装包后需要让系统知道安装完的包有哪些,我理解make & install后系统会识别出来的;
    

    如果有任何想法的前辈请告诉我!感激无比~

    5. 设置 nf_log 内核参数【未用到】

    未修改过内核日志模块的机器

    sudo sysctl -a | grep nf_log
    sysctl: reading key "net.ipv6.conf.all.stable_secret"
    sysctl: reading key "net.ipv6.conf.default.stable_secret"
    sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
    sysctl: reading key "net.ipv6.conf.lo.stable_secret"
    sysctl: reading key "net.ipv6.conf.wg0.stable_secret"
    net.netfilter.nf_log.0 = NONE
    net.netfilter.nf_log.1 = NONE
    net.netfilter.nf_log.10 = NONE
    net.netfilter.nf_log.11 = NONE
    net.netfilter.nf_log.12 = NONE
    net.netfilter.nf_log.2 = NONE
    net.netfilter.nf_log.3 = NONE
    net.netfilter.nf_log.4 = NONE
    net.netfilter.nf_log.5 = NONE
    net.netfilter.nf_log.6 = NONE
    net.netfilter.nf_log.7 = NONE
    net.netfilter.nf_log.8 = NONE
    net.netfilter.nf_log.9 = NONE
    net.netfilter.nf_log_all_netns = 0
    

    测试机器(自己折腾过日志内核,发现不需要折腾)

    sysctl -a | grep nf_log
    sysctl: reading key "net.ipv6.conf.all.stable_secret"
    sysctl: reading key "net.ipv6.conf.default.stable_secret"
    sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
    sysctl: reading key "net.ipv6.conf.lo.stable_secret"
    sysctl: reading key "net.ipv6.conf.wg0.stable_secret"
    net.netfilter.nf_log.0 = NONE
    net.netfilter.nf_log.1 = NONE
    net.netfilter.nf_log.10 = nf_log_ipv6
    net.netfilter.nf_log.11 = NONE
    net.netfilter.nf_log.12 = NONE
    net.netfilter.nf_log.2 = nf_log_ipv4
    net.netfilter.nf_log.3 = nf_log_arp
    net.netfilter.nf_log.4 = NONE
    net.netfilter.nf_log.5 = nf_log_netdev
    net.netfilter.nf_log.6 = NONE
    net.netfilter.nf_log.7 = nf_log_bridge
    net.netfilter.nf_log.8 = NONE
    net.netfilter.nf_log.9 = NONE
    net.netfilter.nf_log_all_netns = 0
    

    6. 参考资料

    • Steve Suehring 的《Linux Firewalls_ Enhancing Security with nftables and Beyond-Addison-Wesley Professional》这本书中对防火墙有充分的介绍,很多方面都有可借鉴之处

    • 设置 nf_log 内核参数[2] (最终没用到)

    • 连接跟踪(conntrack):原理、应用及 Linux 内核实现[3]

    脚注

    [1]

    Logging traffic: https://wiki.nftables.org/wiki-nftables/index.php/Logging_traffic

    [2]

    设置 nf_log 内核参数: https://forums.centos.org/viewtopic.php?t=54411#p230026

    [3]

    连接跟踪(conntrack):原理、应用及 Linux 内核实现: https://cloud.tencent.com/developer/article/1761367


    你可能还喜欢

    点击下方图片即可阅读

    巧用 Prometheus 监控 Kubernetes 集群所有组件的证书

    云原生是一种信仰 ????

    关注公众号

    后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!

    点击 "阅读原文" 获取更好的阅读体验!

    发现朋友圈变“安静”了吗?

    展开全文
  • 交叉编译nftables

    2020-07-26 05:46:20
    折腾nftables的那点事儿 (一)  最近因为一个项目,要折腾一下linux下的iptables。好久没有用这个东西了,感觉也不会有啥问题,所以连想都没想就开始弄。开启内核选项,交叉编译iptables,移植运行后才发现。我...

    折腾nftables的那点事儿 (一)

      最近因为一个项目,要折腾一下linux下的iptables。好久没有用这个东西了,感觉也不会有啥问题,所以连想都没想就开始弄。开启内核选项,交叉编译iptables,移植运行后才发现。我靠~不支持了,需要用新的nftables。奶奶的,我老了,被时代所淘汰了。nfatbles是个啥,就是取代iptables的。好吧,那就弄吧,弄起来才知道,麻烦啊,尤其是移植到arm板子上。

    主要涉及到以下几个方面:

    • 交叉编译工具
    • 内核netfilter配置
    • 所需的组件交叉编译(flex、bsion、libmnl、libnftnl、gmp、readline)
    • nftables交叉编译
    • nftables基本使用

    (一) 交叉编译工具: 我使用的系统是ubuntu16.04 x32, 我将交叉编译工具安装在/opt下,具体版本如下

    因为我使用的是zsh,所以我将环境变量添加到了~/.zshrc下

    1 export PATH=/opt/toolchain/bin:$PATH

     

    (二)先折腾内核,开启内核netfilter选项如图,按以下步骤执行

    下面开始进入netfilter的配置选项,这里可以根据具体的需求开始相应的配置,这里我为了测试nftables,将开始所有的选项

    开始选项有两种方式:一种是[*] ,另一种是[M]。前者是内核运行起来以后自动包含了netfilter的模块功能。后者是以*.ko的方式存在,在需要的时候

    使用insmod *.ko的方式启用,ko文件是有依赖关系的,在加载ko文件的时候需要提供modules.dep文件,如下图

     modules.dep文件内容如下

    好了,接下来我是按照[*]的方式加载模块的,为了验证nftables的各种功能,我开启了所有模块,下图是主要配置项,

    红色方块内部的选项根据需求开启。

     

    如上配置也可以直接修改内核源码路径下的.config文件,设置方法如下

    复制代码

    CONFIG_NETFILTER=y
    CONFIG_NETFILTER_DEBUG=y
    CONFIG_NETFILTER_ADVANCED=y
    
    #
    # Core Netfilter Configuration
    #
    CONFIG_NETFILTER_NETLINK=y
    CONFIG_NETFILTER_NETLINK_ACCT=y
    CONFIG_NETFILTER_NETLINK_QUEUE=y
    CONFIG_NETFILTER_NETLINK_LOG=y
    CONFIG_NF_CONNTRACK=y
    CONFIG_NF_CONNTRACK_MARK=y
    CONFIG_NF_CONNTRACK_PROCFS=y
    CONFIG_NF_CONNTRACK_EVENTS=y
    CONFIG_NF_CONNTRACK_TIMEOUT=y
    CONFIG_NF_CONNTRACK_TIMESTAMP=y
    CONFIG_NF_CONNTRACK_LABELS=y
    CONFIG_NF_CT_PROTO_DCCP=y
    CONFIG_NF_CT_PROTO_GRE=y
    CONFIG_NF_CT_PROTO_SCTP=y
    CONFIG_NF_CT_PROTO_UDPLITE=y
    CONFIG_NF_CONNTRACK_AMANDA=y
    CONFIG_NF_CONNTRACK_FTP=y
    CONFIG_NF_CONNTRACK_H323=y
    CONFIG_NF_CONNTRACK_IRC=y
    CONFIG_NF_CONNTRACK_BROADCAST=y
    CONFIG_NF_CONNTRACK_NETBIOS_NS=y
    CONFIG_NF_CONNTRACK_SNMP=y
    CONFIG_NF_CONNTRACK_PPTP=y
    CONFIG_NF_CONNTRACK_SANE=y
    CONFIG_NF_CONNTRACK_SIP=y
    CONFIG_NF_CONNTRACK_TFTP=y
    CONFIG_NF_CT_NETLINK=y
    CONFIG_NF_CT_NETLINK_TIMEOUT=y
    CONFIG_NF_CT_NETLINK_HELPER=y
    CONFIG_NETFILTER_NETLINK_QUEUE_CT=y
    CONFIG_NF_NAT=y
    CONFIG_NF_NAT_NEEDED=y
    CONFIG_NF_NAT_PROTO_DCCP=y
    CONFIG_NF_NAT_PROTO_UDPLITE=y
    CONFIG_NF_NAT_PROTO_SCTP=y
    CONFIG_NF_NAT_AMANDA=y
    CONFIG_NF_NAT_FTP=y
    CONFIG_NF_NAT_IRC=y
    CONFIG_NF_NAT_SIP=y
    CONFIG_NF_NAT_TFTP=y
    CONFIG_NETFILTER_SYNPROXY=y
    CONFIG_NF_TABLES=y
    CONFIG_NF_TABLES_INET=y
    CONFIG_NFT_EXTHDR=y
    CONFIG_NFT_META=y
    CONFIG_NFT_CT=y
    CONFIG_NFT_RBTREE=y
    CONFIG_NFT_HASH=y
    CONFIG_NFT_COUNTER=y
    CONFIG_NFT_LOG=y
    CONFIG_NFT_LIMIT=y
    # CONFIG_NFT_NAT is not set
    CONFIG_NFT_QUEUE=m
    CONFIG_NFT_REJECT=y
    CONFIG_NFT_REJECT_INET=y
    CONFIG_NFT_COMPAT=y
    CONFIG_NETFILTER_XTABLES=y
    
    #
    # Xtables combined modules
    #
    CONFIG_NETFILTER_XT_MARK=y
    CONFIG_NETFILTER_XT_CONNMARK=y
    # CONFIG_NETFILTER_XT_SET is not set
    
    #
    # Xtables targets
    #
    # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set
    CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
    CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
    # CONFIG_NETFILTER_XT_TARGET_CT is not set
    # CONFIG_NETFILTER_XT_TARGET_DSCP is not set
    CONFIG_NETFILTER_XT_TARGET_HL=y
    CONFIG_NETFILTER_XT_TARGET_HMARK=y
    CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
    CONFIG_NETFILTER_XT_TARGET_LED=y
    CONFIG_NETFILTER_XT_TARGET_LOG=y
    CONFIG_NETFILTER_XT_TARGET_MARK=y
    CONFIG_NETFILTER_XT_TARGET_NETMAP=y
    CONFIG_NETFILTER_XT_TARGET_NFLOG=y
    CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
    # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
    CONFIG_NETFILTER_XT_TARGET_RATEEST=y
    CONFIG_NETFILTER_XT_TARGET_REDIRECT=y
    CONFIG_NETFILTER_XT_TARGET_TEE=y
    # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set
    # CONFIG_NETFILTER_XT_TARGET_TRACE is not set
    CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
    # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
    
    #
    # Xtables matches
    #
    CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
    CONFIG_NETFILTER_XT_MATCH_BPF=y
    CONFIG_NETFILTER_XT_MATCH_CGROUP=y
    CONFIG_NETFILTER_XT_MATCH_CLUSTER=y
    CONFIG_NETFILTER_XT_MATCH_COMMENT=y
    CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y
    CONFIG_NETFILTER_XT_MATCH_CONNLABEL=y
    CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
    CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
    CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
    CONFIG_NETFILTER_XT_MATCH_CPU=y
    CONFIG_NETFILTER_XT_MATCH_DCCP=y
    CONFIG_NETFILTER_XT_MATCH_DEVGROUP=y
    CONFIG_NETFILTER_XT_MATCH_DSCP=y
    CONFIG_NETFILTER_XT_MATCH_ECN=y
    CONFIG_NETFILTER_XT_MATCH_ESP=y
    CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
    CONFIG_NETFILTER_XT_MATCH_HELPER=y
    CONFIG_NETFILTER_XT_MATCH_HL=y
    CONFIG_NETFILTER_XT_MATCH_IPCOMP=y
    CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
    CONFIG_NETFILTER_XT_MATCH_L2TP=y
    CONFIG_NETFILTER_XT_MATCH_LENGTH=y
    CONFIG_NETFILTER_XT_MATCH_LIMIT=y
    CONFIG_NETFILTER_XT_MATCH_MAC=y
    CONFIG_NETFILTER_XT_MATCH_MARK=y
    CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
    CONFIG_NETFILTER_XT_MATCH_NFACCT=y
    CONFIG_NETFILTER_XT_MATCH_OSF=y
    CONFIG_NETFILTER_XT_MATCH_OWNER=y
    CONFIG_NETFILTER_XT_MATCH_POLICY=y
    CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
    CONFIG_NETFILTER_XT_MATCH_QUOTA=y
    CONFIG_NETFILTER_XT_MATCH_RATEEST=y
    CONFIG_NETFILTER_XT_MATCH_REALM=y
    CONFIG_NETFILTER_XT_MATCH_RECENT=y
    CONFIG_NETFILTER_XT_MATCH_SCTP=y
    CONFIG_NETFILTER_XT_MATCH_SOCKET=y
    CONFIG_NETFILTER_XT_MATCH_STATE=y
    CONFIG_NETFILTER_XT_MATCH_STATISTIC=y
    CONFIG_NETFILTER_XT_MATCH_STRING=y
    CONFIG_NETFILTER_XT_MATCH_TCPMSS=y
    CONFIG_NETFILTER_XT_MATCH_TIME=y
    CONFIG_NETFILTER_XT_MATCH_U32=y
    CONFIG_IP_SET=y
    CONFIG_IP_SET_MAX=256
    CONFIG_IP_SET_BITMAP_IP=y
    CONFIG_IP_SET_BITMAP_IPMAC=y
    CONFIG_IP_SET_BITMAP_PORT=y
    CONFIG_IP_SET_HASH_IP=y
    CONFIG_IP_SET_HASH_IPPORT=y
    CONFIG_IP_SET_HASH_IPPORTIP=y
    CONFIG_IP_SET_HASH_IPPORTNET=y
    CONFIG_IP_SET_HASH_NETPORTNET=y
    CONFIG_IP_SET_HASH_NET=y
    CONFIG_IP_SET_HASH_NETNET=y
    CONFIG_IP_SET_HASH_NETPORT=y
    CONFIG_IP_SET_HASH_NETIFACE=y
    CONFIG_IP_SET_LIST_SET=y
    # CONFIG_IP_VS is not set
    
    #
    # IP: Netfilter Configuration
    #
    CONFIG_NF_DEFRAG_IPV4=y
    CONFIG_NF_CONNTRACK_IPV4=y
    CONFIG_NF_CONNTRACK_PROC_COMPAT=y
    CONFIG_NF_TABLES_IPV4=y
    CONFIG_NFT_CHAIN_ROUTE_IPV4=y
    CONFIG_NFT_REJECT_IPV4=y
    CONFIG_NF_TABLES_ARP=y
    CONFIG_IP_NF_IPTABLES=y
    CONFIG_IP_NF_MATCH_AH=y
    CONFIG_IP_NF_MATCH_ECN=y
    CONFIG_IP_NF_MATCH_RPFILTER=y
    CONFIG_IP_NF_MATCH_TTL=y
    CONFIG_IP_NF_FILTER=y
    CONFIG_IP_NF_TARGET_REJECT=y
    CONFIG_IP_NF_TARGET_SYNPROXY=y
    CONFIG_IP_NF_TARGET_ULOG=y
    CONFIG_NF_NAT_IPV4=y
    CONFIG_IP_NF_TARGET_MASQUERADE=y
    CONFIG_IP_NF_TARGET_NETMAP=y
    CONFIG_IP_NF_TARGET_REDIRECT=y
    CONFIG_NF_NAT_SNMP_BASIC=y
    CONFIG_NF_NAT_PROTO_GRE=y
    CONFIG_NF_NAT_PPTP=y
    CONFIG_NF_NAT_H323=y
    CONFIG_IP_NF_MANGLE=y
    CONFIG_IP_NF_TARGET_CLUSTERIP=y
    CONFIG_IP_NF_TARGET_ECN=y
    CONFIG_IP_NF_TARGET_TTL=y
    CONFIG_IP_NF_RAW=y
    CONFIG_IP_NF_ARPTABLES=y
    CONFIG_IP_NF_ARPFILTER=y
    CONFIG_IP_NF_ARP_MANGLE=y
    
    #
    # IPv6: Netfilter Configuration
    #
    CONFIG_NF_DEFRAG_IPV6=y
    CONFIG_NF_CONNTRACK_IPV6=y
    CONFIG_NF_TABLES_IPV6=y
    CONFIG_NFT_CHAIN_ROUTE_IPV6=y
    CONFIG_NFT_REJECT_IPV6=y
    CONFIG_IP6_NF_IPTABLES=y
    CONFIG_IP6_NF_MATCH_AH=y
    CONFIG_IP6_NF_MATCH_EUI64=y
    CONFIG_IP6_NF_MATCH_FRAG=y
    CONFIG_IP6_NF_MATCH_OPTS=y
    CONFIG_IP6_NF_MATCH_HL=y
    CONFIG_IP6_NF_MATCH_IPV6HEADER=y
    CONFIG_IP6_NF_MATCH_MH=y
    # CONFIG_IP6_NF_MATCH_RPFILTER is not set
    CONFIG_IP6_NF_MATCH_RT=y
    CONFIG_IP6_NF_TARGET_HL=y
    CONFIG_IP6_NF_FILTER=y
    CONFIG_IP6_NF_TARGET_REJECT=y
    CONFIG_IP6_NF_TARGET_SYNPROXY=y
    CONFIG_IP6_NF_MANGLE=y
    CONFIG_IP6_NF_RAW=y
    CONFIG_NF_NAT_IPV6=y
    CONFIG_IP6_NF_TARGET_MASQUERADE=y
    CONFIG_IP6_NF_TARGET_NPT=y
    CONFIG_NF_TABLES_BRIDGE=y

    复制代码

    以上配置完毕后,netfilter就设置完毕了,重新编译内核,生成zImage,烧写到开发板上。 

     

    (三) 交叉编译必须的组件:nftables的正常运行需要以下组件,下面每个程序编译完毕后需要将安装路径里面生成的内容添加到交叉编译工具链中,这样依赖它的程序才能找到相应的头文件和库文件

    • 交叉编译flex-2.5.38:需要修改conf.in文件,否则提示找不到malloc和realloc两个函数
    sed -i 's/#undef malloc//g' conf.in
    sed -i 's/#undef realloc//g' conf.in
    ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld --prefix=安装路径
    make -j6
    make install
    • 交叉编译bison-3.0.4
    1  ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld --prefix=$root_release_path
    2 make -j6
    3 make install
    • 交叉编译gmp-6.1.1
    1 ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld --prefix=$root_release_path
    2 make -j6
    3 make install
    • 交叉编译libmnl-1.0.3
    1 ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld --prefix=$root_release_path
    2 make -j6
    3 make install
    • 交叉编译libnftnl-1.0.6
    1 LIBMNL_CFLAGS="-I/opt/toolchain/arm-linux-gnueabihf/include/libmnl/" LIBMNL_LIBS="-L/opt/toolchain/arm-linux-gnueabihf/lib -lmnl" ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld --prefix=$root_release_path 
    2 make -j6
    3 make install
    • 交叉编译readline-6.3
    1 ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc         --prefix=$root_release_path
    2 make -j6
    3 make install

     

    (四)交叉编译nftables-0.6

        LIBMNL_CFLAGS="-I/opt/toolchain/arm-linux-gnueabihf/include/libmnl/" \
            LIBMNL_LIBS="-L/opt/toolchain/arm-linux-gnueabihf/lib -lmnl" \
            LIBNFTNL_CFLAGS="-I/opt/toolchain/arm-linux-gnueabihf/include/libnftnl/" \
            LIBNFTNL_LIBS="-L/opt/toolchain/arm-linux-gnueabihf/lib -lnftnl" \
            ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --without-cli \
            --prefix=$root_release_path

    交叉编译玩nftables之后,请将上面的交叉编译的组件和nftables文件移植到到开发板上,越久是$root_release_path路径的所有文件按照系统目录结构拷贝上去,

    千万记得,内核是你重新编译过的内核。

    下面我提供一个编译脚本,根据自己的情况可以修改,这里支持安装必要的开发包、交叉编译部分源码包

    复制代码

      1 #!/bin/bash
      2 
      3 #  author : nanye    2016/06/28
      4 #  compile these source pacakge under ubunt 16.04 x32
      5 #  please make sure that your system is connected to internet
      6 #
      7 
      8 root_path=$PWD
      9 root_tar_path=$root_path'/src'
     10 root_release_path=$root_path'/release'
     11 root_build_path=$root_path'/build'
     12 crosstool_path=`which arm-linux-gnueabihf-g++`
     13 compile_args=$1
     14 
     15 # help information
     16 if [ "$compile_args" = "-h" ]
     17 then
     18     echo "./compile [openssl | snmp | iptables | sqlite | pam | orderd | zhttpd
     19                      flex | bison | gmp | libmnl | libnftnl | readline | nftables]"
     20     echo "         no args for compiling all package"
     21     exit
     22 fi
     23 
     24 # need to compile source module
     25 module_name=(
     26 [1]=openssl-1.0.2h
     27 [2]=net-snmp-5.7.2
     28 [3]=iptables-1.4.18
     29 [4]=sqlite
     30 [5]=Linux-PAM-1.3.0
     31 [6]=orderd
     32 [7]=zhttpd
     33 [8]=flex-2.5.38
     34 [9]=bison-3.0.4
     35 [10]=gmp-6.1.1
     36 [11]=libmnl-1.0.3
     37 [12]=libnftnl-1.0.6
     38 [13]=readline-6.3
     39 [14]=nftables-0.6
     40 )
     41 
     42 # install package
     43 package_name=(
     44 [1]=g++
     45 [2]=build-essential
     46 [3]=texlive
     47 [4]=gettext
     48 [5]=m4
     49 [6]=help2man
     50 [7]=indent
     51 [8]=autopoint
     52 [9]=makeinfo
     53 [10]=odblatex
     54 [11]=docbook2x
     55 [12]=flex
     56 [13]=bison
     57 [14]=automake
     58 [15]=autoconf
     59 )
     60 for var in ${package_name[@]};
     61 do
     62     echo -e "\e[0;32;1m[info] : install $var\e[0m"
     63     sudo apt-get install $var
     64 done
     65 
     66 
     67 # check crosstool exist
     68 if [ "$crosstool_path" = "" ]
     69 then
     70     echo -e "\e[0;31;1m[erro] : have no crosstool in /opt/toolchain\e[0m"
     71     exit
     72 fi
     73 
     74 # create release dirrent
     75 if [ ! -d $root_release_path ]
     76 then
     77     echo -e "\e[0;32;1m[info] : create release success\e[0m"
     78     mkdir $PWD'/release'
     79 fi
     80 
     81 # create build dirrent
     82 if [ ! -d $root_build_path ]
     83 then
     84     echo -e "\e[0;32;1m[info] : create build success\e[0m"
     85     mkdir $PWD'/build'
     86 fi
     87 
     88 # compile openssl
     89 if [ "$compile_args" = "" ] || [ "$compile_args" = "openssl" ]
     90 then
     91     cd $root_build_path
     92     echo -e "\e[0;32;1m[info] : tar xf ${module_name[1]}.tar.gz to build\e[0m"
     93     tar xf $root_tar_path'/'${module_name[1]}.tar.gz
     94     cd $root_build_path'/'${module_name[1]}
     95     /bin/bash config shared no-asm --prefix=$root_release_path
     96     sed -i 's/PLATFORM=linux-elf/PLATFORM=linux-elf-arm/g' Makefile
     97     sed -i 's/CC= gcc/CC= arm-linux-gnueabihf-gcc/g' Makefile
     98     sed -i 's/AR= ar/AR= arm-linux-gnueabihf-ar/g' Makefile
     99     sed -i 's/RANLIB= /usr/bin/ranlib/RANLIB= arm-linux-gnueabihf-ranlib/g' Makefile
    100     sed -i 's/NM= nm/NM= arm-linux-gnueabihf-nm/g' Makefile
    101     sed -i 's/MAKEDEPPROG= gcc/MAKEDEPPROG= arm-linux-gnueabihf-gcc/g' Makefile
    102     make -j4
    103     make install
    104 fi
    105 
    106 # compile net-snmp
    107 if [ "$compile_args" = "" ] || [ "$compile_args" = "snmp" ]
    108 then
    109     cd $root_build_path
    110     echo -e "\e[0;32;1m[info] : tar xf ${module_name[2]}.tar.gz to build\e[0m"
    111     tar xf $root_tar_path'/'${module_name[2]}.tar.gz
    112     cd $root_build_path'/'${module_name[2]}
    113     CC=arm-linux-gnueabihf-gcc ./configure --build=i686-linux \
    114         --host=arm-linux --disable-manuals --enable-mfd-rewrites \
    115         --enable-shared=no --with-mib-modules='ucd-snmp/diskio ip-mib/ipv4InterfaceTable' \
    116         --with-cc=arm-linux-gnueabihf-gcc --with-ar=arm-linux-gnueabihf-ar \
    117         --prefix=$root_release_path
    118     make -j4
    119     make install
    120 fi
    121 
    122 # compile iptables
    123 if [ "$compile_args" = "" ] || [ "$compile_args" = "iptables" ]
    124 then
    125     cd $root_build_path
    126     echo -e "\e[0;32;1m[info] : tar xf ${module_name[3]}.tar.gz to build\e[0m"
    127     tar xf $root_tar_path'/'${module_name[3]}.tar.gz
    128     cd $root_build_path'/'${module_name[3]}
    129     ./configure --host=arm-linux-gnueabihf \
    130         --disable-static --enable-shared \
    131         --prefix=$root_release_path
    132     make -j4
    133     make install
    134 fi
    135 
    136 # compile sqlite
    137 if [ "$compile_args" = "" ] || [ "$compile_args" = "sqlite" ]
    138 then
    139     cd $root_build_path
    140     echo -e "\e[0;32;1m[info] : tar xf ${module_name[4]}.tar.gz to build\e[0m"
    141     tar xf $root_tar_path'/'${module_name[4]}.tar.gz
    142     cd $root_build_path'/'${module_name[4]}
    143     ./configure --disable-tcl --host=arm-linux-gnueabihf \
    144         --prefix=$root_release_path
    145     make -j4
    146     make install
    147 fi
    148 
    149 # compile pam
    150 if [ "$compile_args" = "" ] || [ "$compile_args" = "pam" ]
    151 then
    152     cd $root_build_path
    153     echo -e "\e[0;32;1m[info] : tar xf ${module_name[5]}.tar.gz to build\e[0m"
    154     tar xf $root_tar_path'/'${module_name[5]}.tar.gz
    155     cd $root_build_path'/'${module_name[5]}
    156     ./configure --host=arm-linux-gnueabihf --disable-static --enable-shared \
    157         --prefix=$root_release_path
    158     make -j4
    159     make install
    160 fi
    161 
    162 # compile orderd
    163 if [ "$compile_args" = "" ] || [ "$compile_args" = "orderd" ]
    164 then
    165     cp -r $root_tar_path/${module_name[6]} $root_build_path
    166     cd $root_build_path/${module_name[6]}/src
    167     make
    168     if [ ! -d $root_release_path/sbin ]
    169     then
    170         mkdir $root_release_path/sbin
    171     fi
    172     cp orderd $root_release_path/sbin
    173 fi
    174 
    175 # compile zhttpd
    176 if [ "$compile_args" = "" ] || [ "$compile_args" = "zhttpd" ]
    177 then
    178     cp -r $root_tar_path/${module_name[7]} $root_build_path
    179     cd $root_build_path/${module_name[7]}
    180     make
    181     if [ ! -d $root_release_path/sbin ]
    182     then
    183         mkdir $root_release_path/sbin
    184     fi
    185     cp zhttpd $root_release_path/sbin
    186 fi
    187 
    188 # compile flex
    189 if [ "$compile_args" = "" ] || [ "$compile_args" = "flex" ]
    190 then
    191     cd $root_build_path
    192     echo -e "\e[0;32;1m[info] : tar xf ${module_name[8]}.tar.gz to build\e[0m"
    193     tar xf $root_tar_path'/'${module_name[8]}.tar.gz
    194     cd $root_build_path'/'${module_name[8]}
    195     sed -i 's/#undef malloc//g' conf.in
    196     sed -i 's/#undef realloc//g' conf.in
    197     ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld \
    198         --prefix=$root_release_path
    199     make -j6
    200     make install
    201 fi
    202 
    203 # compile bison
    204 if [ "$compile_args" = "" ] || [ "$compile_args" = "bison" ]
    205 then
    206     cd $root_build_path
    207     echo -e "\e[0;32;1m[info] : tar xf ${module_name[9]}.tar.gz to build\e[0m"
    208     tar xf $root_tar_path'/'${module_name[9]}.tar.gz
    209     cd $root_build_path'/'${module_name[9]}
    210     ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld \
    211         --prefix=$root_release_path
    212     make -j6
    213     make install
    214     cp $root_build_path/${module_name[9]}/lib/libbison.a  $root_release_path/lib
    215 fi
    216 
    217 # compile gmp
    218 if [ "$compile_args" = "" ] || [ "$compile_args" = "gmp" ]
    219 then
    220     cd $root_build_path
    221     echo -e "\e[0;32;1m[info] : tar xf ${module_name[10]}.tar.gz to build\e[0m"
    222     tar xf $root_tar_path'/'${module_name[10]}.tar.gz
    223     cd $root_build_path'/'${module_name[10]}
    224     ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld \
    225         --prefix=$root_release_path
    226     make -j6
    227     make install
    228 fi
    229 
    230 # compile libmnl
    231 if [ "$compile_args" = "" ] || [ "$compile_args" = "libmnl" ]
    232 then
    233     cd $root_build_path
    234     echo -e "\e[0;32;1m[info] : tar xf ${module_name[11]}.tar.gz to build\e[0m"
    235     tar xf $root_tar_path'/'${module_name[11]}.tar.bz2
    236     cd $root_build_path'/'${module_name[11]}
    237     ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld \
    238         --prefix=$root_release_path
    239     make -j6
    240     make install
    241 fi
    242 
    243 
    244 # compile libnftnl
    245 if [ "$compile_args" = "" ] || [ "$compile_args" = "libnftnl" ]
    246 then
    247     cd $root_build_path
    248     echo -e "\e[0;32;1m[info] : tar xf ${module_name[12]}.tar.gz to build\e[0m"
    249     tar xf $root_tar_path'/'${module_name[12]}.tar.bz2
    250     cd $root_build_path'/'${module_name[12]}
    251     export LIBMNL_CFLAGS="-I/opt/toolchain/arm-linux-gnueabihf/include/libmnl/"
    252     export LIBMNL_LIBS="-L/opt/toolchain/arm-linux-gnueabihf/lib -lmnl" 
    253     ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --with-gnu-ld \
    254         --prefix=$root_release_path
    255     make -j6
    256     make install
    257 fi
    258 
    259 # compile readline
    260 if [ "$compile_args" = "" ] || [ "$compile_args" = "readline" ]
    261 then
    262     cd $root_build_path
    263     echo -e "\e[0;32;1m[info] : tar xf ${module_name[13]}.tar.gz to build\e[0m"
    264     tar xf $root_tar_path'/'${module_name[13]}.tar.gz
    265     cd $root_build_path'/'${module_name[13]}
    266     sed -i '6324s/yes/no/g' configure
    267     ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc \
    268         --prefix=$root_release_path
    269     make -j6
    270     make install
    271 fi
    272 
    273 
    274 # compile nftables
    275 if [ "$compile_args" = "" ] || [ "$compile_args" = "nftables" ]
    276 then
    277     cd $root_build_path
    278     echo -e "\e[0;32;1m[info] : tar xf ${module_name[14]}.tar.gz to build\e[0m"
    279     tar xf $root_tar_path'/'${module_name[14]}.tar.bz2
    280     cd $root_build_path'/'${module_name[14]}
    281     LIBMNL_CFLAGS="-I/opt/toolchain/arm-linux-gnueabihf/include/libmnl/" \
    282         LIBMNL_LIBS="-L/opt/toolchain/arm-linux-gnueabihf/lib -lmnl" \
    283         LIBNFTNL_CFLAGS="-I/opt/toolchain/arm-linux-gnueabihf/include/libnftnl/" \
    284         LIBNFTNL_LIBS="-L/opt/toolchain/arm-linux-gnueabihf/lib -lnftnl" \
    285         ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --without-cli \
    286         --prefix=$root_release_path
    287     make -j6
    288     make install
    289 fi
    290 
    291 
    292 # strip bin file and delete unuseful files
    293 arm-linux-gnueabihf-strip $root_release_path/bin/*
    294 arm-linux-gnueabihf-strip $root_release_path/sbin/*
    295 arm-linux-gnueabihf-strip $root_release_path/lib/*.a
    296 arm-linux-gnueabihf-strip $root_release_path/lib/*.so.*
    297 rm -rf $root_release_path/share/man
    298 rm -rf $root_release_path/ssl/man
    展开全文
  • The Definitive Guide to ...An indispensable working resource for every Linux administrator concerned with security, this guide presents comprehensive coverage of both iptables and nftables. ......
  • nftables code

    2014-05-28 22:48:11
    nftables.tar.gz,nftables,Makefile.defs.in,.gitignore,COPYING,tests,stmt-log,chain-rename.2,family-ipv4,symbolic-define.3,set,loop-detect.1,expr-meta,loop-detect.2,chain-rename.3,payload-ll,feat-...
  • nftables也是第一次正式发布。nftables是一个致力于替换现有的{ip,ip6,arp,eb}tables框架(也就是大家熟知的iptables)的项目。然而,Linux3.13中的nftables版本还是不完整的,还缺少一些重要的特性。这些特性会在后续...
  • CVE-2022-1015 内核nftables 栈溢出
  • centos8 防火墙 nftables

    2022-02-02 19:18:19
    防火墙,centos8,nftables
  • 背景知识 1.1 netfilter介绍 1.2 nftables介绍 2. nftables代码分析 2.1 创建 table 2.2 创建 chain 2.3 创建 rule 2.4 创建 expression 3. 漏洞分析 3.1 [nft_set_elem_init()]...
  • nftables相比iptables到底改变了什么

    万次阅读 多人点赞 2017-01-07 10:01:55
    这不是一篇教你怎么可以配置nftables实现一个哪怕最简单防火墙的文章,我从来不写这种Howto,因为我觉得如果一项新技术,一个人连其本身的文档都懒得看,即便没有文档如果没有一点钻研精神将其搞懂,只靠看别人写好...
  • 继iptables之后的新一代包过滤框架是nftables

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,200
精华内容 480
关键字:

Nftables