Firewall

简介

防火墙是一种网络安全设备,主要是通过硬件和软件的作用于内部和外部网络的环境间产生一种保护的屏障,从而实现对计算机不安全网络因素的阻断。

  • 所有流入流出的所有网络通信均要经过此防火墙。
  • 功能
    • 访问控制、隔离保护
  • 组成
    • 服务访问政策、验证工具、包过滤和应用网关

功能作用

  • 入侵检测功能
    • 主要有反端口扫描、检测拒绝服务工具、检测CGI/IIS服务器入侵、检测木马或者网络蠕虫攻击、检测缓冲区溢出攻击等功能,
    • 可以极大程度上减少网络威胁因素的入侵,有效阻挡大多数网络安全攻击。
  • 网络地址转换功能(NAT)
    • 分为源地址转换和目的地址转换,即SNAT和DNAT。可以由服务的发起者是谁来区分两者。
    • SNAT: 内部地址要访问公网上的服务时,内部地址会主动发起连接,将内部地址转换成公有ip
      • 修改源ip地址的目的一般都是为了让这个包能再回到自己这里,所以在iptables中,SNAT是在出口,也即POSTROUTING链发挥作用。
      • SNAT主要用于隐藏内部网络结构,避免受到来自外部网络的非法访问和恶意攻击,有效缓解地址空间的短缺问题,
    • DNAT:当内部需要对外提供服务时,外部发起主动连接公有ip的网关,路由器或着防火墙的网关接收到这个连接,然后把连接转换到内部,此过程是由带公有ip的网关代替内部服务来接收外部的连接,然后在内部做地址转换。
      • 修改目的ip地址的原因一般就是为了改变包发送的目的地,让包走出去,而不是留下来,所以在iptables中,DNAT是在入口,也即PREROUTING链中发挥作用,以便让包进入FORWARD表。
      • DNAT主要用于外网主机访问内网主机,以此避免内部网络被攻击。
      • DNAT与端口转发的区别在哪里?
  • 网络操作的审计监控功能
    • 对系统管理的所有操作以及安全信息进行记录,提供有关网络使用情况的统计数据,方便计算机网络管理以进行信息追踪。
  • 强化网络安全服务(类似GFW)
    • 集中化的安全管理,将安全系统装配在防火墙上,在信息访问的途径中就可以实现对网络信息安全的监管。

Linux实现原理

  • Linux系统内核中的安全框架Netfilter,为其他内核模块提供数据包过滤、网络地址转换(NAT)和负载均衡的功能。
  • 常用的iptables和firewalld服务都依赖于Netfilter来过滤数据包,两者自身并不具备防火墙的功能,只是创建并维护规则。
    • 不同之处在于iptables基于“过滤规则链”,firewalld基于zone区域。
    • iptables无守护进程,不能算作真正的服务,firewalld存在守护进程

三表五链 - 三表(应用规则)

  • filter 用于过滤,防火墙,过滤数据包
  • nat 用于网络地址转换、端口转发
  • mangle 用于拆解报文,作出修改,封装报文
  • raw表, 关闭nat表上启用的连接追踪机制,以提高性能。
    • 表规则应用优先级:raw>mangle>nat>filter
    • 每个表中能存在的链如下

三表五链 - 五链(数据包状态/ 过滤规则链)

  • PREROUTING 进入路由之前的数据包
  • INPUT 目的地址为本机的输入数据包
  • FORWARD 目的地址不为本机的包,可以实现转发(需要开启)
  • OUTPUT 源地址为本机的输出数据包
  • POSTROUTING 发送到网卡之前的数据包

Nftables

  • Allows configuration of tables, chains and rules provided by the Linux kernel firewall.
  • Nftables replaces iptables.
    • 解决的iptables的不足
      • 不同协议实现的代码重复
      • Nftables通过增强的通用集和映射基础结构,可以更快地进行数据包分类。
      • 解决语法不一致的问题,并提供更好,更紧凑的语法。
  • OpenWRT和ubuntu都使用Nftables

与iptables表的对应关系

nftables簇 iptables实用程序
ip iptables
ip6 ip6tables
inet iptables和ip6tables
arp arptables
bridge ebtables
  • ip(即IPv4)是默认簇,如果未指定簇,则使用该簇。
  • 创建同时适用于IPv4和IPv6的规则,请使用inet。inet允许统一ip和ip6簇,以便更容易地定义规则。

输出解释

1
2
3
4
5
6
7
8
9
10
11
table inet warp {
chain warp-in {
type filter hook input priority mangle; policy accept;
ip6 saddr 2606:4700:d0::a29f:c001 udp sport 1701 @th,72,24 set 0x0
}

chain warp-out {
type filter hook output priority mangle; policy accept;
ip6 daddr 2606:4700:d0::a29f:c001 udp dport 1701 @th,72,24 set 0x46c997
}
}
  • type 可以是filterroute或者nat
  • hook 在IPv4/IPv6/Inet地址簇中,可以是preroutinginputforwardoutput或者postrouting。其他地址簇中的钩子列表请参见nft(8)。

iptables命令

查看默认表filter的规则

对于每条链,内核会按照顺序依次检查 iptables 防火墙规则,如果发现有匹配的规则目录,则立刻执行相关动作,停止继续向下查找规则目录;如果所有的防火墙规则都未能匹配成功,则按照默认策略处理。

1
2
3
4
$ sudo iptables -vnL 
Chain INPUT (policy ACCEPT 2211K packets, 855M bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
  • 命令
    • 默认 -t filter
    • -v 显示详细信息,-n显示具体ip和端口数值
  • 输出
    • policy ACCEPT 当前链的默认策略 ACCEPT
    • pkts:对应规则匹配到的报文的个数。
    • bytes:对应匹配到的报文包的大小总和。
    • target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。
    • prot:表示规则对应的协议,是否只针对某些协议应用此规则。
    • opt:表示规则对应的选项。
    • in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
    • out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
    • source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
    • destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。

添加的动作

命令部分:-j + 如下动作

  • ACCEPT:允许数据包通过。
  • DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
  • DNAT:目标地址转换。
  • REDIRECT:在本机做端口映射。
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

iptables管理命令

  • 选择表
    • -t指定表
  • 添加新规则
    • -A在链的最后追加一条规则 
    • -I在链的开头或指定序号插入一条规则 
    • -x显示精确值,不做单位换算
  • 替换规则
    • -R替换一条指定的规则
  • 查看规则
    • -L列出所有规则 
    • -n以数据形式显示地址与端口信息 
    • -v以更加详细的方式显示 
    • –line-numbers查看规则时,显示规则序号
  • 删除或清空规则
    • -D删除指定序号的一条规则 
    • -F清空指定表中的所有规则
  • 设置默认策略
    • -P为指定的链设置默认规则
  • 新建规则链
    • -N新建自定义链
  • 重命名链
    • -E重命名自定义链
  • 删除链
    • -X删除自定义空链 
    • -Z计数器清零

常见实例

Add a NAT rule to translate all traffic from the 192.168.0.0/24 subnet to the host’s public IP:

1
2
3
4
5
6
7
8
$sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

$ sudo iptables -t nat -vnL --line-numbers
Chain POSTROUTING (policy ACCEPT 19 packets, 1551 bytes)
num pkts bytes target prot opt in out source destination
6 0 0 MASQUERADE all -- * * 192.168.0.0/24 0.0.0.0/0

$ sudo iptables -t nat -D POSTROUTING 6 #delete

有待学习

  • docker相关的iptables的输出
  • OpenWRT上iptables完全是空的,是显示错误还是防火墙用了firewalld
  • node5上的warp的mangle在哪里?

Ubuntu配置

Windows配置

  • 入站规则
  • 出站规则

OpenWRT配置

to finished

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://blog.csdn.net/weixin_45649763/article/details/103338747

https://juejin.cn/post/7108726951304495135

https://icloudnative.io/posts/using-nftables/

Author

Shaojie Tan

Posted on

2023-08-07

Updated on

2025-01-30

Licensed under