找回密码
 加入我们
搜索
      
查看: 696|回复: 4

[网络] 基于 RouterOS 容器的动态防火墙访问控制方案

[复制链接]
发表于 2025-10-7 03:19 | 显示全部楼层 |阅读模式
一、核心目标:
我只想实现一个“按需授权”的远程访问控制系统,以替代传统的静态端口转发。其核心目标是:
1、最小化攻击面:默认情况下,防火墙不开放任何高风险服务的公网访问。
2、动态授权:允许合法用户从任意公网IP动态地、临时地获取访问权限。
3、自动化管理:整个授权和撤销过程自动化,无需人工干预路由器配置。
4、安全认证:通过一个安全的Web界面进行身份验证,作为触发授权的入口。
5、访问审计:对所有成功的授权请求进行记录,以便追踪和审查。

注意:本方案利用 RouterOS 强大的脚本和容器功能,结合一个轻量级的 Python Flask 应用,构建了一个基于 Webhook 触发的动态防火墙策略管理系统。


二、技术架构与实现思路
本方案利用 RouterOS 强大的脚本和容器功能,结合一个轻量级的 Python Flask 应用,构建了一个基于 Webhook 触发的动态防火墙策略管理系统。

2.1. 核心组件
RouterOS 主机 (v7+):
防火墙 (Firewall): 核心执行者。通过 Address List 实现动态白名单,并通过 NAT 规则的 src-address-list 属性实现对源IP的精确控制。
容器 (Container): 提供一个隔离的、轻量级的 Linux 运行环境,用于托管 Python Web 应用。
系统脚本 (Scripts): 预置在 RouterOS 上的原子化操作脚本,负责执行“添加IP到列表”、“更新服务访问策略”等具体任务。
SSH 服务: 作为 Python 应用与 RouterOS 主机之间安全通信的桥梁。
Python Flask 应用 (Webhook Listener):
Web 前端: 提供一个简单的 HTML 界面,供用户输入凭据(安全码或客户端ID)和授权时长。
后端逻辑: 验证用户身份,获取用户的公网 IP 地址。
SSH 客户端 (Paramiko): 在后端验证成功后,通过 SSH 登录到 RouterOS 主机,并调用预设的系统脚本,传递用户的IP和授权时长作为参数。
自愈与健壮性: 启动时自动检测并清理因异常关闭而残留的旧进程,确保端口可用性。

2.2. 核心工作流 (Workflow)
初始状态:RouterOS 的 dst-nat 规则被禁用,或者其 src-address-list 指向一个仅包含内网IP的地址列表。WinBox/Web 等管理服务的 allowed-address 被限制为内网IP。
用户请求:用户从外网IP A.B.C.D 访问部署在容器内的 Flask 应用。
身份验证:用户在网页上提交安全码或被识别为预授权的客户端ID。
Webhook 触发:Flask 后端验证凭据成功,获取到用户IP A.B.C.D 和期望的授权时长 T。

SSH 命令执行:
Python 应用通过 paramiko 库 SSH 登录到 RouterOS。
执行命令 :global paramWAIP A.B.C.D 和 :global paramWATO Th,将参数传递给 RouterOS。
执行 /system script run <script_name> 来调用预设脚本。
RouterOS 策略更新:
IP->Service->Dynamic_Admin_IPs_Add 脚本被触发,执行 /ip firewall address-list add list=IP-CIDR_ADMIN_IPs address=A.B.C.D timeout=Th,将用户IP加入白名单,并设置自动过期时间。
IP->Service->Dynamic_Admin_IPs_Set 脚本被触发,动态地将 IP-CIDR_ADMIN_IPs 列表中的所有IP更新到 WinBox/Web 服务的 allowed-address 字段。
Python 应用继续执行 ip firewall nat enable 命令,启用之前被禁用的、且源地址受 IP-CIDR_ADMIN_IPs 限制的NAT规则。
访问建立:用户现在可以从IP A.B.C.D 成功访问之前被阻止的RDP等服务。
自动撤销:当 timeout 到期后,RouterOS 会自动从 IP-CIDR_ADMIN_IPs 中移除该IP。下一次 IP->Service->Dynamic_Admin_IPs_Set 脚本运行时(可以由调度器定期触发),WinBox/Web的权限也会被收回,NAT规则虽然仍启用,但由于源地址不再匹配,访问将自动失效,从而实现安全闭环。

3. 注意事项与安全考量
容器镜像选择: 推荐使用官方的 python:alpine 等精简镜像,以减少资源占用和潜在的安全漏洞。提醒:此类镜像可能缺少 lsof, net-tools 等常用工具,脚本编写时应避免依赖。
SSH 安全: 用于自动化控制的 RouterOS 用户应遵循最小权限原则。同时,Python 容器通过 veth 接口与主机通信,网络路径是隔离的,相对安全。
Web 应用安全:
速率限制: 必须对验证接口进行速率限制,以抵御暴力破解攻击。
Admin 接口: 所有配置、日志查看等管理功能页面,必须严格限制为仅内网IP访问。
日志与审计: Web应用应记录所有成功的授权事件,包括时间、客户端ID、IP地址及其地理位置,以便追踪。

4. 结论
本方案通过将 Web 技术、容器化和网络设备的可编程性相结合,提供了一个高度安全、灵活且自动化的远程访问解决方案。它将传统的“常开门”模型转变为“按需响应”的“智能门禁”模型,在不牺牲便利性的前提下,极大地提升了家庭及小型网络的整体安全水位。

整体思路的示意图如下:
Knock.png
 楼主| 发表于 2025-10-7 03:22 | 显示全部楼层
其实我不确定大家是否对这种访问控制还感兴趣,纯粹是一种思路的分享,大家觉得没有必要(譬如说已经通过L2TP,Wireguard等方式实现了和家里网络的**连接)直接忽略即可,我这个方案其实更多是给自己手机在某些场合无法打开电脑,但是又需要链接到家里的网络进行一些处理的时候的一个相对安全的方案,毕竟绝大部分时间,家里的网络对外都是关闭的状态,只按需开门一小会儿
发表于 2025-10-7 05:13 | 显示全部楼层
太复杂了,直接用敲门策略,且定期更新敲门即可。

比如,客户端随机发送目标端口1000,2000,3000,三个包,tcp协议,轮询3次,服务器检测到特定的轮询包(敲门包策略),则根据开源ip自动开放特定端口24或者12小时,然后关闭端口通信,超过使用时间后,客户端需要重新敲门。

发表于 2025-10-7 09:59 | 显示全部楼层
很多那种网页**就是干这件事的。
发表于 2025-10-7 10:40 | 显示全部楼层
太复杂了,我已经在ROS7上实现了l2tp over ipsec with 2FA,密码密钥拿给你都无法连接,因为需要动态密码验证
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-10-10 05:25 , Processed in 0.170168 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表