Linux
Kali 安装
Kali-WIFI密码(字典)
Armbian安装OMV(NAS)
NPS 内网穿透
CloudFlare
CloudFlare-免端口
CloudFlare-KV存储
API 使用
API-抓包信息使用
Linux-系统配置
Linux-更换源
Linux-一键更换源
Linux-权限
Linux-分区管理
Linux-网卡配置
Linux 端口转发
Linux 交换内存
Linux 进程优先级
Linux 共享打印机
Linux-自定义服务(支持Docker开机自启)
Linux-硬/软链接/挂载
Linux-系统时钟
Linux-清理命令记录
Linux-一键DD脚本
Linux-安装根证书
Linux-TheFuck(命令纠正)
Linux 服务器
Linux-面试鸭
Linux-Mall-Cook(商店可视化搭建)
Linux-Scratch
Linux-CasaOS(家庭云操作系统)
Linux-TiddlyWiki(非线性网页笔记)
Linux-拖拽式H5
Linux-鲁班H5
Linux-SSL证书续订
Linux-acme(SSL证书脚本)
SSL证书转换
SSL-httpsok
SSL-其它工具
Linux-LoveCards(表白墙)
Linux-游戏导航
Linux 常用命令
Linux-scp
Linux-打包/解压/压缩
Linux-SSH
Linux-portknocking(端口敲击)
Linux-获取当前公网IP
Linux-自动挂载盘
Linux-代理
Linux-nmap(局域网扫描)
Linux-jq(JSON处理)
Linux-DDNS(自制脚本)
Linux-shell传递参数
Linux-if(判断)
Linux-curl/wget
Linux-which(查看命令所在路径)
Linux-Maven
Linux-ncdu(清理日志)
Linux-共享
Linux-screen(终端切换)
Linux-Macchanger(MAC修改)
Linux-iptables(包过滤防火墙系统)
Linux-祸害人脚本
Linux-模拟网络延迟环境
Linux-Git
Linux-apt(安装软件)
Linux-crontab(定时任务)
Linux-nano/vi/vim 编辑器
Linux 环境安装
Linux 安装 Node.js
Node.js-创建通用执行
Linux 安装 Java
Linux 安装 Go
域名注册
MariaDB-相关操作
未测试开源项目
SQL 学习
SQL-常用指令
Ansible(自动化运维)
Zabbix(运维监控)
网络设备概述
备份概述
雷池WAF
Linux-新旧服务器同步rpm软件包
本文档使用 MrDoc 发布
-
+
首页
Linux-portknocking(端口敲击)
必须依次进行端口敲门才可以访问到所需访问端口 **相关链接:** - 端口敲击示例:https://wiki.nftables.org/wiki-nftables/index.php/Port_knocking_example ## 敲门示例1 敲门序列是 TCP 端口:123、234、345、456 ```bash define guarded_ports = {ssh} # 定义一个变量 guarded_ports,它包含需要保护的端口,这里是 ssh 端口 table inet portknock { # 定义一个名为 portknock 的表,用于处理 IPv4 和 IPv6 的数据包 set clients_ipv4 { type ipv4_addr # 定义一个名为 clients_ipv4 的集合,用于存储 IPv4 地址 flags timeout # 设置集合的超时标志,表示集合中的地址会在一定时间后过期 } set clients_ipv6 { type ipv6_addr # 定义一个名为 clients_ipv6 的集合,用于存储 IPv6 地址 flags timeout # 设置集合的超时标志 } set candidates_ipv4 { type ipv4_addr . inet_service # 定义一个名为 candidates_ipv4 的集合,用于存储 IPv4 地址和对应的服务 flags timeout # 设置集合的超时标志 } set candidates_ipv6 { type ipv6_addr . inet_service # 定义一个名为 candidates_ipv6 的集合,用于存储 IPv6 地址和对应的服务 flags timeout # 设置集合的超时标志 } chain input { type filter hook input priority -10; policy accept; # 定义一个名为 input 的链,设置为过滤类型,挂载在输入钩子上,优先级为 -10,默认策略为接受 iifname "lo" return # 如果数据包进入的是本地回环接口(lo),则直接返回,不进行后续处理 tcp dport 123 add @candidates_ipv4 {ip saddr . 234 timeout 1s} # 如果收到目标端口为 123 的 TCP 数据包,将源 IPv4 地址添加到 candidates_ipv4 集合中,并设置超时为 1 秒 tcp dport 123 add @candidates_ipv6 {ip6 saddr . 234 timeout 1s} # IPv6 版本的相同规则 tcp dport 234 ip saddr . tcp dport @candidates_ipv4 add @candidates_ipv4 {ip saddr . 345 timeout 1s} # 如果收到目标端口为 234 的 TCP 数据包,并且源地址在 candidates_ipv4 集合中,将其添加到 candidates_ipv4 集合中,并设置超时为 1 秒 tcp dport 234 ip6 saddr . tcp dport @candidates_ipv6 add @candidates_ipv6 {ip6 saddr . 345 timeout 1s} # IPv6 版本的相同规则 tcp dport 345 ip saddr . tcp dport @candidates_ipv4 add @candidates_ipv4 {ip saddr . 456 timeout 1s} # 如果收到目标端口为 345 的 TCP 数据包,并且源地址在 candidates_ipv4 集合中,将其添加到 candidates_ipv4 集合中,并设置超时为 1 秒 tcp dport 345 ip6 saddr . tcp dport @candidates_ipv6 add @candidates_ipv6 {ip6 saddr . 456 timeout 1s} # IPv6 版本的相同规则 tcp dport 456 ip saddr . tcp dport @candidates_ipv4 add @clients_ipv4 {ip saddr timeout 10s} log prefix "Successful portknock: " # 如果收到目标端口为 456 的 TCP 数据包,并且源地址在 candidates_ipv4 集合中,将其添加到 clients_ipv4 集合中,并设置超时为 10 秒,同时记录日志 tcp dport 456 ip6 saddr . tcp dport @candidates_ipv6 add @clients_ipv6 {ip6 saddr timeout 10s} log prefix "Successful portknock: " # IPv6 版本的相同规则 tcp dport $guarded_ports ip saddr @clients_ipv4 counter accept # 如果收到目标端口为 guarded_ports 定义的端口的 TCP 数据包,并且源地址在 clients_ipv4 集合中,计数并接受 tcp dport $guarded_ports ip6 saddr @clients_ipv6 counter accept # IPv6 版本的相同规则 tcp dport $guarded_ports ct state established,related counter accept # 如果收到目标端口为 guarded_ports 定义的端口的 TCP 数据包,并且连接状态为已建立或相关的,计数并接受 tcp dport $guarded_ports counter reject with tcp reset # 如果收到目标端口为 guarded_ports 定义的端口的 TCP 数据包,并且不满足上述条件,计数并拒绝,发送 TCP 重置包 } } ``` ## 敲门示例2 敲门序列是 TCP 端口:123、234、345、456 ```bash #!/usr/bin/env nft -f # 指定脚本解释器,`-f` 选项表示直接从文件读取规则并应用。 flush ruleset # 清空现有的规则集。 table ip Inet4 { # 定义一个名为 Inet4 的表,用于处理 IPv4 数据包。 set Knocked_1 { type ipv4_addr # 定义一个名为 Knocked_1 的集合,用于存储 IPv4 地址。 flags timeout # 设置集合的超时标志,表示集合中的地址会在一定时间后过期。 timeout 10s # 设置集合中的地址超时时间为 10 秒。 gc-interval 4s # 设置垃圾回收间隔为 4 秒。 } # 重复定义 Knocked_2, Knocked_3, Knocked_4 集合,超时时间分别为 10 秒、10 秒和 2 分钟。 chain Knock_1 { set add ip saddr @Knocked_1 # 将匹配的数据包的源地址添加到 Knocked_1 集合中。 } # 重复定义 Knock_2, Knock_3, Knock_4 链,用于更新集合中的地址超时时间并添加新地址。 chain Unknock_1 { set update ip saddr timeout 0s @Knocked_1 # 将 Knocked_1 集合中的地址超时时间更新为 0 秒,即立即过期。 } # 重复定义 Unknock_2, Unknock_3 链,用于更新集合中的地址超时时间。 chain Knock_4 { set update ip saddr timeout 0s @Knocked_3 # 更新 Knocked_3 集合中的地址超时时间。 set add ip saddr @Knocked_4 # 将匹配的数据包的源地址添加到 Knocked_4 集合中。 log prefix "Port-Knock accepted: " # 记录日志,前缀为 "Port-Knock accepted: "。 } chain RefreshKnock { set update ip saddr timeout 2m @Knocked_4 # 更新 Knocked_4 集合中的地址超时时间为 2 分钟。 } chain PortKnock { ct state new ip saddr @Knocked_4 goto RefreshKnock # 如果是新连接且源地址在 Knocked_4 集合中,跳转到 RefreshKnock 链。 tcp dport 456 ct state new ip saddr @Knocked_3 goto Knock_4 # 如果目标端口为 456 且源地址在 Knocked_3 集合中,跳转到 Knock_4 链。 tcp dport 345 ct state new ip saddr @Knocked_3 return # 如果目标端口为 345 且源地址在 Knocked_3 集合中,直接返回。 ip saddr @Knocked_3 ct state new goto Unknock_3 # 如果源地址在 Knocked_3 集合中且是新连接,跳转到 Unknock_3 链。 # 重复定义其他端口和集合的规则。 tcp dport 123 ct state new goto Knock_1 # 如果目标端口为 123 且是新连接,跳转到 Knock_1 链。 } chain FilterIn { type filter hook input priority 0 # 定义一个名为 FilterIn 的链,设置为过滤类型,挂载在输入钩子上,优先级为 0。 policy drop # 默认策略为丢弃。 # allow established/related connections # 允许已建立或相关的连接。 ct state established,related accept # early drop of invalid connections # 早期丢弃无效连接。 ct state invalid drop # allow from loopback # 允许来自本地回环接口的连接。 meta iif lo accept # allow icmp # 允许 ICMP 协议的数据包。 ip protocol icmp accept # port-knocking # 端口敲击。 jump PortKnock # misc. filtering # 其他过滤规则。 # ... } chain FilterOut { type filter hook output priority 0 # 定义一个名为 FilterOut 的链,设置为过滤类型,挂载在输出钩子上,优先级为 0。 policy accept # 默认策略为接受。 } } ``` **相关教程:** [一分钟学会:零信任技术之端口敲门](https://www.bilibili.com/video/BV1nb421J7zp/)
造物者W
2024年9月6日 13:58
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码