openWrt firewall分析以及nftables配置方法

1 篇文章 0 订阅
1 篇文章 0 订阅

openwrt原生页面

配置文件 

        如下为firewall的uci配置文件,该配置文件位于/etc/config目录下,下图中包括了defaults、zone、forwarding三个部分;

defaults部分声明了不属于特定区域的全局防火墙设置

config defaults

option syn_flood '1'   #布尔值,启动SYN洪水攻击保护

option input 'ACCEPT'  #字符串,设置过滤表INPUT链的策略

option output 'ACCEPT'   #字符串,设置过滤表OUTPUT链的策略

option forward 'REJECT'   #字符串,设置过滤表FORWARD链的策略

# option disable_ipv6  '1'   #布尔值,关闭ipv6防火墙

zone安全域配置节

        一个安全域根据接口来划分,可以包含一个或多个接口,在源和目的之间进行转发、生成规则和重定向。输出的流量伪装是每一个安全域的基础控制。注意伪装是对即将报文离开的接口进行定义,是将报文的源ip转换为路由器的出口ip。

forwarding转发配置节

转发部分控制安全域之间的数据流量,可以使MSS(最大分片大小)为特定方向。

一个转发规则仅代表一个方向。允许两个区域之间的双向流量,这需要两个转发规则,src和dest部分颠倒过来即可,转发配置节的类型为forwarding

iptables规则生成该部分依靠需要链接跟踪工作来生成状态匹配。在src和dest安全域至少需要有一个连接跟踪通过MASQ或连接跟踪选项启用。如果没有启用连接跟踪机制,那报文只能单向通过,返回的报文将被拒绝。

rule规则

如下为rule规则部分

规则用于定义基本的接受、丢弃或拒绝规则,以允许或限制特定端口或主机的访问

规则定义如下:

        如果src和dest均指定,规则作用于转发流量

        如果仅指定了src,规则匹配流入本机的流量,即目的地址为防火墙的报文

        如果仅指定了dest,规则匹配本机作为源地址的流量

        如果src和dest均没有给出,则默认作用于本机作为源地址的流量

include配置节

        Include用于包含自定义的防火墙规则。在防火墙配置中可以指定一条或多条include配置节。

类型为”include”,仅有一个必须的参数是包含的文件路径,所有的可选参数如下表所示。

         包括类型的脚本可以包含任意的命令,例如高级的iptables规则或流量整形所需的tc命令。由于自定义iptables规则要比一般的更具体,所以必须确保使用”-I”来插入而不是一个”-A”来附加到最后,这样自定义规则将出现在默认规则的面前

配置生效流程

总流程

        初始化时,设备加载/etc/config下的所有配置文件时,对所有config文件作了md5校验。如图,存放在文件 /var/run/config.md5中。

        web下发保存配置后,/sbin/reload_config脚本在rpcd中被调用,reload_config对所有/etc/config/下的配置文件进行了md5校验,检测到有配置文件发生改变时,则调用ubus call service evetn config.change firewall命令通过ubus总线通知到procd进程中,再由procd调用 ./etc/init.d/firewall reload命令重载配置。如下图,分别为/sbin/reload_config和/etc/init.d/firewall脚本的内容。

procd初始化注册config.change事件流程

        service_handle_event为procd进程在初始化时注册的service事件处理函数。在该函数中,会对收到的service的事件进行config.change确认。

Nftables

        当前最新版本的openwrt使用nftables替换了iptables。如下为一个自定义的nftables的table,其中包含了chain和rule

ruleset层级操作常用命令

        显示所以family的所有rule规则:nft list ruleset

        显示某个集合的所有规则:nft list ruleset <family>

        清除所有集合的所有规则:nft flush ruleset

        清除某一个集合的所有规则:nft flush ruleset <family>

        备份规则到文件:nft list ruleset >> backup.nft

        从文件恢复规则:nft -f backup.nft

        以json格式显示所有规则:nft --json list ruleset

表table

        常用命令

                添加表格(inet filter):nft add table [family] <table_name>

                显示表格:nft list tables

                删除表格(inet filter):nft delete table [family] <table_name>

                清空表格:nft flush table [family] <table_name>

Family集合

        ip:监听ipv4的流量

        ip6:监听ipv6的流量

        inet:同时监听ipv4和ipv6的流量

        arp:建通arp-level地址解析的流量

        bridge:建通bridge桥接流量

        netdev:用于监听某个单独网卡的流量

链chain

常用命令

        建立基本链:nft add chain [<family>] <table_name> <chain_name> { type <type> hook priority <value> \; [policy <policy> \;] [comment “text comment” \;]}                     //提示:nft会重复使用特殊字符,例如大括号和分号。如果从shell运行这些命令,则需要对多有特殊字符进行转义。防止shell尝试解析nft语法的最简单方法是在单引号内引用所有内容,例:nft ‘add chain ip foo input { type filter hook input priority 0 : }’

        清空链:nft flush chain [family] <table_name> <chain_name>

        删除链:nft delete chain [family] <table_name> <chain_name>  //需要先清空链才可以删除

        列出一个路由表的指定路由链:nft list chain <family> <table_name> <chain_name>

参数解析

        1、type指定自定义路由链挂在到那个基本chain,可用的基本链:

                filter用于过滤流量包

                route用于重路由,等同于iptables的mangle路由链的output hook(其他mangle hooks可以使用filter代替)

                nat用于运行NAT,只有第一个nat流量包会匹配到此链剩余的包会跳过此链

        2、hook定义了挂载的基本链hook,可用的hooks:

                ingress只能用于netdev和inet family;监听来自于NIC driver的流量,早于prerouting

                prerouting监听所有在routing前的入口流量,流量可能重定向到local或remote systems

                input监听所有被路由或者重定向到local system的入口流量

                forward监听所有不被重定向到local system的入口流量

                output监听所有在local machine被管理的出口流量

                postrouting监听所有被路由后的即将离开local system的出口流量

        3、policy定义了默认策略,可用的默认策略为:accept和drop,如果路由链中的规则都没有匹配则会应用默认策略

        4、priority决定了所有链的顺序,数值越低执行优先级越高

        5、comment可以给规则添加注释

        6、如果不定义大括号的内容,也就是不挂载在特定hook上,则路由链不会监听任何流量

规则rule

常用命令

        添加规则:nft add rule <family> <table_name> <chain_name> <...>

        显示规则handle num编号:nft -n -a list table <family> <table_name>

     通过handle索引在某条规则后添加一条新规则:nft add rule <family> <table_name> <chain_name> position <handle_num> <...>

        在某条规则前插入一条规则:nft insert rule <family> <table_name> <chain_name> position <handle_num> <...>

        在某条链最前面插入一条规则:nft insert rule <family> <table_name> <chain_name> <...>

        替换某条规则:nft replace rule <family> <table_name> <chain_name> handle <handle_num> <...>

        删除规则:nft delete rule <family> <table_name> <chain_name> hanlde <handle_num>

参数解析

  1. counter,流量统计,例:nft add rule ip tabletest tcp-chain counter
  2. masquerade,源地址自动设置为出口地址。masquerade是一种源NAT,只能工作于输出路径
  3. meta,通过meta选择器可以进行流量匹配或流量设置。例:
    1. iifname匹配网卡名称:nft add rule tabletest input meta iifname lo accept
    2. mark匹配流量标记:nft add rule tabletest input meta mark 123 counter
    3. l4proto匹配协议:nft add rule inet filter output meta l4proto tcp
    4. 更多参数以及使用方法:Matching packet metainformation - nftables wiki
  4. 通过ip {saddr | daddr}可以匹配ipv4的源流量或者目标流量,例:nft add rule ip tabletest input ip saddr 192.168.1.100 ip daddr 192.168.1.1 counter
  5. 通过icmp type 关键词匹配icmp流量,例:nft add rule ip tabletest input icmp type echo-request counter drop。可以通过命令查询所有可用的icmp type类型,如下:
  6. 通过ip protocol匹配ip family任意类型的协议,例:nft add rule ip tabletest output ip protocol tcp或nft add rule ip tabletest output ip protocol { tcp, udp }
  7. 通过meta l4proto匹配inet family任意类型的协议,例:nft add rule inet tabletest output meta l4proto tcp
  8. 匹配特定端口的流量,例:nft add rule ip tabletest input tcp dport 1-1024 counter drop
  9. 流量匹配动作:accept、drop、reject、jump。具体使用如下:
    1. accept可以对匹配流量接收。drop可以对匹配流量直接丢弃。
    2. reject可以在拒绝流量的基础上进行很多其他动作,如返回给源请求地址无法访问的原因。如果不指定其他动作,默认会返回源地址一个ICMP/ICMPV6 port unreachable的流量包。例:nft add rule ip tabletest input reject with icmp type host-unreachable。icmp可用如下原因:
    3. jump跳转到其他chain,只能跳转到同一个路由表的其他chain。例:nft add rule ip tabletest input ip protocol tcp jump tcp-chain。注意tcp-chain必须存在
  10. 网络地址转换
    1. nat链类型可以执行网络地址转换的功能,这种链类型有其特有的属性:
      • 流量中只有第一个包会被用来进行匹配规则
      • 流量包中后续的流量不会被检查
      • nat链类型特有的规则赋予其他链类型会报错
    2. snat表示源地址。例:nft add rule ip tabletest postrouting ip saddr 192.168.1.0/24 oif eth0 snat to 1.2.3.4
    3. dnat表示目标地址。例:nft ‘add rule ip tabletest prerouting iif eth0 tcp dport { 80, 443 } dnat to 192.168.1.120’
    4. redirect是一种特殊的dnat,它会将流量重定向到本机设备上。例:nft add rule ip tabletest prerouting tcp dport 22 redirect to 2222。以上规则会将进入的tcp22端口的流量转发到本机2222端口上。注意:redirect只能应用于nat链类型的prerouting和output hooks
  11. 设置流量包元信息
    1. 设置mark标记:nft add rule ip tabletest output mark set 123
  12. 更多使用详情请参考:nftables 维基

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值