全部博文(34)
分类: LINUX
2009-10-12 00:36:27
家里的Linux主机平时都开着下载资料。
当然有时候需要远程管理下,所以对internet开着ssh。 所以经常有人尝试来暴力破解,曾改过ssh的port,好多了,不过这只是模糊安全。也装了fail2ban来限制破解的速度。攻击者频繁换IP的话fail2ban也没辙。 这次找到了新的方式:Port Knocking,原理很简单,不过挺有创意的。 一般我们会让iptables开SSH,不过其实我们只需要为要登录的IP开iptable就可以了,平时封锁SSH端口。不过这种动态的开端口如何来实现呢,下面就介绍Port knocking(敲端口): 鸟哥解释的很好 http://linux.vbird.org/linux_security/knockd.php 1.SSHD开22端口,但是被防火墙屏蔽。 2.Port knocking服务端初始化接头暗号(一些端口序列,包含协议和TCP状态) 3.客户端对服务器不同端口进行knock,发送SYN连接或其他。 4.如果这些端口的连接和某些暗号对上了服务器端就会做些预定义操作。ex:为此IP开SSH端口。 Port knocking类似于一次秘密握手协议,比如一种最基本的方式:发送一定序列的UDP、TCP数据包。当运行在主机上的daemon程序捕捉到数据包以后,如果这个序列正确,则开启相应的端口,或者防火墙允许客户端通过。 上面的接头暗号可以是TCP,UDP甚至是ICMP。 的图示比较生动: 默认情况下客户端对服务器的应用不能访问 客户端敲正确的端口序列 服务器端Port Knocking程序打开防火墙 客户端可以访问了 优点: Port knocking 没监听端口,而且也不需要防火墙先开放这些端口,当有人尝试暴力这些序列时比较容易由IDS软件来检测到。 信息是由一定的端口访问来传输的,而不是网络报文内容,所以不容易被报文嗅探工具截获。 缺点: 不是很方便,需要先knock下,客户端要对这个端口序列的保密工作, Port Knocking不能用于Web,Mail。 好,现在是实践下的时候了,search了下yum,发现有个叫knockd软件包(port knocking的实现其实很多的)。 根据鸟哥的文章要了下面的配置: 主要思想: 敲对了开端口,敲开门后cmd_timeout超时后再关闭。因为SSH只要在这个时间连接后防火墙关闭SSH端口对已有连接不会有影响。 /etc/knockd.conf [options] UseSyslog [opencloseSSH] sequence = 44440:udp,44442:udp,44441:udp seq_timeout = 30 tcpflags = syn,ack start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport ssh -j ACCEPT cmd_timeout = 300 stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport ssh -j ACCEPT iptable未开放SSH [root@CentOS1 ~]# iptables -nL INPUT Chain INPUT (policy ACCEPT) target prot opt source destination RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0 启动port knocking daemon [root@CentOS1 ~]# knockd -D -v config: new section: 'options' config: usesyslog config: new section: 'opencloseSSH' config: opencloseSSH: sequence: 44440:udp,44442:udp,44441:udp config: opencloseSSH: seq_timeout: 30 config: tcp flag: SYN config: tcp flag: ACK config: opencloseSSH: start_command: /sbin/iptables -I INPUT -s %IP% -p tcp --dport ssh -j ACCEPT config: opencloseSSH: cmd_timeout: 300 config: opencloseSSH: stop_command: /sbin/iptables -D INPUT -s %IP% -p tcp --dport ssh -j ACCEPT ethernet interface detected Local IP: 192.168.1.111 listening on eth0... 客户端来敲下,使用了windows下的程序: C:\>knock.exe 192.168.1.111 44440:udp 44442:udp 44441:udp 服务器端监视到了正确的端口序列,触发动作,开放了SSH端口。 2009-09-12 00:27:25: udp: 192.168.1.110:54204 -> 192.168.1.111:44440 60 bytes 192.168.1.110: opencloseSSH: Stage 1 2009-09-12 00:27:25: udp: 192.168.1.110:54205 -> 192.168.1.111:44442 60 bytes 192.168.1.110: opencloseSSH: Stage 2 2009-09-12 00:27:25: udp: 192.168.1.110:54206 -> 192.168.1.111:44441 60 bytes 192.168.1.110: opencloseSSH: Stage 3 192.168.1.110: opencloseSSH: OPEN SESAME opencloseSSH: running command: /sbin/iptables -I INPUT -s 192.168.1.110 -p tcp --dport ssh -j ACCEPT iptables中已经加了允许条目。 [root@CentOS1 ~]# iptables -nL INPUT Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 192.168.1.110 0.0.0.0/0 tcp dpt:22 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0 这个时候我的客户端就可以登录了。 超过门敲开后的时间自动关闭。很安全的自动门吧。 192.168.1.110: opencloseSSH: command timeout opencloseSSH: running command: /sbin/iptables -D INPUT -s 192.168.1.110 -p tcp --dport ssh -j ACCEPT 最后附上看到的一篇小诗【】: QUOTE: 《敲门》 第一次敲门 是敲不开的 除非是大贤大德 乘愿重来的菩萨 第一次进不了门 倒有可能被怪物 跟踪恐吓 甚至抓起来 第二次再来敲门 说明已经通过考验 我会大开柴门 迎你进来 2009-1-5 参考资料: 鸟哥图文并茂的介绍: http://linux.vbird.org/linux_security/knockd.php [ 本帖最后由 可可火山 于 2009-10-12 00:48 编辑 ] |