Wireguard只使用2个报文1个RTT就能完成密钥协商和身份认证,这使Wireguard的连接速度更快,而且能更好的防护DOS攻击(验证不通过不回报文)。
Wireguard也是支持PFS的,所以每隔REKEY_AFTER_TIME(120s)就重新执行一次密钥协商/握手,这与第一次握手并没有什么不同。
每经过KEEPALIVE时间,且这段时间没有消息发送则发送一个空的报文,如果再经过REKEY_TIMEOUT(5s)没有收到数据包则发起新的握手。
经过REJECT_AFTER_TIME(180s) * 3后没有收到数据包则会话密钥过期,断开连接。
为了抵抗抗拒绝服务攻击握手包需要推带MAC字段,MAC的密钥为对方的公钥,所以wireguard公钥也要保护好。
wireguard状态中的上次握手时间指的就是上次密钥协商/握手的时间,是固定2分钟执行一次,REJECT_AFTER_TIME(180s) * 3后没有重新握手连接就中断了。起初我还以为这个握手时间是上次发包的时间。
握手过程
带cookie的握手过程
第1个包
第2个包
cookie应答包
负载包
wireguard一共定义了这4个包类型,没有连接关闭包。
wireguard各个常量的值:
https://github.com/torvalds/linux/blob/master/drivers/net/wireguard/messages.h
wireguard协议参考:
https://www.wireguard.com/protocol/
https://www.wireguard.com/papers/wireguard.pdf