1. 背景介绍
fwknop实现的是SPA(Single Packet Authorization)技术,其作用是通过对指定端口的打开和关闭,来控制端口的显示和隐藏。当端口被关闭时,此端口将无法被访问,若要向访问此端口则需要使用指定的客户端发送报文(经过加密)进行认证,认证通过后就可对此端口进行访问。具体的使用方式将在之后的博文中介绍,本篇主要介绍fwknop的编译。
2. 源码编译
其实fwknop的服务端及客户端可以直接在Ubuntu上通过命令安装,那还为什么要将它的源码编译呢? 这里进行源码编译的原因如下:
- 使用fwknop后产生了,知其然知其所以然的想法
- 研究源码方便二开
- 学习新的知识,特别是开源的代码一定要将其编译跑通,达到可调式的地步,要不然学习的效率会折半
2.1 源码获取
fwknop源码获取,我这里下的版本是2.6.11
2.2 环境介绍
- Ubuntu 18.04.5 桌面版
- VM虚拟机下运行
- Ubuntu虚拟机为初始环境,所以我的编译过长可能会比较长,请大家选取自己所需部分即可
2.3 对git克隆下来的代码直接进行编译
-
切换到源码所在目录运行: ./autogen.sh,运行之后若有什么工具没有安装会提示的,我这里安装如下工具:
- sudo apt-get install libtool
- sudo apt-get install automake
- 安装后重新运行autogen.sh,有关libtool及automake工具的作用大家可自己百度,以后若有机会将会出相关的博文进行详细介绍
-
autogen.sh正常运行后,运行./configure,configure有些参数信息可以运行"./ configure --help"进行查看,参数中可以配置是否构建客户端,我这里没有进行配置,按照默认进行生成的。运行后根据提示我这里需要安装如下工具:
- sudo apt-get install libpcap-dev
-
运行make(我这里需要安装sudo apt-get install make),运行后报错,如下:
- 有关‘makeinfo‘ is missing on your system,这个需要安装textinfo,sudo apt-get install texinfo
-
运行
./autogen.sh
-
运行
./configure
-
当生成fwknopd和fwknop两个可执行文件后至此编译完成,也可以运行sudo make install 进行安装,这样会将服务端与客户端都安装上去
-
通过make install安装后,可以使用 "sudo make uninstall"进行卸载
2.4 挑选出C++部分的服务端进行编译
fwknop最初是由perl进行开发,现在最新的版本则是由C++进行开发,所以当然选最新的咯(弱弱的说句:其实是不会perl)。至于为什么直接使用源码中提供的方式直接编译(它不香吗?),非要自己折腾。这里就简单说下:
- 对Linux下大型项目的编译工具什么的不了解,知识有所欠缺(makefile也不是很熟悉)
- 自己重新写最原始的gcc 编译指令,对项目的功能模块会有一定的了解
- 以上拙见,若有不足之处请各位评论区留言指正
接下来开始单独编译fwknop-server:
-
将common、lib及server目录单独存放到一个文件夹
-
编译common并将其制作成一个静态库libfko_util.a
- 指令gcc -c strlcpy.c strlcat.c fko_util.c -w -I../lib -I./
- 编译时可能" ‘EXIT_FAILURE’ undeclared",此时将报错的文件添加"#include <stdlib.h>"
- 制作静态库ar -rcs libfko_util.a *.o
-
编译lib同样的将结果输出为一个静态库libfko.a
- 编译的时候将先common.h和fko_common.h中的strnlen注释掉
- 指令gcc -c base64.c cipher_funcs.c digest.c fko_client_timeout.c fko_digest.c fko_encode.c fko_decode.c fko_encryption.c fko_error.c fko_funcs.c fko_message.c fko_nat_access.c fko_rand_value.c fko_server_auth.c fko_timestamp.c fko_hmac.c hmac.c fko_user.c md5.c rijndael.c sha1.c sha2.c sha3.c gpgme_funcs.c -w -I./ -I../common
- 制作静态库ar -rcs libfko.a *.o
-
编译server
- 指令gcc -o fwknopd fwknopd.c config_init.c incoming_spa.c pcap_capture.c process_packet.c log_msg.c utils.c sig_handler.c replay_cache.c access.c fwknopd_errors.c tcp_server.c udp_server.c fw_util.c fw_util_ipf.c fw_util_firewalld.c fw_util_iptables.c fw_util_ipfw.c fw_util_pf.c extcmd.c cmd_cycle.c -lfko_util -L ../common -lfko -L ../lib -lpcap -lgdbm -D HAVE_LIBGDBM -w -D ‘SYSCONFDIR=“/etc”’ -D ‘PACKAGE_NAME=“/fwknop”’ -D ‘SYSRUNDIR=“/var/run”’ -D ‘VERSION=“2.6.11”’ -D FIREWALL_IPTABLES -D USE_LIBPCAP -D HAVE_SYS_WAIT_H -D ‘FIREWALL_EXE=“/sbin/iptables”’ -I../lib -I../common
- 编译的时候多数错误是没有包含头文件,下面列举比较特殊的错误:
- 关于gdbm,解决sudo apt install libgdbm-dev
- 关于ether_header,解决:包含头文件"<linux/if_ether.h>",将ether_header替换为ethhdr,将ether_type替换为h_proto
- 关于ETHER_IS_VALID_LEN,解决: 包含头文件<net/ethernet.h>
-
编译说明
- 之所以编译这些源文件,是分别参考common、lib及server目录下的Makefile.am文件
- 在编译server时的宏定义上可以简单看出server的结构,其中使用的到了gdbm、libpcap、iptables及配置文件,有关server的具体功能模块及源码分析以后详细介绍
- fwknop源码中用到了CUnit,进行单体测试,我编译的时候没有用到,如果需要CUnit安装如下:
好了到此编译结束,打完收工,哈哈!