fwknop SPA服务端源码编译

1. 背景介绍

fwknop实现的是SPA(Single Packet Authorization)技术,其作用是通过对指定端口的打开和关闭,来控制端口的显示和隐藏。当端口被关闭时,此端口将无法被访问,若要向访问此端口则需要使用指定的客户端发送报文(经过加密)进行认证,认证通过后就可对此端口进行访问。具体的使用方式将在之后的博文中介绍,本篇主要介绍fwknop的编译。

2. 源码编译

其实fwknop的服务端及客户端可以直接在Ubuntu上通过命令安装,那还为什么要将它的源码编译呢? 这里进行源码编译的原因如下:

  1. 使用fwknop后产生了,知其然知其所以然的想法
  2. 研究源码方便二开
  3. 学习新的知识,特别是开源的代码一定要将其编译跑通,达到可调式的地步,要不然学习的效率会折半

2.1 源码获取

fwknop源码获取,我这里下的版本是2.6.11

2.2 环境介绍

  1. Ubuntu 18.04.5 桌面版
  2. VM虚拟机下运行
  3. Ubuntu虚拟机为初始环境,所以我的编译过长可能会比较长,请大家选取自己所需部分即可

2.3 对git克隆下来的代码直接进行编译

  1. 切换到源码所在目录运行: ./autogen.sh,运行之后若有什么工具没有安装会提示的,我这里安装如下工具:
    在这里插入图片描述

    1. sudo apt-get install libtool
    2. sudo apt-get install automake
    3. 安装后重新运行autogen.sh,有关libtool及automake工具的作用大家可自己百度,以后若有机会将会出相关的博文进行详细介绍
  2. autogen.sh正常运行后,运行./configure,configure有些参数信息可以运行"./ configure --help"进行查看,参数中可以配置是否构建客户端,我这里没有进行配置,按照默认进行生成的。运行后根据提示我这里需要安装如下工具:
    在这里插入图片描述

    1. sudo apt-get install libpcap-dev
  3. 运行make(我这里需要安装sudo apt-get install make),运行后报错,如下:
    在这里插入图片描述

    1. 有关‘makeinfo‘ is missing on your system,这个需要安装textinfo,sudo apt-get install texinfo
  4. 运行./autogen.sh

  5. 运行./configure

  6. 当生成fwknopd和fwknop两个可执行文件后至此编译完成,也可以运行sudo make install 进行安装,这样会将服务端与客户端都安装上去

  7. 通过make install安装后,可以使用 "sudo make uninstall"进行卸载

2.4 挑选出C++部分的服务端进行编译

fwknop最初是由perl进行开发,现在最新的版本则是由C++进行开发,所以当然选最新的咯(弱弱的说句:其实是不会perl)。至于为什么直接使用源码中提供的方式直接编译(它不香吗?),非要自己折腾。这里就简单说下:

  1. 对Linux下大型项目的编译工具什么的不了解,知识有所欠缺(makefile也不是很熟悉)
  2. 自己重新写最原始的gcc 编译指令,对项目的功能模块会有一定的了解
  3. 以上拙见,若有不足之处请各位评论区留言指正

接下来开始单独编译fwknop-server:

  1. 将common、lib及server目录单独存放到一个文件夹

  2. 编译common并将其制作成一个静态库libfko_util.a

    1. 指令gcc -c strlcpy.c strlcat.c fko_util.c -w -I../lib -I./
    2. 编译时可能" ‘EXIT_FAILURE’ undeclared",此时将报错的文件添加"#include <stdlib.h>"
    3. 制作静态库ar -rcs libfko_util.a *.o
  3. 编译lib同样的将结果输出为一个静态库libfko.a

    1. 编译的时候将先common.h和fko_common.h中的strnlen注释掉
    2. 指令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
    3. 制作静态库ar -rcs libfko.a *.o
  4. 编译server

    1. 指令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
    2. 编译的时候多数错误是没有包含头文件,下面列举比较特殊的错误:
      1. 关于gdbm,解决sudo apt install libgdbm-dev在这里插入图片描述
      2. 关于ether_header,解决:包含头文件"<linux/if_ether.h>",将ether_header替换为ethhdr,将ether_type替换为h_proto 在这里插入图片描述
      3. 关于ETHER_IS_VALID_LEN,解决: 包含头文件<net/ethernet.h> 在这里插入图片描述
  5. 编译说明

    1. 之所以编译这些源文件,是分别参考common、lib及server目录下的Makefile.am文件
    2. 在编译server时的宏定义上可以简单看出server的结构,其中使用的到了gdbm、libpcap、iptables及配置文件,有关server的具体功能模块及源码分析以后详细介绍
    3. fwknop源码中用到了CUnit,进行单体测试,我编译的时候没有用到,如果需要CUnit安装如下:
      在这里插入图片描述

好了到此编译结束,打完收工,哈哈!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值