找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 4576|回复: 4

Openwrt 用 iptables xt_recent 保护 ssh 及其他端口

[复制链接]
发表于 2017-8-13 23:57 | 显示全部楼层 |阅读模式
本帖最后由 hkal 于 2017-8-14 00:12 编辑

路由器要远程管理,最简单方法是对外打开 ssh 端口。为防止暴力破解,ssh 可以改用五位数的端口,并只容许用 key 登录。有些其他的服务,例如 frp 服务器,不支持 key,只能用密码。虽然暴力破解并不是这么容易,但是端口老是被骚扰总是不爽。而且这肯定会加大路由器的负担。

fail2ban 功能上是非常好,但对于 cpu 和 内存都非常寒碜的路由器来说,fail2ban 是太沉重了。对于路由来说,iptables 的 xt_recent 是更好的选择(tomato 已经自带 xt_recent)。fail2ban 和 xt_recent 不同的地方是:fail2ban 会封锁一段时间(自定义)内登录错误几次(自定义)的 ip 地址;而 xt_recent 不会分辨登录是否成功,它会以一段时间内连接次数超过多少次来封锁 ip。


假设 ssh 已经可以远程登录,现在只是要添加 xt_recent 规则保护端口:
使用 iptables 的 xt_recent,需要安装 iptables-mod-conntrack-extra。另外脚本我喜欢用 bash,顺手也装上:
  1. okpg update
  2. opkg install iptables-mod-conntrack-extra bash
复制代码


如果容许 ssh 从 WAN 口进来的规则是在 luci 界面设定的话,应该就会有一条类似这样的规则(假设 ssh 外网端口是 12345):
  1. -A zone_wan_input -p tcp -m tcp --dport 12345 -m comment --comment "Allow Dropbear" -j ACCEPT
复制代码
我们要添加的 xt_recent 规则必须要在这条规则的前面。我们在命令界面输入:iptables -S,往下看,会看到:

红框的地方: openwrt 已经设定了一条 CHAIN 叫 input_rule,并且已经 Jump 进去执行了(目前是空白的,所以没东西执行)。我们可以把 xt_recent 的规则添加到这条 CHAIN 里面。

脚本 add-recent-rules :
  1. #!/bin/bash

  2. IPT=/usr/sbin/iptables
  3. EXTIF="eth0.2"

  4. # Allow max [3] connections to port [12345] in [120] seconds, store banned ip in [BFATTACK]
  5. $IPT -A input_rule -i $EXTIF -p tcp --dport 12345 -m state --state NEW -m recent --set --name BFATTACK --rsource        
  6. $IPT -A input_rule -i $EXTIF -p tcp --dport 12345 -m state --state NEW -m recent --update --seconds 120 --hitcount 4 --name BFATTACK --rsource -j DROP
复制代码

上面容许120秒内,最多 3次连接到 端口 12345,被封锁的 ip 储存在 BFATTACK 表内。


设定每次开机自动执行,在 /etc/rc.local 里面, exit 前面加上:
  1. /path/to/add-recent-rules &
复制代码


如果要保护其他端口,两个办法:
  • 重复脚本里面的最后两句,[ ] 按实际需要修改。
  • 规则改为 multiport :
  1. $IPT -A input_rule -i $EXTIF -p tcp --match multiport --dports 12345,12321,23454 -m state --state NEW -m recent --set --name BFATTACK --rsource
  2. $IPT -A input_rule -i $EXTIF -p tcp --match multiport --dports 12345,12321,23454 -m state --state NEW -m recent --update --seconds 120 --hitcount 4 --name BFATTACK --rsource -j DROP
复制代码



其他:
1. 查看  BFATTACK 表里面的 ip:
  1. cat /proc/net/xt_recent/BFATTACK
复制代码

2. 手动解除封锁某 ip (例如 ip 是 123.123.123.123):

  1. echo -123.123.123.123 >/proc/net/xt_recent/BFATTACK
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2017-8-13 23:58 | 显示全部楼层
预留给将来添加(如有)。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-8-18 09:02 | 显示全部楼层
保护ssh我用这个
https://github.com/robzr/bearDropper
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-2 17:16 | 显示全部楼层
本帖最后由 Vincent-Emiya 于 2018-10-2 17:18 编辑

新版本要用
  1. -m conntrack --ctstate
复制代码

代替
  1. -m state --state
复制代码

完整版本是

  1. #!/bin/sh

  2. IPT=/usr/sbin/iptables
  3. EXTIF="pppoe-wan"

  4. # Allow max [3] connections to port [12345] in [120] seconds, store banned ip in [BFATTACK]
  5. $IPT -A input_rule -i $EXTIF -p tcp --dport 12345 -m conntrack --ctstate NEW -m recent --set --name BFATTACK --rsource        
  6. $IPT -A input_rule -i $EXTIF -p tcp --dport 12345 -m conntrack --ctstate NEW -m recent --update --seconds 120 --hitcount 4 --name BFATTACK --rsource -j DROP
复制代码


另外实在看不出这脚本哪里需要用到 bash 的特性,感觉默认带的 ash 就已经够用了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-2 17:54 来自手机 | 显示全部楼层
禁止密码登录,要公私密钥不是更省心,高端口根本就是骗骗心里安慰
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-3-29 22:15

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

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