『为自己开一个后门』是很多系统管理员常常需要思考的问题,因为我们常常需要在不同的环境里面连接到主机去!
为了自己管理的方便,总希望可以这么做。但是如此一来又担心系统的网络安全问题。
所以,一般来说,为自己开一个后门最好是允许可信任的固定 IP 连接,这样最简单与单纯,
而且,当然不要针对整个 Internet 开放具有较高危险的服务,举例来说 ssh 就是其中一个啊!
不过,如果用户端是非固定的 IP 时,这个时候难道要将服务器的服务针对 Internet 进行开放吗?
当然不行啦~如此一来,防火墙怎么设计啊?真是很困扰!好在,这个 knockd 可以帮我们处理这个问题呢!
防火墙基础
一部服务器的维护与管理当中,最重要的是
更新所提供的服务之软件程序,
以避免可能会遭人入侵的漏洞问题。举例来说,如果开放 WWW 就得要随时更新 Apache 这支程序才好。
再来则是订定一系列的灾难复原标准操作行为,接下来才是防火墙的设置。所以说,防火墙的重要性还比不上软件更新喔!
但是防火墙还是有他存在的必要啦,底下来简单的说一说原因吧。
一般来说,在 Linux 服务器上头的封包过滤式防火墙主要有两种,(1)是 Linux 内核支持的 iptables ,
(2)则是利用 TCP Wrappers (或 xinetd 这个 super daemon) ,亦即是利用 /etc/hosts.allow, /etc/hosts.deny
这两个文件来管理的方式。利用 iptables 可以即时更新防火墙机制,而且性能也是很不错的。
至于使用 TCP Wrappers 的话,那就得要针对 /etc/hosts.{allow,deny} 修修改改的啰。
基本上,只要妳想要架设防火墙的话,就得要针对特定或不特定的 IP 来源进行开放或拒绝的动作。
所谓的『特定』指的是例如 192.168.0.0/24 或者是某个特定的 IP 或主机名称,或者是某个特定的协定 (如 port 80) 等。
而不特定在这里的意思表示针对整个 Internet 开放的意思。如果妳对于防火墙还有其他的问题,
可以先参考一下鸟哥之前写的一篇
简易防火墙 再说。
在这一章当中,鸟哥假设您已经学会 iptables 的相关语法与观察的指令了。
虽然很多人都觉得防火墙是一部主机管理上最重要的地方,但其实鸟哥之前就曾谈过,
防火墙基本上是没有什么用途的! ^_^!因为无论如何,妳都得要开放某些服务给用户端登录对吧!
如此一来,防火墙当然无法抵挡对你所开放的服务之连接啦!
但防火墙也不是一无用处,至少他可以将服务器所提供的网络服务『局限』在某些特定的范围内。
怎么说呢?底下我们来举个例子好了。
鸟哥有些 Linux 主机放置到
昆山科大信息传播系内,
而且鸟哥常常需要在没有固定 IP 的地方连接到这部主机上面进行操作,以秀给大家看一下主机的设置或者是一些 Linux 相关议题。
因为鸟哥所在的用户端没有固定 IP ,所以是否就得要针对整个 Internet 来开放那个可怕的 sshd 的服务吗?
要注意, sshd 可是个很危险的服务喔,因为只要用户登录主机,那么他能够作的事情实在太多了!
所以不要将 sshd 对整个 Internet 开放才好。您说是吧?
既然 sshd 不对整个 Internet 开放,然而鸟哥所在的位置又是非固定 IP 的来源,那我这部 Linux server 的防火墙要如何针对 sshd
进行设置啊?难道无解吗?呵呵!没问题,我们可以利用 knockd 这个 daemon 来负责的啦!
底下我们就来谈一谈 knockd 这个咚咚吧!
knockd 的使用
为了解决非固定 IP 来源用户端的连接问题,我们可能得要手动的加入用户端的防火墙设置于防火墙规则当中。
这很麻烦啦!那有没有自动的方式可以让防火墙规则自动的修改的?是有的~那就是利用 knockd 这个服务。
底下让我们来谈谈这个玩意儿的特色与使用方式吧!
knockd 的功能与特色
knockd 主要的目的是希望可以动态的修改防火墙规则,他的运作流程是这样的:
- 服务器端的防火墙规则中先开放三个左右的端口口,这些端口口没有被其他程序激活,且可由 knockd 所侦测;
- 用户端若依照设置的顺序依序的连接到这三个端口口时, knockd 将进行动态防火墙规则的设置
- 防火墙规则被修改,且 knockd 持续进行侦测;
- 当用户端让 knockd 等候逾时,或者是用户端脱机后,刚刚步骤三的防火墙规则将会被移除。
如此一来,当我在非固定 IP 的网段想要连接到服务器时,就可以通过这个机制来处理啦!
整个流程有点像底下的图标:

图一-a、用户端必须要『依序』对某些端口口进行连接的动作

图一-b、若通过 knockd 对端口口的设置,则 knockd 会动态的增加防火墙规则,且用户端可以连接了

图一-c、若用户端脱机,或者是 knockd 等待逾时,则 knockd 可主动的删除刚刚创建的规则
您可以看到,防火墙的规则本来是关闭的,然后在用户端依序碰触某些端口口后, knockd
就能够『仅针对此一 IP』启动某些特定的端口口,此时用户端就能够通过这个特殊的端口口进行主机的连接。
并且可以在用户端断线后,将该防火墙规则拿掉!呵呵!如此一来,我们不论是在何处,
就可以使用这个功能来打开某些比较危险的服务啦,例如 sshd 这个 port 22 啰!
knockd 的安装
knockd 的安装非常简单,因为他除了提供 Tarball 之外,还提供 SRPM 哩!所以安装方面非常容易!
鸟哥是将 knockd 安装在 CentOS 5.x 上面的,所以使用 RPM 来测试给大家看看。
如果妳想要安装 Tarball 的话,可以参考这一篇的说明:
Tarball 与原代码 。至于 knockd 的下载可以参考:
让我们开始安装吧!
1. 先下载这个软件吧!
[root@linux ~]# wget \
> http://www.invoca.ch/pub/packages/knock/knock-0.5-4.src.rpm
2. 开始编译成为 RPM 文件!
[root@linux ~]# rpmbuild --rebuild knock-0.5-4.src.rpm
Installing knock-0.5-4.src.rpm
error: Failed build dependencies:
libpcap-devel is needed by knock-0.5-4.i386
# 如果出现类似上述的消息,表示妳还有某些关键套件未安装,请自行使用 yum 安装
# 此外,请确认你已经安装了发展工具组,包括 gcc, glibc-devel 等等,
# 当然,若有需要时,可以安装整个发展工具套件:
# yum groupinstall "Development Tools"
[root@linux ~]# rpmbuild --rebuild knock-0.5-4.src.rpm
Installing knock-0.5-4.src.rpm
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.42725
+ umask 022
+ cd /usr/src/redhat/BUILD
.....(中间省略).....
Wrote: /usr/src/redhat/RPMS/i386/knock-0.5-4.i386.rpm
Wrote: /usr/src/redhat/RPMS/i386/knock-server-0.5-4.i386.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.26785
.....(底下省略).....
# 至少要出现如上的粗体字,才是正确的编译成功喔!接下来准备安装!
[root@linux ~]# rpm -ivh /usr/src/redhat/RPMS/i386/knock-*
Preparing... ################################# [100%]
1:knock-server ################################# [ 50%]
2:knock ################################# [100%]
# 那个 knock 是 client 端的指令, knock-server 才是服务器端的软件!
|
有够简单吧!这样就安装妥当了~妳可以使用 rpm -ql knockd 及 rpm -ql knockd-server 去看看有啥数据在这个套件中,
然后可以使用 man knock 及 man knockd 分别察看 client/server 端的设置方法!
底下我们就开始来设置 knockd 吧!
knockd 的设置与启动--以 SSH 为例
在开始玩 knockd 之前,请务必使用 man knockd 去查阅一下详细的设置方法,
这很重要啊!不然妳不会知道底下设置档的意义喔!好了,我们知道 knockd 是借由侦测 port 来动态进行防火墙规则的修改,
所以我们当然就得要有设置档啦。使用 RPM 安装时,缺省的设置档在 /etc/knockd.conf ,
这个文件的原始内容是这样的:
[root@linux ~]# vi /etc/knockd.conf
[options]
UseSyslog
[opencloseSSH]
sequence = 2222:udp,3333:tcp,4444:udp
seq_timeout = 15
tcpflags = syn,ack
start_command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport ssh -j ACCEPT
cmd_timeout = 10
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport ssh -j ACCEPT
# 各参数的意义可由 man knockd 查到,简单的说,各设置项目为:
# [options]: 与 knockd 环境有关的设置数据;
# UseSyslog: 与 knockd 有关的登录数据使用 syslogd 放置到 /var/log/messages
# [opencloseSSH] 打开与关闭 SSH 防火墙的设置项目;
# sequence: knockd 侦测的端口口与封包协定 (tcp/udp)
# seq_timeout: 需要在几『秒钟』内,连续上面的端口口接触 (sequence 之设置);
# tcpflags: 来源封包所需带有的封包标志,一般来说, UDP 封包不会有 ack ,
# 所以上述的缺省标签与封包,其实是无法吻合的,所以需要修改。
# start_command: 若连续接触所有的端口口,则 knockd 开始后续的指令;
# stop_command: 若用户端断线了,那么就运行后续的指令
# cmd_timeout: 若设置 stop_command 则需此设置,订定开始与结束防火墙的时间。
|
如上所述,其实缺省的设置档有点小问题的,所以此时我们需要修改一下设置档才好。
鸟哥的设置档长的有点像这样:
[root@linux ~]# vi /etc/knockd.conf
[options]
LogFile = /var/log/knockd.log
Interface = eth0
# 鸟哥将注册表独立出来管理,且管制监听的接口为 eth0
[opencloseSSH]
sequence = 2100:tcp,2200:udp,2300:tcp
seq_timeout = 15
tcpflags = syn
start_command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport ssh -j ACCEPT
cmd_timeout = 30
# 在开放防火墙后,等待 30 秒,若用户端没有动作,则将该规则再关闭
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport ssh -j ACCEPT
|
设置妥当之后就赶快来启动他吧!启动就更简单了!
[root@linux ~]# /etc/init.d/knockd start
[root@linux ~]# chkconfig knockd on
|
这样就搞定了 knockd 了!
knock 用户端处理方式
既然 knockd 需要接触服务器的数个端口口,那么用户端该如何接触呢?很简单啊~
妳可以使用 telnet 发送封包,也可以使用 knock 这个用户端指令来处理。
knock 很不错的地方,在于他同时提供 Linux/Windows 那个用户端程序!
鸟哥也建议使用 knock 即可,因为使用 telnet 常常无法成功,真烦人~
底下让我们来实际测试看看啰:
用户端为 Linux 系统
如果用户端是 Linux 系统时,请前往前面安装的地方,妳只要安装 knock 即可,不需要安装 knock-server 的啦!
那这个程序如何使用呢?非常简单,只要这样做即可:
[root@linux ~]# knock -v 192.168.1.254 2100:tcp 2200:udp 2300:tcp
hitting tcp 192.168.1.254:2100
hitting udp 192.168.1.254:2200
hitting tcp 192.168.1.254:2300
|
knock 之后加上主机名称,然后后面就是接续的不同的端口口。至于 -v 的参数只是列出 knock 用户的运作流程而已。
接下来用户端有 30 秒的时间 (鸟哥的设置档自订的,您可以修改此项目) 可以连上主机,
如果超过 30 秒没有回应的话,那么该规则就会被再次的删除喔!如果想要确认有无成功的话,
请到 knockd 主机上面,运行 iptables-save 查阅看看有没有 IP 列表就知道啦!粉简单吧!
用户端为 Windows 系统
若用户端为 Windows 系统时,
knockd 官网已经很好心的将 knock 的用户端软件编译成为 Win32 能运行的二进位文件
(binary file) ,所以妳可以直接下载来使用。若需下载,请按底下的链接吧:
由于文件是压缩档,因此妳必须要先解压缩才行。解压缩完毕后,进入新建的目录会有底下的文件:

图二、Windows 用户端使用的 knock 软件
上面的文件都是原代码,给大家参考用而已。在那个 Release 目录内的文件才是可运行档。
建议妳
可以将文件名为 knock.exe 的文件 (在 Release 目录内) 放置到 C:\Windows 底下,
这样妳才可以在任何地方直接下达 knock 这个指令。接下来请打开 DOS 窗口,亦即『开始』-->『运行』
在出现的窗口当中输入『 cmd 』,就能够取得终端机了。之后的指令就如同 Linux 环境啰!
C:\>knock -v 192.168.1.254 2100:tcp 2200:udp 2300:tcp
hitting tcp 192.168.1.254:2100
hitting udp 192.168.1.254:2200
hitting tcp 192.168.1.254:2300
|
之后再以 pietty (
http://ntu.csie.org/~piaip/pietty/) 立刻连上原本的 SSH 主机,嘿嘿!搞定~
参考数据
修改历史:
2007/09/19:讨论区的老周兄一直建议的好软件,鸟哥来将他写成简单的文档吧!
2007/09/22:根据老周的来信,确认 iptables.rule 不需要修改!没有开放 port 也可以。感谢 jou !
2007/09/19 以来统计人数