OpenWrt 防火墙应用

您所在的位置:网站首页 openwrt如何关闭防火墙 OpenWrt 防火墙应用

OpenWrt 防火墙应用

2023-08-20 01:38| 来源: 网络整理| 查看: 265

OpenWrt 防火墙应用--iptables工具 OpenWrt 防火墙应用--iptables工具1 iptables1.1 表和链1.2 规则处理动作自定义链常用扩展模块黑白名单机制 1.3 常用参数1.4 案例

OpenWrt 防火墙应用–iptables工具

OpenWrt 防火墙

openwrt 下的 NAT、DMZ、firewall、rules 都是由配置文件 “/etc/config/firewall” 进行控制管理的。此文件可以使用 UCI 进行控制,也可以使用 vi 编辑器直接修改。 该文件最后会在 /etc/init.d/firewall 启动的时候由 UCI 进行解码并且生成 iptables 规则生效。

1 iptables 1.1 表和链

”链“ 表示的是数据流经过的一个一个的关卡,一共有五个链:PREROUTING, INPUT, FORWORD, OUTPUT, POSTROUTING

到本机某进程的报文:PREROUTING -> INPUT从本机某进程出去的报文:OUTPUT -> POSTROUTING由本机转发的报文:PREROUTING -> FORWARD -> POSTROUTING

“表” 表示的是每个关卡上设置的规则的分类,一共有四类

filter 表:负责过滤功能,防火墙;内核模块:iptable_filter

过滤表

filter是iptables的默认表,主要用于报文过滤,在这里根据报文的内容对报文进行丢 弃或者接收。

它包含有 3 个内置规则链:

①INPUT输入链:处理目标地址为本机 IP 地址的报文。 ②OUTPUT输出链:处理本机 IP 地址产生的报文。 ③FORWARD转发链:处理经过本机路由的报文。

这样每一个IP报文只经过这3个内置链中的一个,便于进行数据报文匹配和处理。 这里是真正实现防火墙处理的地方。

注意:

①经过本机转发的报文经过 FORWARD 链,不经过 IPPUT 链和 OUTPUT 链。 ②本机产生的报文经过 OUTPUT 链,其他的链不经过。 ③去往主机的报文经过该主机的 INPUT 链,其他的链不经过。

nat 表:网络地址转换功能;内核模块:iptable_nat

网络地址转换表

nat用来完成源/目的地址和端口的转换,当一个报文在创建一个新的连接时进入该表。 它也有3个内置规则链:

①PREROUTING:用于修改到来的报文,只用来做网络地址转换。 ②OUTPUT:用于修改本机产生的并且在路由处理之前的报文。 ③POSTROUTING:用于修改准备出去的报文的地方。

通过目的地址转换,你可以将服务器放在防火墙后面,并使用私有 IP 地址。一些协 议通过 nat 转换有困难(例如 FTP 或 SIP),连接跟踪将打开这些协议的数据/媒体流路径。nat 表不能用于报文过滤和报文修改,因为每一个连接流仅有一次机会进入该表中的规则链。

网络地址转换在路由功能前后都可能发生,源地址转换是在数据包通过路由之后在 POSTROUTING 规则链进行地址转换。目的地址转换是在路由之前,在 PREROUTING 规 则链进行地址转换。

mangle 表:对报文进行拆分和修改;内核模块:iptable_mangle

修改表

这个表主要用来进行报文修改。

有5个内置规则链:

①REROUTING:针对到来的报文,在路由之前修改的地方。 ②INPUT:针对目的地址为网关本身的报文。 ③FORWARD:针对通过网关路由转发的报文。 ④POSTROUTING:将要发送出去的报文的地方。 ⑤OUTPUT:本机产生报文在路由之前修改的地方。

通常使用该表进行报文修改,以便进行 QoS 和策略路由。通常每一个报文都进入该表,但不使用它来做报文过滤。

raw 表:关闭 nat 表上启用的连接追踪机制:iptable_raw

原始表

这个表很少被用到,主要用于配置连接跟踪相关内容,在ip_conntrack 之前调用。

它提供了两个内置规则链:

①PREPROUTING:到达本机的报文。 ②OUTPUT:本机进程产生的报文。

这里是能够在连接跟踪生效前处理报文的地方,你可以标记符合某种条件的报文不被 连接跟踪处理。一般很少使用。

表和链的关系

并不是所有的链上都同时存在上面四个表,同时每个表也不会存在所有的链上:

PREROUTING:raw,mangle,natINPUT: mangle, filterFORWARD: mangle, filterOUTPUT: filter, nat, mangle, rawPOSTROUTING: mangle, nat

同一个链中,表的优先级 raw -> mangle -> nat -> filter

指定规则表

-t 参数用来,内建的规则表有三个,分别是:nat、mangle 和filter,当未指定规则表时,则一律视为是filter

三规则表的功能如下:

nat:此规则表拥有PREROUTING 和 POSTROUTING 两个规则链,主要功能为进行一对一、一对多、多对多等网址转换工作(SNAT、DNAT),这个规则表除了作网址转换外,请不要做其它用途。

mangle:此规则表拥有 PREROUTING、FORWARD 和 POSTROUTING 三个规则链。除了进行网址转换工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,使用率不高。

filter: 这个规则表是默认规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则链,这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。

1.2 规则

规则表示一条链上某个表的一些匹配条件,比如拒绝某个 IP 访问

一个链上某个表可以设置多条规则

规则的顺序很重要,一旦有一个规则匹配成功了,后面的规则将会被忽略

如果所有规则没有匹配,那么会有一个默认规则

修改规则的逻辑最好是先删除某条规则,再加入新的规则

iptables 所有的规则都保存在 /etc/sysconfig/iptables

设置了新的规则后,必须使用 service iptables save 进行保存或者使用iptable-save > /etc/sysconfig/iptables,否则重启后,新设置的规则将失效

一个规则中存在多个匹配条件时,这些条件默认规则是与的关系,比如端口,IP必须满足才算匹配

默认的匹配规则有:

-s: 指定源地址,可以匹配多个 ip 地址,用逗号隔开,也可以指定一个 ip 段 -d: 指定目标地址 -p: 指定协议类型,可以是 tcp/udp/icmp/sctp/esp 等 -i: 表示指定从哪个网卡流入的,只能用于 INPUT,PREROUTING,FORWARD 链 -o: 表示指定从哪个网卡留出的,只能用于 OUTPUT,POSTROUTING,FORWORD 链 -m: 指定扩展模块,可以指定扩展模块,扩展模块中可以定义一系列的匹配规则 --dport/--sport: 表示源端口和目标端口,依赖于 tcp 扩展模块(-m tcp),而且必须指定协议 -p tcp,--dport/--sport 是 tcp 扩展模块中的一个扩展匹配条件 -m multiport --dports 334,80:通过扩展模块 multiport 使一条规则中同时指定多个端口 规则的增删改 -F:指定一个链,清空对应链中的所有规则 -I: 指定一个链,表示要加入一条规则在链中,放在所有规则的首部 -A:指定一个链,追加一条规则,放在所有规则尾部 -D: 删除一条规则,删除规则时必须指定表和链,可以根据 --line-number 返回的行号删除,也可以根据规则具体信息(匹配规则和动作)删除 -S:指定链,查看规则定义,有时候我们想直接使用已有规则进行复制产生新的规则,可以使用 -S -P: 指定一个链,给某个链设置默认规则 处理动作

规则定义的处理动作,通过-j参数指定,分为基本动作和扩展动作,扩展动作通过自定义链实现的

基本动作主要分为以下几种:

ACCEPT:允许数据包通过DROP: 直接丢弃数据包,不作处理REJECT:拒绝数据包,会给一个拒绝的响应 --reject-with ‘message’ 可以指定如果被拒绝的情况下的回应消息,message 默认是 icmp-port-unreachable,还可以有如下选择 -icmp-net-unreachable -icmp-host-unreachable -icmp-port-unreachable -icmp-proto-unreachable -icmp-net-prohibited -icmp-host-prohibited -icmp-admin-prohibited

可以传送的封包还有几个选择:ICMP echo-reply 或是tcp-reset(这个封包会要求对方关闭 连接),进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。

iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset SNAT:源地址转换(Source Network Address, Translation):内部报文发送出去时,报文的源 IP 被修改,SNAT 报文必须存在 POSTROUTING 链中,也就是从内部发出去的报文经过的最后一道关卡,对应的 --to-source 选项 // 所有从内部机器 IP=10.1.0.0 发过来的报文都会被隐藏源 IP,并转发到 192.168.1.163 机器上 iptables -t nat -I POSTROUTING -s 10.1.0.0 -j SNAT --to-source 192.168.1.163 DNAT:目标地址转换(Destination Network Address, Translation): 外部报文响应时,目标 IP 再次被修改,从外部网络发送到内部网络的报文,目的 IP 被修改,一般配置在 PREROUTING 链中 // 所有从外部访问主机 192.168.1.164 对应的端口为 3306 的服务,都会被转发到 10.1.0.6:3306 上,目标 IP 被修改 iptables -t nat -I POSTROUTING -d 192.168.1.164 --dport 3306 -j DNAT --to-destination 10.1.0.6:3306 MASQUEREAD:MASQUEREAD 与 SNAT 类似,也是将内部发出去的报文映射成公网 IP,改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则 链(manglepostrouting)。不同是 MASQUEREAD 可以指定网卡,而不需要关心 IP 是什么,即使 IP 发生变化也可以正常映射 iptables -t nat -I POSTROUTING -s 10.1.0.0 -j -o eth0 MASQUEREAD iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000 LOG:打印日志,对匹配到规则的请求打印日志,然后将数据包传给下一个规则,不做任何处理,日志会被记录到 /var/log/messages 里 --log-level 可以给指定的日志加级别:emerg,alert,crit,error,warn,notice,debug,info --log-prefix 可以给指定的日志加标签,便于查看 REDIRECT:在本机做端口映射,将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则。 这个功能可以用来实现透明代理或用来保护 web 服务器。例如: //将本机的 80 端口转发到 8080 端口 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 自定义链 默认链中,如果规则太多时不方便管理,所以引入了自定义链自定义链不能直接使用,需要默认链引用才能使用,通过 -j 引用自定义链只有自定义链没有被任何默认链的规则引用且没有任何规则时才可以删除 iptables -t filter -N AB //新建一个自定义链 iptables -t filter -nvL AB //查看自定义链中的规则 iptables -t filter -I AB -s 10.14.12.18 -j REJECT //给自定义链加入一条规则 iptables -t filter -I INPUT -p tcp --dport 80 -j AB //在默认链中引用自定义链,必须在默认链中引用,自定义链中的规则才能生效 iptables -E AB ABC //将自定义链 AB 改名为 ABC 常用扩展模块

如果常用的匹配规则不够,我们可以使用扩展模块的匹配规则,通过-m指定扩展模块,常用的扩展模块有如下:

tcp --sport:指定源端口 --dport:指定目标端口 --tcp-flags: 可以根据 tcp 标志头进行匹配 --syn: 用于匹配 tcp 新建连接的请求报文 udp --sport:指定源端口 --dport:指定目标端口 icmp --icmp-type: 用于指定 icmp 报文的具体类型 multiport:同时指定多个端口iprange: 指定一个 ip 范围string:可以针对报错字符串进行匹配time:针对报文达到的时间进行匹配connlimit: 可以限制每个 ip 连接同时连接到 server 段的数量limit:对报文达到的到达率进行限制,单位时间内流入的数据量state:让 iptables 实现了连接追踪,可以对建立连接的状态进行追踪屏蔽,比如只能是我主动和你进行建立连接,而你不能和我主动建立连接set:可以匹配通过 ipset 定义一堆 ip 的集合 //通过 ipset 定义一个 ip 集合,把 59.111.198.55,59.111.198.56 加入 office 中 #!/bin/sh sudo ipset -! create office hash:net sudo ipset add office 59.111.198.55 sudo ipset add office 59.111.198.56 //对 INPUT 链上所在 office 集合中 IP 列表进行拒绝访问 src 表示来源 IP iptables -t table -I INPUT -m set --match-set office src -j DROP 黑白名单机制 黑名单:如果默认规则是 ACCEPT,那么没有匹配到的都会通过白名单:如果默认规则是 REJECT,那么没有匹配到的都会被拒绝在使用白名单时建议不要将默认规则设置成 REJECT,万一机器重启以后,管理员自己可能都被拒之门外,可以将默认规则设置 ACCEPT,然后在默认加一条规则 REJECT,这样也可以实现白名单机制默认规则设置: //-P: 指定一个链,给某个链设置默认规则 iptables -t filter -P INPUT -j REJECT 1.3 常用参数 -t :指定 table,默认是 filter-v : 会显示更多的列的详细信息-n : 表示不对 ip 进行 dns 反解析-L : 后面不加参数是列出所有规则,可以加对应的链,列出对应链的规则–line-number:显示每条规则的序号,可以使用该序号直接删除该规则-F:指定一个链,清空对应链中的所有规则-I: 指定一个链,表示要加入一条规则在链中,放在所有规则的首部-A:指定一个链,追加一条规则,放在所有规则尾部-D: 删除一条规则,删除规则时必须指定表和链,可以根据 --line-number 返回的行号删除,也可以根据规则具体信息(匹配规则和动作)删除-S:指定链,查看规则定义,有时候我们想直接使用已有规则进行复制产生新的规则,可以使用 -S-P: 指定一个链,给某个链设置默认规则-N:新建一个自定义链-E: 修改自定义链的名字-X:删除自定义链,只有自定义链没有被任何默认链的规则引用时才可以删除-s: 指定源地址,可以匹配多个 ip 地址,用逗号隔开,也可以指定一个 ip 段-d: 指定目标地址-j: 指定处理动作,比如 ACCEPT,DRO,或者是一个自定义链-p: 指定协议类型,可以是 tcp/udp/icmp/sctp/esp 等-i: 表示指定从哪个网卡流入的,只能用于 INPUT,PREROUTING,FORWARD 链-o: 表示指定从哪个网卡留出的,只能用于 OUTPUT,POSTROUTING,FORWORD 链-m: 指定扩展模块–dport/–sport: 表示源端口和目标端口,依赖于 tcp 扩展模块(-m tcp),而且必须指定协议 -p tcp,–dport/–sport 是 tcp 扩展模块中的一个扩展匹配条件-m multiport --dports 334,80: 来在一条规则中同时指定多个端口 1.4 案例 端口转发 //外面访问公网IP的3306端口转发到私有IP对应的3306端口上 iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 3306 -j DNAT --to-destination 私网IP:3306 禁止某个 IP 访问服务 iptables -t filter -I INPUT -s 某个IP -j REJECT 常用命令 iptables -t nat -nL PREROUTING #显示nat表 PREROUTING规则链 iptables -t nat -nL PREROUTING --line-number #显示nat表 PREROUTING规则链以及规则编号 iptables -t nat -D PREROUTING 4 #删除nat表 PREROUTING规则链第4条规则 iptables -A OUTPUT -o lo -j ACCEPT #将本机设置为信任设备


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3