fwknop是个单数据包认证与授权(Single Packet Authorization)的软件,包括两部份:
fwknopd:服务器端,用于接收客户端的连接请求并创建iptables规则;
fwknop:客户端,用于发送认证数据包;
认证通过后,服务器会有30秒(可配置)时间允许接入,之后保持接入状态。
一、软件安装
下载:
安装前可能需要先装:
ubuntu : apt-get install libgdbm-dev
centos :
yum install -y yum install -y gdbm-devel.i686
yum install -y libpcap-devel
按照传统安装方式:
./configure && make sudo make install
二、配置
access.conf
SOURCE: ANY;
OPEN_PORTS: tcp/22,tcp/3306;
KEY: test;
REQUIRE_USERNAME: testuser;
FW_ACCESS_TIMEOUT: 30;
允许从任何IP地址以客户端上的testuser用户身份发起fwknop认证请求,认证密码为test。每次认证通过后,fwknopd为该客户端IP地址创建的一条iptables规则允许其连接sshd服务。fwknopd30秒后自动清除该iptables规则,已经连接上的数据链路不会被阻止,但是禁止新的ssh连接请求。最多允许打开,22、3306这两个端口。
fwknopd.conf
PCAP_INTF eth0;
MAX_SPA_PACKET_AGE 120;
ENABLE_SPA_PACKET_AGING Y;
IPT_INPUT_ACCESS ACCEPT, filter, INPUT, 1, FWKNOP_INPUT, 1;
fwknopd监控来自eth0的数据包信息,并且要求客户端发起认证请求后,必须在120秒内完成认证过程;否则本次认证就会被视为失败。(必须保证Client与Server的时间是同步的,建立使用NTP保持时间同步)
认证通过后在系统防火墙上建立一条iptables规则,允许客户端发起ssh连接。
三、测试
服务器端通过iptables防止除lo之外所有的INPUT连接
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -X
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -i ! lo -j DROP
客户端尝试扫描服务器的开放端口(例如SSH),此时必然显示filtered,无法连接
nmap ServerIP -p 22
服务器端:
启动监控服务进程 /usr/local/sbin/fwknopd
停止监控服务进程 /usr/local/sbin/fwknopd -K
客户端:
初始化客户端环境运行
[testuser@linux ~]$/usr/local/bin/fwknop -f -v
客户端"敲门"
[testuser@linux ~]$/usr/local/bin/fwknop -A tcp/22 -a ClientIP -D ServerIP
这时客户端再尝试扫描服务器的22端口,则会显示开放,能够正常连接。
ssh ServerIP
四、技巧
1、如果用于透明网桥(bridge),要打开FORWARD链,可以简单将配置文件fwknop.conf中:
IPT_INPUT_ACCESS ACCEPT, filter, INPUT, 1, FWKNOP_INPUT, 1;
改成:
IPT_INPUT_ACCESS ACCEPT, filter, FORWARD, 1, FWKNOP_INPUT, 1;
2、总是提示"SPA data is too old"怎么办?
下面的配置就是对付这个问题的:
ENABLE_SPA_PACKET_AGING N;