Debian/Ubuntu:使用Knockd和Iptables设置端口敲门

时间:2019-11-20 08:53:10  来源:igfitidea点击:

端口敲门Port Knocking

在计算机中,端口敲门是通过在一组预先指定的关闭端口上生成连接尝试来从外部打开防火墙上的端口的一种方法。一旦接收到正确的连接尝试序列,防火墙规则将被动态修改,以允许发送连接尝试的主机通过特定端口进行连接。

例如,默认防火墙是不开放22端口的。 我们想远程临时打开该端口。
那么我们可以定义一组端口号序列,通过发送这组端口号敲门(相当于钥匙),让防火墙打开端口22。

安装knockd

使用root执行以下apt-get命令:

$ sudo apt-get install knockd

输出示例:

[sudo] password for Hyman: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  knockd
0 upgraded, 1 newly installed, 0 to remove and 4 not upgraded.
Need to get 27.6 kB of archives.
After this operation, 168 kB of additional disk space will be used.
Get:1 http://mirrors.kernel.org/debian/ stable/main knockd amd64 0.5-3 [27.6 kB]
Fetched 27.6 kB in 1s (19.5 kB/s)
Selecting previously deselected package knockd.
(Reading database ... 352407 files and directories currently installed.)
Unpacking knockd (from .../knockd_0.5-3_amd64.deb) ...
Processing triggers for man-db ...
Setting up knockd (0.5-3) ...
knockd disabled: not starting. To enable it edit /etc/default/knockd ... (warning).

配置

配置文件/etc/knockd.conf:

$ sudo vi /etc/knockd.conf

如下更新配置文件。请根据需求将2022、3022、4022改成你想定义的序列端口号(相当于密码):

[options]
        UseSyslog
 
[openSSH]
        sequence    = 2022,3022,4022
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn
 
[closeSSH]
        sequence    = 4022,3022,2022
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

保存并关闭文件。

当我们发送2022,3022,4022这个端口密码时,将会执行 /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT。也就是防火墙打开端口22。
所以,我们也可以将命令换成其他命令。比如重启某个服务器等。

编辑文件/etc/default/knockd

$ sudo vi /etc/default/knockd

START_KNOCKD=0

改成:

START_KNOCKD=1

修改接口名称

KNOCKD_OPTS="-i eth0"

保存并关闭文件。

如何启动/停止/重启 knockd?

执行以下命令:

sudo service knockd start #<-- 启动knockd服务
sudo service knockd stop #<-- 停止knockd服务
sudo service knockd restart #<-- 重启knockd服务
sudo service knockd status #<-- 查看knockd服务状态

或者

sudo /etc/init.d/knockd start 
sudo /etc/init.d/knockd stop 
sudo /etc/init.d/knockd restart 
sudo /etc/init.d/knockd status 

如何敲开端口?

使用knock命令。

在192.168.1.100 ip地址为sshd打开tcp端口22

$ knock -v 192.168.1.100 2022 3022 3022

输出示例:

hitting tcp 192.168.1.100:2022
hitting tcp 192.168.1.100:3022
hitting tcp 192.168.1.100:4022

如何关闭knock端口?

语法为:

$ knock -v 192.168.1.100 4022 3022 2022

如何打开UDP端口?

使用-u选项。

语法为:

$ knock -v -u 192.168.1.100 9090

您还可以如下组合TCP和UDP端口:

$ knock server1.theitroad.local 2022:tcp 9090:udp 4022:tcp

如何验证服务器是否已打开或关闭端口?

使用ssh客户端,如下所示:

$ ssh [email protected]

或者查看防火墙状态

# iptables -L INPUT -v -n
# iptables -L INPUT -v -n | grep :22