V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jimmy2010
V2EX  ›  宽带症候群

家庭路由器防火墙设置讨论

  •  
  •   jimmy2010 · 73 天前 · 1950 次点击
    这是一个创建于 73 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么要设置防火墙

    我用的是家庭宽带,pppoe 拨号,有公网 IP ,映射了群晖等一些服务出去,之前在路由器上设置了访问日志观察了一段时间,基本上每时每刻都会有全世界各地的 IP 做端口扫描探测。 下面是国外国内两个著名的 IP 资产测绘平台上搜索 synology 关键词的情况: shodan 20W 结果: 1.png

    fofa 100W+ 结果: 2.png

    这其中可能就有你我的 nas ,虽说一般也没那么容易就被攻击,但做些防护措施总没错的,万一哪天群晖曝出漏洞,也没那么快就被利用到。

    我的防火墙设置

    我用的是 routeros ,目前 filter 表主要做了这么些规则: 3.png

    1 、fasttrack forward ,没有指定接口,用于快速转发已经建立起连接的流量( establised 和 related ),也就是不需要经过下面的规则了,设置了硬件 offload ,可以减轻路由器计算压力

    2 、fasttrack input ,同上,主要区别是一个是转发,一个是路由器本身的服务,比如 VPN 的流量,已经建立连接的 VPN 就不需要继续走下面的防火墙规则了

    3 、白名单,在白名单里的 IP 直接放行,通常可以设置一些比较固定的远端管理 IP

    4 、丢弃非法流量和黑名单流量,非法流量有可能是一些特殊机制的扫描造成的,直接丢弃;黑名单来自于下面规则中的扫描行为检测

    5 、拒绝指定时间段内(例如凌晨 1 点到早上 7 点)对游戏服务器的访问,就几个小伙伴一起玩的 mc 之类的,因为之前发现有小伙伴玩到凌晨 4 点,这很危险,影像身体健康,所以设置了这个手动防沉迷机制。

    突然想起这里可能有点问题,因为前面提到已经建立的连接直接就会转发,所以这条规则可能要放到更前面去才能产生效果。

    6 、监测端口扫描行为并添加到黑名单,这是 routeros 自带的功能,可以自行调整参数,例如 3 秒中内访问了 5 个以上不同的端口试图新建连接。

    7 、允许访问路由器自身开放的服务,例如 VPN 、SSH 等

    8 、拒绝其它所有进入流量,这个主要是避免访问到路由器上开放的其它一些不必要的端口。如果有需要开放的话,应该手动添加到第 7 条中去。

    接下来的计划:

    预计还可以研究一下根据地域来阻止访问,例如禁止所有国外 IP 访问,甚至只允许省内访问,群晖上已经设置了禁止国外 IP 访问,这也能阻挡掉很多扫描和攻击行为,注意前面还要放通内网 IP ,不然局域网都访问不到了。 4.png

    NAT 表主要是一些内部服务的端口映射,其中有一条值得一提,用于在局域网通过公网 IP 访问内部服务器的,又叫做 IP 回流、发夹效应( Hairpinning )、“NAT 环回” ( NAT loopback ) 等等: image.png 当局域网通过网关访问局域网地址时,对源地址进行转换,这样就能在内网通过域名或者公网 IP 来访问到内部的群晖系统了。

    所以大家还有什么其它的防火墙设置策略吗?

    第 1 条附言  ·  72 天前

    总结一下跟帖v友的常见防火墙设置:

    • 不要使用常见端口,22、3389、5001之类的,大家都知道是啥,自动化工具也是优先扫描这些端口并暴力破解
    • 拒绝所有外部访问,采用自动化加白名单方式,比如 API 加白、端口敲门等
    • 所有外部对内部的访问都走 VPN,这种方式只需要开放一个 VPN 端口(我除了主贴设置的防火墙策略,也基本上是这么做的,ROS 自带 wireguard,非常好用)
    • fail2ban,拉黑扫描 IP
    • frp 这类隧道访问,甚至都不需要开端口
    • IPv6

    今天遇到一个问题,我的群晖设置防火墙拒绝国外IP后,遇到 let's encrypt 更新 SSL 证书失败,记录一下解决方案,我是通过 docker certbot/dns-cloudflare 这个容器定期更新的,报错内容是:

    HTTPSConnectionPool(host='acme-v02.api.letsencrypt.org', port=443): Max retries exceeded with url: /directory (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -3] Try again'))
    

    一开始我觉得不应该啊,防火墙的拒绝不都是拒绝的进入流量吗,我这个是出的流量怎么也不行呢,于是我在群晖终端shell里面 curl -v https://acme-v02.api.letsencrypt.org/directory 发现请求和返回都是正常的,然后又仔细看了看,发现容器默认网络是 bridge,那么它的流量相对于群晖来说就是 forward 流量,看来群晖的防火墙对返回来的 foward 流量进行了拦截,解决方法很简单,容器用 host 网络就可以了:

    docker run -t --rm --network host --name certbot -v "/letsencrypt:/etc/letsencrypt" -v "/cloudflare.ini:/cloudflare.ini" certbot/dns-cloudflare renew --force-renew --dns-cloudflare --dns-cloudflare-credentials /cloudflare.ini
    
    17 条回复    2024-09-22 21:23:53 +08:00
    hermanarturo
        1
    hermanarturo  
       73 天前
    666
    hermanarturo
        2
    hermanarturo  
       73 天前
    设置了如果从外网访问 router 的 22 3389 之类的端口,直接添加 ip 到黑名单里面
    ZeroClover
        3
    ZeroClover  
       73 天前
    访问特定 API w/ OIDC credentials 自动对访问 IP 全服务同步加白 15 分钟

    懒得弄的就端口敲门

    其实大部分内网服务都直接 Cloudflare Tunnel ,不需要暴露对外端口
    totoro625
        4
    totoro625  
       73 天前   ❤️ 1
    一个固定的白名单 + 访问特定 api 自动加白名单比较好
    简单易维护

    如访问一个 api 链接,加白名单,直到当天 24 点进行删除
    tool2dx
        5
    tool2dx  
       73 天前
    公网 IP4 没办法的,你可以把服务改成公网 IP6 ,就没人扫你了。

    我自己写了一个 fail2ban ,专门搜集屡教不改的 IP 黑名单,自动化拉到 iptables -j DROP 里关禁闭。
    vcn8yjOogEL
        6
    vcn8yjOogEL  
       73 天前
    VPN
    dodakt
        7
    dodakt  
       73 天前
    我是特殊端口 +单位 ip 和运营商基站 ip 白名单 然后连接其他肺白名单网络就上 vpn 感觉够用了 毕竟大多数时候需求都是单位网络和流量访问
    Jinnrry
        8
    Jinnrry  
       73 天前 via iPhone
    我是只开一个端口做 vpn ,任何访问都通过 vpn 。自己搞防火墙太维护成本太高了,而且非常容易出错,而且很可能是把自己拦住但是拦不住攻击
    Jhma
        9
    Jhma  
       73 天前
    不要把非公共服务端口暴露给外网,各类 VPN 是最优解,网上很多把群晖的端口暴露出来的教程真是害人不浅
    iamwin
        10
    iamwin  
       73 天前 via Android
    我用 opnsense 默认策略,只开放外网 vpn 端口回家,没了
    povsister
        11
    povsister  
       73 天前
    无论什么防火墙
    default deny + 按需 ACL
    绝不多配就行了。
    glouhao
        12
    glouhao  
       73 天前 via Android
    @Jhma 我的群晖用的非标端口+屏蔽国外。
    rulagiti
        13
    rulagiti  
       73 天前
    用 vpn 连,甚至更严格用楼上的端口敲门及 api 添加源 ip 白名单。
    piero66
        14
    piero66  
       73 天前 via Android
    我都是用 ipv6 或者 zerotier ,公网 v4 只有 pt 在用,映射全关了
    jimmy2010
        15
    jimmy2010  
    OP
       72 天前
    @Jhma 是的,尤其很多还是默认端口
    LnTrx
        16
    LnTrx  
       70 天前
    顺便提醒一下,群晖的 docker 可能会绕过群晖的防火墙 /t/915279
    Autonomous
        17
    Autonomous  
       69 天前
    群晖防火墙规则→所有规则,最后一条“拒绝所有”的规则其实不需要,因为默认就是拒绝兜底,楼主你可以试着删掉,测试一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2602 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 03:31 · PVG 11:31 · LAX 19:31 · JFK 22:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.