recent这个模块很有趣,善加利用可充分保证您服务器安全。
www.moonsec.com/
设定常用参数:
–name #设定列表名称,默认DEFAULT。
–rsource #源地址,此为默认。
–rdest #目的地址
–seconds #指定时间内
–hitcount #命中次数
–set #将地址添加进列表,并更新信息,包含地址加入的时间戳。
–rcheck #检查地址是否在列表,以第一个匹配开始计算时间。
–update #和rcheck类似,以最后一个匹配计算时间。
–remove #在列表里删除相应地址,后跟列表名称及地址。
示例:
1.限制80端口60秒内每个IP只能发起10个新连接,超过记录日记及丢失数据包,可防CC及非伪造IP的syn flood。
iptables -A INPUT -p tcp –dport 80 –syn -m recent –name webpool –rcheck –seconds 60 –hitcount 10 -j LOG –log-prefix ‘DDOS:’ –log-ip-
options
iptables -A INPUT -p tcp –dport 80 –syn -m recent –name webpool –rcheck –seconds 60 –hitcount 10 -j DROP
iptables -A INPUT -p tcp –dport 80 –syn -m recent –name webpool –set -j ACCEPT
备忘:每个IP目标端口为80的新连接会记录在案,可在/proc/net/xt_recent/目录内查看,rcheck检查此IP是否在案及请求次数,如果超过规则就丢弃数据包,
否则进入下条规则并更新列表信息。
2.发送特定指定执行相应操作,按上例如果自己IP被阻止了,可设置解锁哦。
iptables -A INPUT -p tcp –dport 5000 –syn -j LOG –log-prefix “WEBOPEN: “
记录日志,前缀WEBOPEN:
iptables -A INPUT -p tcp –dport 5000 –syn -m recent –remove –name webpool –rsource -j REJECT –reject-with tcp-reset
符合规则即删除webpool列表内的本IP记录
3.芝麻开门,默认封闭SSH端口,为您的SSH服务器设置开门暗语。
iptables -A INPUT -p tcp –dport 50001 –syn -j LOG –log-prefix “SSHOPEN: “
记录日志,前缀SSHOPEN:
iptables -A INPUT -p tcp –dport 50001 –syn -m recent –set –name sshopen –rsource -j REJECT –reject-with tcp-reset
目标端口tcp50001的新数据设定列表为sshopen返回TCP重置,并记录源地址。
iptables -A INPUT -p tcp –dport 22 –syn -m recent –rcheck –seconds 15 –name sshopen –rsource -j ACCEPT
开启SSH端口,15秒内允许记录的源地址登录SSH。
nc host 50001 #开门钥匙
telnet host 50001
nmap -sS host 50001
指定端口容易被破解密钥,可以使用ping指定数据包大小为开门钥匙。
iptables -A INPUT -p icmp –icmp-type 8 -m length –length 78 -j LOG –log-prefix “SSHOPEN: “
记录日志,前缀SSHOPEN:
iptables -A INPUT -p icmp –icmp-type 8 -m length –length 78 -m recent –set –name sshopen –rsource -j ACCEPT
指定数据包78字节,包含IP头部20字节,ICMP头部8字节。
iptables -A INPUT -p tcp –dport 22 –syn -m recent –rcheck –seconds 15 –name sshopen –rsource -j ACCEPT
ping -s 50 host #Linux下解锁
ping -l 50 host #Windows下解锁
用knockd远程管理iptables防火墙SSH端口
之前有介绍Iptables模块recent通过暗语来开启SSH端口,knockd也可实现此功能。
knockd监听3个自定义端口,如果收到客户端请求符合要求即执行设置的指令,让iptables开启SSH端口允许客户IP连接。
安装所需组件,不然编译会提示错误。
yum install libpcap-devel
knockd源码编译安装:
wget http://www.zeroflux.org/proj/knock/files/knock-0.5.tar.gz
tar zxvf knock-0.5.tar.gz
cd knock-0.5
./configure
make
make install
或下载knock rpm包安装:
wget http://pkgs.repoforge.org/knock/knock-0.5-1.el5.rf.i386.rpm
rpm -ivh knock-0.5-1.el5.rf.i386.rpm
knockd配置:
cat /etc/knockd.conf
[options]
logfile = /var/log/knockd.log #日志记录目录
interface = eth0 #监听网卡
[opencloseSSH]
sequence = 6000:udp,5000:tcp,4000:udp #knock侦听端口协议
seq_timeout = 15 #单位时间内连续触发上面的端口规则
tcpflags = syn #封包标志,syn/ack/fin
start_command = iptables -I INPUT -s %IP% -p tcp –syn –dport 22 -j ACCEPT
#如果触发规则执行的iptables操作
cmd_timeout = 10 #规则触发后未连接超时时间
stop_command = iptables -D INPUT -s %IP% -p tcp –syn –dport 22 -j ACCEPT
#如超时未连接或断开连接执行iptalbes操作
knock init启动管理脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#!/bin/sh # chkconfig: - 99 00 # description: Start and stop knockd # Check that config file exist [ -f /etc/knockd.conf ] || exit 0 # Source function library . /etc/rc.d/init.d/functions # Source networking configuration . /etc/sysconfig/network # Check that networking is up [ "$NETWORKING" = "no" ] && exit 0 start() { echo "Starting knockd ..." /usr/local/sbin/knockd -d } stop() { echo "Shutting down knockd ..." pkill knockd } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: $0 {start|stop|restart}" ;; esac exit 0 |
客户端连接SSH需先使用telnet依次连接knock设定端口,或使用knock客户端连接。
knock -v www.haiyun.me 6000:udp 5000:tcp 4000:udp
查看knock日志:
cat /var/log/knockd.log
[2012-08-31 10:41] 192.168.1.16: opencloseSSH: Stage 1
[2012-08-31 10:41] 192.168.1.16: opencloseSSH: Stage 2
[2012-08-31 10:41] 192.168.1.16: opencloseSSH: Stage 3
[2012-08-31 10:41] 192.168.1.16: opencloseSSH: OPEN SESAME
[2012-08-31 10:41] opencloseSSH: running command: iptables -I INPUT -s 192.168.1.16 -p tcp –syn –dport 22 -j ACCEPT
[2012-08-31 10:41] 192.168.1.16: opencloseSSH: command timeout
[2012-08-31 10:41] opencloseSSH: running command: iptables -D INPUT -s 192.168.1.16 -p tcp –syn –dport 22 -j ACCEPT
备注:如果网络较差,且同时使用tcp和udp进行验证可能会导致数据包到达顺序不一致或某个包丢失导致验证失败。