packet filter防火墙工具分享

admin 2024年4月22日06:15:13评论35 views字数 4590阅读15分18秒阅读模式

pf 防火墙是 macOS 上内置的一种基于状态的防火墙,可以根据 IP 地址、端口号、协议和其他条件来控制网络流量。而pfctl 是 macOS 上用于配置 pf 防火墙的命令行工具。

一、常见场景的命令及其功能介绍

1、加载和应用配置文件:

  • sudo pfctl -f /etc/pf.conf: 加载指定的 pf 防火墙配置文件 /etc/pf.conf 并使其生效。这样可以更新防火墙规则而无需重启系统。

2、防火墙状态和信息:
  • sudo pfctl -s info: 显示有关当前 pf 防火墙状态的详细信息,包括已加载的规则、网络接口配置等。
  • sudo pfctl -s state: 显示当前 pf 防火墙状态表中的状态信息。
  • sudo pfctl -s rules: 显示当前 pf 防火墙的规则集
  • sudo pfctl -s nat: 显示当前 pf 防火墙的网络地址转换 (NAT) 规则集

3、规则管理:

  • sudo pfctl -a 'rulename' -f /path/to/rules: 加载指定规则文件到名为 'rulename' 的规则集。

  • sudo pfctl -a 'rulename' -sr: 显示名为 'rulename' 的规则集中的规则。

  • sudo pfctl -a 'rulename' -d: 禁用名为 'rulename' 的规则集。

  • sudo pfctl -a 'rulename' -e: 启用名为 'rulename' 的规则集。

4、防火墙启用和禁用:

  • sudo pfctl -e: 启用 pf 防火墙,开始根据加载的规则进行流量过滤和控制。

  • sudo pfctl -d: 禁用 pf 防火墙,允许所有流量通过。

5、日志记录和调试:

  • sudo pfctl -s log: 显示当前的日志设置和日志文件的内容。

  • sudo pfctl -s all: 显示所有 pf 防火墙的状态、规则和日志信息。

这些是 pfctl 常见的命令和场景,用于配置、管理和监视 pf 防火墙。pfctl 还提供了其他选项和命令,可用于更高级的功能,如带宽控制、连接状态跟踪等。可以通过 man pfctl 命令查看完整的 pfctl 命令文档和选项说明。

二、场景测试

在分享之前,顺便介绍一个AI命令行工具Warp-集成了AI能力的command terminal,可以提高效率。

Warp is the terminal reimagined with AI

https://www.warp.dev/

比如我想知道如何curl baidu只显示response header头部份,可以这样:

packet filter防火墙工具分享

场景一:禁止访问IP地址

笔者是不想自己公司的电脑被DLP监控,所以想到通过pf来阻止mac电脑访问DLP的server端,是不是可行??

# 解析www.baidu.com 的IP地址nslookup www.baidu.com# 测试访问效果curl -I www.baidu.com# 更新防火墙规则sudo pfctl -f /etc/pf.confpfctl的规则block drop out quick from any to 153.3.238.102

这个 pfctl 配置规则的含义是阻止任何源 IP 地址的流量从本机(out)发送到目标 IP 地址 10.34.132.151,下面是对该配置的解读:

  • block drop: 这表明匹配的流量将被直接丢弃,并不会返回任何响应

  • out: 这表示该规则适用于从本机发送出去的流量

  • quick: 这表示一旦匹配到该规则,不再继续匹配其他规则,直接执行相应操作

  • from any: 这表示该规则适用于任何源 IP 地址

  • to 10.34.132.151: 这表示目标 IP 地址是 10.34.132.151

packet filter防火墙工具分享

场景二:禁止访问域名

测试直接禁止本地访问域名:www.baidu.com

# pfctl的规则block drop out quick from any to www.baidu.com

packet filter防火墙工具分享

‼️这里延伸一下,关于PF防火墙是根据什么原理来根据域名识别流量并采取动作的,我问了下chatgpt:

对于基于域名的规则,pf防火墙可以使用域名解析服务(如DNS)来获取与域名相关的IP地址。一旦获取到目标域名的IP地址,pf防火墙就可以将之与数据包中的目标地址进行比较。如果数据包的目标地址与规则中指定的域名的IP地址匹配,那么该规则就会被触发,从而对数据包进行相应的操作,如阻止(block)或丢弃(drop)。通过这种方式,pf防火墙可以根据域名来识别流量,并根据规则对其进行处理。

并不是笔者认为的比较高深的技术,那么我的问题来了,通过将配置的域名先解析为IP地址,在根据实际解析的IP进行识别,这个会存在不准确的问题,特别是对于一些域名解析结果特别多或者解析结果经常变化的,可能会识别错误,可以简单证明一下:

1)PF 写规则将www.baidu.com拦截

block drop out quick from any to www.baidu.com

2)按照下图所示的四步去配置

packet filter防火墙工具分享

3)我的猜测是,如果PF 防火墙是其他的原理,那么篡改hosts应该不会影响结果,但是测试下来是影响了,所以我猜测Pf 防火墙根据域名能识别流量的原理和上面chatgpt说的一至。

一顿瞎验证🙄,也不知道对不对,可以评论区留言讨论。

场景三:禁止IP+Port

禁止出去访问192.168.3.1的80端口,但不禁止其他,例如icmp

# pfctl的规则block drop out quick proto tcp from any to 192.168.3.1 port 80

packet filter防火墙工具分享

场景四:block drop & block return的不同

block drop上面说到,表明匹配的流量将被直接丢弃,并不会返回任何响应;block return则表示匹配的流量被拒绝并返回响应给客户端

先测试block drop:

block drop out quick proto tcp from any to 192.168.3.1 port 80

packet filter防火墙工具分享

再测试block return:

block return out quick proto tcp from any to 192.168.3.1 port 80

packet filter防火墙工具分享

场景五:阻止特定协议通过

例如禁止dns协议的流量出去:

block out proto udp

packet filter防火墙工具分享

三、高级用法

PF 防火墙除了基本的规则配置外还拥有强大的功能,拥有一些高级的用法和功能,包括:

  • 配置地址表(Tables):可以使用pfctl命令创建和管理地址表,用于存储IP地址、网络地址或端口号的集合。地址表可用于更灵活的配置规则,例如在规则中引用一个地址表来指定多个IP地址或网络。

  • 按时间调度规则:使用pfctl可以配置按时间调度的规则,即根据时间段或特定的日期来激活或禁用规则。这在需要按时段进行访问控制或限制的情况下非常有用。

  • 配置带宽控制和流量限制:pfctl允许配置带宽控制和流量限制,以实现流量管理和公平共享带宽。通过配置ALTQ(Alternate Queueing)功能,可以对特定流量进行带宽限制、优先级设置和队列管理。

这里演示下比较能用得到的配置地址表(Tables)。

1)创建地址表

sudo pfctl -t denyiplist -T add 192.168.3.1

2)添加/删除地址到地址表

# 删除sudo pfctl -t myblocklist -T delete 192.168.3.1# 添加sudo pfctl -t myblocklist -T add 192.168.3.1

3)查看地址表

# 查看sudo pfctl -t blocklist -T show

packet filter防火墙工具分享

4)在规则中引用地址表

# /etc/pf.conf规则引用地址表:denyiplistblock out quick from any to <denyiplist>

5)测试效果

packet filter防火墙工具分享

试验做的差不多了,最后通过命令总结一下。

# 查看一下防火墙的规 sudo pfctl -sr  等价:sudo pfctl -s rules# 查看pf防火墙所有信息sudo pfctl -s all

packet filter防火墙工具分享

sudo pfctl -s allNo ALTQ support in kernelALTQ related functions disabledTRANSLATION RULES:nat-anchor "com.apple/*" allrdr-anchor "com.apple/*" allFILTER RULES:scrub-anchor "com.apple/*" all fragment reassembleanchor "com.apple/*" allblock drop out quick inet from any to 10.34.132.151block drop out quick inet from any to 18.166.181.78block drop out quick from any to <denyiplist>DUMMYNET RULES:dummynet-anchor "com.apple/*" allINFO:Status: Enabled for 0 days 01:15:20           Debug: UrgentState Table                          Total             Rate  current entries                        0  searches                          476455          105.4/s  inserts                                0            0.0/s  removals                               0            0.0/sCounters  match                             308161           68.2/s  bad-offset                             0            0.0/s  fragment                               0            0.0/s  short                                  0            0.0/s  normalize                              0            0.0/s  memory                                 0            0.0/s  bad-timestamp                          0            0.0/s  congestion                             0            0.0/s  ip-option                              0            0.0/s  proto-cksum                            0            0.0/s  state-mismatch                         0            0.0/s  state-insert                           0            0.0/s  state-limit                            0            0.0/s  src-limit                              0            0.0/s  synproxy                               0            0.0/s  dummynet                               0            0.0/s  invalid-port                           0            0.0/sTIMEOUTS:tcp.first                   120stcp.opening                  30stcp.established           86400stcp.closing                 900stcp.finwait                  45stcp.closed                   90stcp.tsdiff                   30sudp.first                    60sudp.single                   30sudp.multiple                 60sicmp.first                   20sicmp.error                   10sgrev1.first                 120sgrev1.initiating             30sgrev1.estblished           1800sesp.first                   120sesp.estblished              900sother.first                  60sother.single                 30sother.multiple               60sfrag                         30sinterval                     10sadaptive.start             6000 statesadaptive.end              12000 statessrc.track                     0sLIMITS:states        hard limit    10000app-states    hard limit    10000src-nodes     hard limit    10000frags         hard limit     5000tables        hard limit     1000table-entries hard limit   200000TABLES:blocklistdenyiplistmyblocklisttableOS FINGERPRINTS:696 fingerprints loaded

原文始发于微信公众号(安全随笔):packet filter防火墙工具分享

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月22日06:15:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   packet filter防火墙工具分享https://cn-sec.com/archives/2611983.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息