跳到主要内容

将fwknop部署到不同操作系统

fwknop在CentOS的部署指南

步骤1# 安装依赖项

sudo yum install -y wget git
sudo yum install -y libtool
sudo yum install -y libpcap libpcap-devel
sudo yum install -y texinfo
sudo yum install -y iptables-services
sudo systemctl enable iptables
sudo systemctl start iptables

步骤2# 安装fwknop

$ git clone https://github.com/mrash/fwknop.git
# 由于2.6.11标签在安装时存在一些错误,因此我们checkout到这个提交
$ cd fwknop && git checkout 7605573040604cf899fee4fff21fa0c6e6bc5c37
$ ./autogen.sh

在Centos 7中,运行./autogen.sh时你将得到以下错误:

...
doc/Makefile.am:1: error: option 'info-in-builddir' not recognized
...

我们可以通过更改doc/Makefile.am来修复它(注释掉AUTOMAKE_OPTIONS行,然后重试)

提示

修改后的doc/Makefile.am

# 注释掉这行
-AUTOMAKE_OPTIONS = info-in-builddir
+#AUTOMAKE_OPTIONS = info-in-builddir

然后尝试./configure && make && make install

步骤3# 配置fwknop并运行fwknop

$ vim server/access.conf
#### fwknopd access.conf配置 ###

SOURCE ANY
OPEN_PORTS tcp/4022,tcp/22
KEY_BASE64 e7USwx6Ik5LU4f3s0sBA9C5vB0y/UeQpdbDAcjT5+EY=
HMAC_KEY_BASE64 pVRDi5qu6IYT34RVQn7JNXI0ETnxVldxC+kZxMcGhjK7gF7MYTRSdDDWrJHh8IfTO4NY2zNQ6sCI6DFFSr93QA==
REQUIRE_SOURCE_ADDRESS Y
REQUIRE_USERNAME vps
#PCAP_INTF eth0;
# 如果你想使用GnuPG密钥,则定义以下变量
#
#GPG_HOME_DIR /homedir/path/.gnupg
#GPG_DECRYPT_ID ABCD1234
#GPG_DECRYPT_PW __CHANGEME__

# 如果你想要求GPG签名:
#GPG_REQUIRE_SIG Y
#GPG_IGNORE_SIG_VERIFY_ERROR N
#GPG_REMOTE_ID 1234ABCD

SOURCE ANY
KEY_BASE64 FKRrVEuDjxas9yAXR18hPl9XX8gYPRHSpFp2jFKQrf0=
HMAC_KEY_BASE64 Zya1FvFa1hQkbxZkTfq+rOFeUm+WtpiHGheol8UTuLV1QHLd2epG1SLyygQDFK4V3KxRZmyrBPHuokW3JigWnQ==

然后运行fwknop

fwknopd -K
fwknopd -U -a server/access.conf

步骤4# 配置iptables

# 允许本地回环(以避免影响本地访问)
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接继续通信
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许UDP端口62201用于fwknop
sudo iptables -A INPUT -p udp -m udp --dport 62201 -j ACCEPT

# 请参见下面的警告
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许ICMP(可选,启用ping)
sudo iptables -A INPUT -p icmp -j ACCEPT

# 默认DROP所有其他INPUT
sudo iptables -P INPUT DROP

# 将规则保存到/etc/systconfig/iptables
service iptables save
注意

允许SSH连接(端口22),请小心不要忽略这条规则(sudo iptables -A INPUT -p udp -m udp --dport 62201 -j ACCEPT),除非你已经熟悉fwknop和iptables。我们使用其他端口来测试配置,因此端口22将被打开

步骤5# 配置并使用fwknop客户端以实现安全访问

# .fwknoprc
##############################################################################
#
# 防火墙敲击操作员(fwknop)客户端rc文件。
#
# 这个文件包含用户特定的fwknop客户端配置默认
# 和特定参数集,用于特定的fwknop客户端调用。
#
# 每个部分(或stanza)是通过这个
# 文件中的一行来标识和开始的,该行包含一个单独的标识符,周围是方括号。
# 正是这个标识符(或名称)被用于fwknop命令行
# 通过'-n <name>'参数来引用相应的stanza。
#
# 参数通常与相应的客户端
# 命令行参数匹配。
#
# 第一个应该总是'[default]',因为它定义了用户的
# 全局默认设置。这些设置将覆盖程序默认
# 的这些参数。如果使用了命名的stanza,其条目将
# 覆盖任何默认值。命令行选项将超越它们所有。
#
# 后续的stanza将只有覆盖和特定于目标的参数。
#
# 以'#'开头的行和空行将被忽略。
#
# 请参见fwknop.8手册页,获取完整的有效参数
# 和它们的值列表。
#
##############################################################################
#
# 我们从'default' stanza开始。 请注释并编辑以符合你的
# 偏好。 客户端将使用其内置的默认值来代替
# 那些被注释掉的项。
#
[default]

#DIGEST_TYPE sha256
#FW_TIMEOUT 30
#SPA_SERVER_PORT 62201
#SPA_SERVER_PROTO udp
#ALLOW_IP <ip addr>
#SPOOF_USER <username>
#SPOOF_SOURCE_IP <IPaddr>
#TIME_OFFSET 0
#USE_GPG N
#GPG_HOMEDIR /path/to/.gnupg
#GPG_EXE /path/to/gpg
#GPG_SIGNER <signer ID>
#GPG_RECIPIENT <recipient ID>
#NO_SAVE_ARGS N

# 用户提供的命名stanza:

# 例如,为了一个目标服务器为192.168.1.20的SSH访问,打开
# 一个IP的访问,该IP通过外部解析,并且一个NAT请求
# 为了特定的源IP,该IP映射到192.168.1.55的8088端口
# 到88端口,并设置超时。
#
#[myssh]
#SPA_SERVER 192.168.1.20
#ACCESS tcp/22
#ALLOW_IP resolve
#
#[mynatreq]
#SPA_SERVER 192.168.1.20
#ACCESS tcp/8088
#ALLOW_IP 10.21.2.6
#NAT_ACCESS 192.168.1.55,88
#CLIENT_TIMEOUT 60
#

[vpn]
SPA_SERVER_PROTO udp
SPA_SERVER_PORT 62201
ALLOW_IP <YouClientIP>
ACCESS tcp/4022,tcp/22
SPA_SERVER vpn.server
KEY_BASE64 e7USwx6Ik5LU4f3s0sBA9C5vB0y/UeQpdbDAcjT5+EY=
HMAC_KEY_BASE64 pVRDi5qu6IYT34RVQn7JNXI0ETnxVldxC+kZxMcGhjK7gF7MYTRSdDDWrJHh8IfTO4NY2zNQ6sCI6DFFSr93QA==
USE_HMAC Y
SPOOF_USER vps
FW_TIMEOUT 60

然后运行 fwknop -n vpn -v,以打开一个IP的SSH访问,该IP通过外部解析。

提示

使用 iptables -nvL 检查是否已打开访问

$ iptables -vnL
Chain INPUT (policy DROP 2 packets, 88 bytes)
pkts bytes target prot opt in out source destination
17M 3034M FWKNOP_INPUT all -- * * 0.0.0.0/0 0.0.0.0/0
9655K 1671M ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
3682K 295M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
14001 911K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
117K 6214K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4022
20036 1334K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
5971 1639K ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:62201

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 10 packets, 592 bytes)
pkts bytes target prot opt in out source destination

Chain FWKNOP_INPUT (1 references)
pkts bytes target prot opt in out source destination
# 你可以在iptables中找到这条规则
0 0 ACCEPT tcp -- * * <YourIP> 0.0.0.0/0 tcp dpt:4022/* _exp_1742783157 */
0 0 ACCEPT tcp -- * * <YourIP> 0.0.0.0/0 tcp dpt:22/* _exp_1742783157 */
提示

在客户端计算机上使用类似以下命令的telnet来检查是否已打开访问

$ telnet <YourIP> 4022
Trying <YourIP>...
Connected to fwknop.com.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4

fwknop在Windows上的部署

fwknop在MacOS上的部署

fwknop在OpenWRT上的部署