【笔记】openwrt

您所在的位置:网站首页 iptables命令详解查看 【笔记】openwrt

【笔记】openwrt

2024-07-12 12:08| 来源: 网络整理| 查看: 265

参考

[译] NAT - 网络地址转换(2016)https://arthurchiao.art/blog/nat-zh/[译] 深入理解 iptables 和 netfilter 架构 https://arthurchiao.art/blog/deep-dive-into-iptables-and-netfilter-arch-zh/iptables使用总结 - https://www.cnblogs.com/wn1m/p/10919742.html详解 OpenWrt 防火墙配置、NAT配置 - https://blog.csdn.net/weixin_38387929/article/details/117828113

在这里插入图片描述 (以OpenWrt为例)

⭐️⭐️⭐️⭐️⭐️

Netfilter中的数据包流向和各hook点位置配图 请添加图片描述 原图:https://arthurchiao.art/assets/img/deep-dive-into-iptables-netfilter/Netfilter-packet-flow.svg

简化图:数据包过滤匹配流程 在这里插入图片描述

文章目录 IPTables 和 NetfilterIPTables 的表(Tables)IPTables 的链(Chains)基本命令 filter表的几个重要命令# 例子:禁止自己被ping nat表的几个重要命令# 选择匹配模式(pattern)# 匹配后的动作(action)# nat机器的配置# 例子:将私有网络通过 NAT 连接到互联网(路由nat原理)# 例子:通过 NAT 从外网访问内网服务(端口映射)# 例子:透明代理# 例子:通过跳板机绕过某端口 IPTables 日志:# 例子:记录所有ssh服务的登录的日志# 日志级别# 日志位置# 如何读取IPTables日志 OpenWrt 内置防火墙介绍配置文件 /etc/init.d/firewall

IPTables 和 Netfilter

netfilter(官网:https://netfilter.org/)顾名思义是一个网络数据包过滤框架。它提供了 5 个 hook 点,每个进入网络系统的包(接收或发送)在经过协议栈时都会触发这些 hook。触发哪个 hook 取决于包的方向(是发送还是接收)、包的目的地址、以及包在上一个 hook 点是被丢弃还是拒绝等等。

iptables 是使 用很广泛的防火墙工具之一,它基于内核的包过滤框架(packet filtering framework) netfilter。

包 - 网络层 帧 - 数据链路层 段 - 传输层

iptables 相关的内核模 块在这些 hook 点注册了处理函数,因此可以通过配置 iptables 规则来使得网络流量符合 防火墙规则。

防火墙虽然可以过滤互联网的数据包,但是无法过滤内部网络的数据包。

IPTables 的表(Tables)

iptables 使用 table 来组织规则,根据用来做什么类型的判断(the type of decisions they are used to make)标准,将规则分为不同 table。例如,如果规则是处理 网络地址转换的,那会放到 nat table;如果是判断是否允许包继续向前,那可能会放到 filter table。

具体看看这些 table 是如何按规则类型区分的。

Filter(常用)(流量过滤) filter table 是最常用的 table 之一,用于判断是否允许一个包通过。

在防火墙领域,这通常称作“过滤”包(”filtering” packets)。这个 table 提供了防火墙 的一些常见功能。

NAT (Network Address Translation 网络地址转换)(常用)(流量转发) nat table 用于实现网络地址转换规则。

当包进入协议栈的时候,这些规则决定是否以及如何修改包的源/目的地址,以改变包被 路由时的行为。nat table 通常用于将包路由到无法直接访问的网络。

Mangle(碾压)(流量跟踪) mangle (修正)table 用于修改包的 IP 头。

例如,可以修改包的 TTL,增加或减少包可以经过的跳数。

这个 table 还可以对包打只在内核内有效的“标记”(internal kernel “mark”),后 续的 table 或工具处理的时候可以用到这些标记。标记不会修改包本身,只是在包的内核 表示上做标记。

Raw(生的、原始的)(流量整形) iptables 防火墙是有状态的:对每个包进行判断的时候是依赖已经判断过的包。

建立在 netfilter 之上的连接跟踪(connection tracking)特性使得 iptables 将包 看作已有的连接或会话的一部分,而不是一个由独立、不相关的包组成的流。连接跟踪逻 辑在包到达网络接口之后很快就应用了。

raw table 定义的功能非常有限,其唯一目的就是提供一个让包绕过连接跟踪的框架。

Security security table 的作用是给包打上 SELinux 标记,以此影响 SELinux 或其他可以解读 SELinux 安全上下文的系统处理包的行为。这些标记可以基于单个包,也可以基于连接。

IPTables 的链(Chains)

在IPTablse的每个 table 内部,规则被进一步组织成 chain(分别为:PREROUTING 路由前、FORWARD 转发 、POSTROUTING 路由后、INPUT 入站、OUTPUT 出站),内置的 chain 是由内置的 hook 触发 的。chain 基本上能决定(basically determin)规则何时被匹配。

例如:和 NAT 相关的最重要的规则,都在 nat 这个table 里。这个表有三个预置的 chain:PREROUTING, OUTPUT 和 POSTROUTING。 在这里插入图片描述 包经过 PREROUTING chain 之后,将进行路由判 断。如果目的是本机,那接下来的过程将不涉及 NAT;如果目的是网络内的其他机器,那包 将会被转发到那台机器,前提是这台机器配置了允许转发。 . 在转发包离开本机之前,它会经过 POSTROUTING chain。对于本机生成的包,这里还有一 点不同:它会先经过 OUTPUT chain,然后再经过 POSTROUTING chain。

Tables/ChainsPREROUTINGINPUTFORWARDOUTPUTPOSTROUTING(路由判断)YrawYY(连接跟踪)YYmangleYYYYYnat (DNAT)YY(路由判断)YYfilterYYYsecurityYYYnat (SNAT)YYY

在这里插入图片描述

上面的表格展示了 table 和 chain 的关系。横向是 table, 纵向是 chain,Y 表示 这个 table 里面有这个 chain。例如,第二行表示 raw table 有 PRETOUTING 和 OUTPUT 两 个 chain。具体到每列,从上倒下的顺序就是 netfilter hook 触发的时候,(对应 table 的)chain 被调用的顺序。 .

有几点需要说明一下。在下面的图中,nat table 被细分成了 DNAT (修改目的地址) 和 SNAT(修改源地址),以更方便地展示他们的优先级。另外,我们添加了路由决策点 和连接跟踪点,以使得整个过程更完整全面

结合最开始的包流向图,我们可以得到如下不同场景下包的游走流程:

收到的、目的是本机的包:PRETOUTING -> INPUT收到的、目的是其他主机的包:PRETOUTING -> FORWARD -> POSTROUTING本地产生的包:OUTPUT -> POSTROUTING

再综合前面讨论的 table 顺序问题,我们可以看到对于一个收到的、目的是本机的包:首先依次经过 PRETOUTING chain 上面的 raw、mangle、nat table;然后依次经 过 INPUT chain 的 mangle、filter、security、nat table,然后才会到达本机 的某个 socket。

基本命令 # Abstract structure of an iptables instruction: iptables [-t table] [-command chain] [match pattern] [-j action] -t table 表名,默认filter -comman chain 管理选项,如:添加A、插入I、删除D、查看L match pattern 数据包特征,如:ip、端口等 -j action 控制类型(数据包的处理方式),如:ACCEPT 允许、REJECT 拒绝、DROP 丢弃、LOG 记录日志

查询

iptables -t filter -L -n # -t table 对指定的表进行操作(默认-t filter) # -L list 列出指定表的数据 # -n 数字的输出地址和端口 $ sudo iptables -t filter -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

添加规则(APPEND)

iptables -t filter -A INPUT -p tcp --dport 8081 -j DROP # --append -A chain Append to chain # DROP 丢弃数据包 # --jump -j target for rule (may load target extension) # --protocol -p proto protocol: by number or name, eg. `tcp' # dport:目的端口 destination # sport:来源端口 source $ iptables -t filter -A INPUT -j DROP -p tcp --dport 8081 $ iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere anywhere tcp dpt:8081 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 这时候,如果8081有监听一个web服务器在监听,那么数据包进入(INPUT)8081端口时会被丢弃

删除规则

# --delete -D chain rulenum # Delete rule rulenum (1 = first) from chain # 删除INPUT 规则集合中的第一条规则 $ iptables -D INPUT 1 $ iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

插入规则(INSERT)

# 如果有多条规则,则条目越前,优先级越高 # 为了插入优先级较高的条目,这里需要INSERT iptables -I INPUT 5 -p tcp -dport 8081 -t filter -j DROP

多端口指定

iptables -A INPUT -p tcp -m multiport --dport 80,21 -j DROP

多ip指定

iptables -I INPUT -p tcp -m iprange --src-range 192.168.49.184-192.168.49.200 DROP

mac指定

iptables -I INPUT -m mac --mac-source 00:0C:29:64:E3:8D -j ACCEPT

tpc状态

iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT filter表的几个重要命令

Ubuntu18.04的网络配置(静态IP和动态IP) - https://www.cnblogs.com/opsprobe/p/9979234.html

# 例子:禁止自己被ping

自己可以ping别人,别人不能ping自己

$ sudo iptables -t filter -I INPUT -p icmp --icmp-type 8 -j DROP $ sudo iptables -t filter -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP icmp -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

别人ping我,INPUT,icmp-type=8,被丢弃 在这里插入图片描述

在这里插入图片描述

使用ipv6的话,命令要改改

ip6tables -t filter -A input_wan_rule -p ipv6-icmp --icmpv6-type 128 -j DROP IPv6基础篇(三):ICMPv6的整体介绍 https://zhuanlan.zhihu.com/p/109694886使用 ip6tables 配置一个用于拨号上网的 ipv6 防火墙 https://blog.sbw.so/u/use-ip6tables-config-fire-wall-for-ipv6.html nat表的几个重要命令

默认的 table 是 filter table,因此我们接下来每次都要指定 -t nat

最重要的几个命令:

# In the following "chain" represents # one of the chains PREROUTING, OUTPUT and POSTROUTING # add a rule: $> iptables -t nat -A chain [...] # list rules: $> iptables -t nat -L # remove user-defined chain with index 'myindex': $> iptables -t nat -D chain myindex # Remove all rules in chain 'chain': $> iptables -t nat -F chain

完整 iptables 命令可以查看 man page:

# manual pages of iptables $> man iptables

按 q 退出帮助。

# 选择匹配模式(pattern)

要对特定包进行处理需要指定匹配模式。如下是几个重要的例子,完整模式信息请参阅 iptables man page。

# actions to be taken on matched packets # will be abbreviated by '[...]'. # Depending on the match pattern the appropriate chain is selected. # TCP packets from 192.168.1.2: $> iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.2 [...] # s source # UDP packets to 192.168.1.2: $> iptables -t nat -A POSTROUTING -p udp -d 192.168.1.2 [...] # d destination # all packets from 192.168.x.x arriving at eth0: $> iptables -t nat -A PREROUTING -s 192.168.0.0/16 -i eth0 [...] # i interface # all packets except TCP packets and except packets from 192.168.1.2: $> iptables -t nat -A PREROUTING -p ! tcp -s ! 192.168.1.2 [...] # packets leaving at eth1: $> iptables -t nat -A POSTROUTING -o eth1 [...] # TCP packets from 192.168.1.2, port 12345 to 12356 # to 123.123.123.123, Port 22 # (a backslash indicates contination at the next line) $> iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.2 \ --sport 12345:12356 -d 123.123.123.123 --dport 22 [...]

大部分选项都有长短两种格式,例如 --source 和 -s,长格式写起来麻烦,但更易 阅读。

# 匹配后的动作(action)

至此,我们已经可以指定匹配模式来过滤包了,接下来就是选择合适的动作。对于 nat table,有如下几种动作:SNAT, MASQUERADE, DNAT, REDIRECT,都需要通过 -j 指定。它们的格式如下(表示的意思将在下一节介绍):

# In the following the table selection, the command and the match pattern # will be abbreviated using [...] # 修改源 IP 为固定新 IP (静态) # Source-NAT: Change sender to 123.123.123.123 $> iptables [...] -j SNAT --to-source 123.123.123.123 # -------------------------- # 因为 SNAT 只对离开路由器的包有意义,因此它只用在 POSTROUTING chain 中。 # 修改源 IP 为动态新 IP(动态获取网络接口 IP) # Mask: Change sender to outgoing network interface $> iptables [...] -j MASQUERADE # -------------------------- # 和 SNAT 类似,但是对每个包都会动态获取指定输出接口(网卡)的 IP,因此如果接口 的 IP 地址发送了变化,MASQUERADE 规则不受影响,可以正常工作;而对于 SNAT 就必须重新调整规则。 # 和 SNAT 一样,MASQUERADE 只对 POSTROUTING chain 有意义。但和 SNAT 不同, MASQUERADE 不支持更详细的配置项了。 # 修改目的 IP # Destination-NAT: Change receipient to 123.123.123.123, port 22 $> iptables [...] -j DNAT --to-destination 123.123.123.123:22 # -------------------------- # 如果想修改包的目的 IP 地址,那需要使用 Destination NAT(DNAT)。 # DNAT 可以用于运行在防火墙后面的服务器。 # 显然,接收端修改必须在做路由决策之前,因此 DNAT 适用于 PREROUTING 和 OUTPUT (本地生成的包)chain。 # 将包重定向到本机另一个端口 # Redirect to local port 8080 $> iptables [...] -j REDIRECT --to-ports 8080 # -------------------------- # REDIRECT 是 DNAT 的一个特殊场景。包被重定向到路由器的另一个本地端口,可以实现, 例如透明代理的功能。和 DNAT 一样,REDIRECT 适用于 PREROUTING 和 OUTPUT chain 。 # nat机器的配置

要使用 NAT,我们首先需要配置机器。下面的例子中,# 开头的是注释,$> 开头的是命 令。

# IMPORTANT: Activate IP-forwarding in the kernel! # 开启ip转发功能,默认关闭。关闭时,遇到非本地ip会直接丢弃 # Disabled by default! $> echo "1" > /proc/sys/net/ipv4/ip_forward # centos可以改成执行下面命令,然后重启以下 echo "net.ipv4.ip_forward=1">>/usr/lib/sysctl.d/50-default.conf # 检察,看到net.ipv4.ip_forward = 1 就ok了 sysctl -a | grep ip_forward # Load various modules. Usually they are already loaded # (especially for newer kernels), in that case # the following commands are not needed. # Load iptables module: $> modprobe ip_tables # activate connection tracking # (connection's status are taken into account) $> modprobe ip_conntrack # Special features for IRC: $> modprobe ip_conntrack_irc # Special features for FTP: $> modprobe ip_conntrack_ftp

以上配置应该足够了。如果遇到错误,可能是因为你的内核在编译时没有指定路由相关的选 项,请参考这里 http://www.comptechdoc.org/os/linux/usersguide/linux_ugipmasq.html。

# 例子:将私有网络通过 NAT 连接到互联网(路由nat原理)

从本地网络发出的、目的是互联网的包,将发送方地址修改为路由器 的地址。

接下来假设路由器的本地网络走 eth0 端口,到因特网的网络走 eth1 端口。那么如 下命令就能完成我们期望的功能:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE # https://www.bilibili.com/video/BV15541157wS?p=12

解释:

-t nat 指定对名为 nat 的 iptables table 配置 NAT 规则-A POSTROUTING 追加(A: Append)规则到 iptables 的 POSTROUTING chain-o eth1 指定只对从 eth1 发出的数据包做操作(o: output)-j MASQUERADE 规则匹配成功后的动作是 masquerade (伪装)数据包,将源地址修改为路由器地址

如果路由器配置的是静态 IP 地址,那 SNAT 是最合适的选择,因为它比 MASQUERADE 更 快,后者对每个包都需要检查指定的输出端口上配置的 IP 地址。

# Options for SNAT (abstract of manual page) iptables -t nat -A POSTROUTING -o eth0 -j DNAT --to-source [-][:port-port] # 例子:通过 NAT 从外网访问内网服务(端口映射)

运行在 NAT 路由器后面的内网服务器,默认是不能被外部网络直接访问的。例如,假设我 们有一个 HTTP 服务运行在内网机器 192.168.1.2,NAT 路由器的地址是 192.168.1.1 ,并通过另一张有公网 IP 123.123.123.123 的网卡连接到了外部网络。

要使得外网机器可以访问 192.168.1.2 的服务,需要执行:

# redirect http traffic to 192.168.1.2: $> iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to 192.168.1.2

然后,就可以通过公网 IP 123.123.123.123 的 80 端口访问 192.168.1.2 的 HTTP 服务了。

更换映射的服务端口,可以防止别人盯着一个端口一直ping

# 把10机子的ssh服务端口更换到3333 iptables -t nat -A PREROUTING -i ens34 -d 192.168.200.10 -p tcp --dport 3333 -j DNAT --to-destination 192.168.100.10:22 # 例子:透明代理

假设我们有一个本地网络,通过 NAT 连接到因特网。我们需要在路由器的 8080 端口运行 一个 HTTP 代理,处理本地网络 HTTP 流量。

首先想到的解决方案是:让每个用户设置他们的浏览器使用代理服务器,然后禁止所有 80 端口的出流量。对于很小的网络,这种方式可能让人满意,但无法扩展到很大的网络,因为 这种方式需要对每个客户端进行配置。(也失去了“透明代理”的意义)。 在这里插入图片描述 使用 NAT,我们有另一种可能:所有从 80 端口进来的流量,重定向到 8080 端口。相应 的命令:

# Transparent proxying: # (local net at eth0, proxy server at port 8080) $> iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \ -j REDIRECT --to-ports 8080

当然,8080 端口要有 HTTP 代理运行。另外,你的服务器可能做一些特殊配置(甚至特殊 编译)才能支持透明代理。

透明代理的缺点是 CPU load 会升高(尤其是大型网络),对太新或太旧的浏览器可能有兼 容性问题。

# 例子:通过跳板机绕过某端口

假设110端口坏了,我们使用 NAT 可以绕过它。

找一个110端口好的跳板机,在它上寻找一个可用端口,例如:111.111.111.111:5001,做透明代理。

首先,在你自己的(内网)机器上执行:

# redirect http-Traffic going to Port 110 to 111.111.111.111:5001: $> iptables -t nat -A OUTPUT -p tcp --dport 110 \ -j DNAT --to-destination 111.111.111.111:5001

然后,在跳板机上执行

# redirect port 5001 to port 110 (POP3) at 123.123.123.123: $> iptables -t nat -A PREROUTING -p tcp --dport 5001 \ -j DNAT --to-destination 123.123.123.123:110 # Change sender to redirecting machine: $> iptables -t nat -A POSTROUTING -p tcp --dport 110 \ -j MASQUERADE

这样就成功绕过了坏了的110端口。 在这里插入图片描述

或者,不需要 iptables 规则,你可以设置浏览器的默认端口是 5001,但是这可能有一些 潜在的问题。

IPTables 日志:

⭐️ 【笔记】openwrt - 日志 logger、syslog/rsyslog https://lawsssscat.blog.csdn.net/article/details/103377807

如何在Linux上启用iptables日志:https://www.howtoing.com/enable-logging-in-iptables-on-linux

iptables防火墙如何记录日志:https://www.linuxprobe.com/iptables-record-log.html

openwrt日志用logger、logd、logread进行管理查看。下面希望引入rsyslog进行日志管理

首先,我们需要了解如何将所有的iptables的INPUT链数据包记录到/var/log/messages中。如果你已经有一些iptables规则了,那么将记录日志的规则放在这些规则的顶部,如果放在规则的后面,将不会记录日志。

# 例子:记录所有ssh服务的登录的日志 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 4/min -j LOG --log-prefix "Iptables-SSH-IN: " --log-level 4 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -P INPUT DROP

上面第一条规则解释:

-m limit:使用limit模块。使用此选项,可以使用–limit选项限制访问速率。--limit 4/min:这表示记录的最大平均访问速率。在此示例中,对于类似的数据包,它将日志记录限制为每分钟4个。还可以设置为2/second, 2/minute, 2/hour, 2/day。-j LOG:这表示此数据包的目标是LOG。即写入日志文件。--log-prefix "Iptables-SSH-IN: ” 可以指定任何日志前缀,这些前缀将写入到/var/log/messages日志文件中。--log-level 4这是标准的系统日志级别。4是警告(warning)。可以使用0到7之间的数字。0是emerg,1是alert,2是crit,3是err,4是warning,5是notice,6是info,7是debug。 # 日志级别

man syslog的8种级别,这里面的日志级别要与iptables的–log-level 的日志级别要对应.

$ iptables -A INPUT -s 192.168.10.0/24 -j LOG --log-level 4

这是标准的系统日志级别。4是警告(warning)。可以使用0到7之间的数字。0是emerg,1是alert,2是crit,3是err,4是warning,5是notice,6是info,7是debug。

# 日志位置

(默认情况下,iptables将使用/var/log/messages记录所有消息。) (更多syslog.conf配置细节参考man syslog)

# 前提需要安装rsyslog服务: # yum -y install rsyslog # systemctl enable rsyslog --now # 修改日志位置 vi /etc/syslog.conf # 添加以下行 kern.warning /var/log/iptables.log # 重新启动rsyslog服务。 $ service rsyslog restart # 如何读取IPTables日志 [root@localhost ~]# cat /var/log/iptables.log Feb 9 10:46:20 localhost kernel: Iptables-SSH-IN: IN=ens160 OUT= MAC=00:0c:29:ae:7d:09:00:50:56:c0:00:08:08:00 SRC=192.168.43.1 DST=192.168.43.137 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=49928 DF PROTO=TCP SPT=16512 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0 Iptables-SSH-IN: 通过指定–log-prefix选项,这是我们在日志记录中使用的前缀IN=ens160 OUT=: 这表示从该接口传入数据包。对于传出数据包将为空。IN= OUT=: 这表示从该接口传出数据包。对于传入的数据包将为空。MAC=: 分成三部分,00:0c:29:ae:7d:09为目标MAC地址,00:50:56:c0:00:08为源MAC地址,08:00为上层协议代码,表示IP协议。SRC=: 源IP地址DST=:目的IP地址LEN=: 数据包的长度PROTO=: 使用什么类型协议SPT=: 源端口DPT=: 目标端口 OpenWrt 内置防火墙介绍

Openwrt是一个GNU/Linux的发行版,Openwrt的防火墙与Linux的防火墙是通过netfilter内核模块,加上用户空间的iptables管理工具实现的 ── 同样是五链四张表、五元素的管理框架。

OpenWRT开发了一套与iptables同地位的netfilter管理工具fw3,这个工具侧重于从uci格式的配置文件中获取过滤信息下发到内核的netfilter中去。

配置文件 /etc/init.d/firewall

防火墙文件总会在/etc/init.d/firewall启动的时候由UCI解码并且生成iptables规则生效。

OpenWrt关于NAT、DMZ、防火墙规则等等都是由配置文件/etc/config/firewall文件控制。

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


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