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

时间:2020-01-09 10:38:02  来源:igfitidea点击:

我的基于iptables的防火墙仅允许端口TCP 80和443。
我还需要tcp端口22,但是我家里没有静态IP。
如何在基于Debian或Ubuntu Linux的服务器系统上按需打开和关闭TCP端口22?
如何安装名为壁挂的端口敲服务器,并用iptables配置它以打开tcp端口22或任何其他端口?

Debian或Ubuntu Linux自带。
这是一个端口断开服务器。
它侦听由VPN /拨号pppd创建的以太网和/或PPP接口上的所有流量,以查找端口命中的特殊中断序列。

"knock"客户端通过将TCP或UDP数据包发送到服务器上的端口来进行端口命中。
该端口不需要打开,因为被敲的在链路层级别侦听,即使目的地为封闭端口,它也可以看到所有流量。

当服务器检测到特定的端口命中顺序时,它将运行在其配置文件中定义的命令。
这可用于在防火墙中打开漏洞以便快速访问。

安装Knockd

使用ssh客户端打开终端或登录到远程服务器。
以超级用户身份执行以下apt-get命令以安装knockd服务器:

$ 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.
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

保存并关闭文件。
编辑文件/etc/default/knockd,输入:

$ sudo vi /etc/default/knockd

将:

START_KNOCKD=0

修改成:

START_KNOCKD=1

可选:根据您的设置设置接口名称,例如eth0或ppp0:

KNOCKD_OPTS="-i eth0"

保存并关闭文件。

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

执行以下命令:

sudo service knockd start #<-- start server
sudo service knockd stop #<-- stop server
sudo service knockd restart #<-- restart server
sudo service knockd status #<-- see status server

或者

sudo /etc/init.d/knockd start #<-- start server
sudo /etc/init.d/knockd stop #<-- stop server
sudo /etc/init.d/knockd restart #<-- restart server
sudo /etc/init.d/knockd status #<-- see status server

我该如何敲开端口?

您需要使用knock命令。
它是一个端口断开的客户端。
要在203.1.2.3 ip地址为sshd打开tcp端口#22,请输入:

$ knock -v 203.1.2.3 2022 3022 3022

输出示例:

hitting tcp 203.1.2.3:2022
hitting tcp 203.1.2.3:3022
hitting tcp 203.1.2.3:4022

如何关闭端口?

语法为:

$ knock -v 203.1.2.3 4022 3022 2022

如何打开UDP端口?

语法为:

$ knock -v -u 203.1.2.3 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