在使用hostapd做软ap时,出现了random熵不够的问题,导致节点连接不上这个ap。

  下面先解释一下/dev/random和/dev/urandom

先让我们从一个工程中遇到的实际问题开始,先上log:

E/hostapd (  100): random: Cannot readfrom /dev/random: Try again

I/hostapd (  100): random: Only 0/20bytes of strong random data available from /dev/random

I/hostapd (  100): random: Not enoughentropy pool available for secure operations

I/hostapd (  100): WPA: Note[   22.722265] RTL871X: set group key to hw: alg:2(WEP40-1 WEP104-5TKIP-2 AES-4) keyid:1

nough entropy in random pool to proceed -reject first 4-way handshake

以上是hostapd在接受一个wifi终端的接入鉴权时的一段log,该段log显示,在开始四步握手鉴权时,需要获取随机数,而此时/dev/random却未能够提供足够的随机数熵(entropy),导致鉴权不能正常进行。

那为什么/dev/random不能提供足够的随机数呢,为了解析这个,得从他们的根源分析起。

/dev/random和/dev/urandom是unix系统提供的产生随机数的设备,很多应用都需要使用random设备提供的随机数,比如ssh keys, SSL keys, TCP/IP sequence numbers等等

而random设备的random pool是从基于中断的IRQS里面取值,IRQS跟一些特殊的硬件绑定,基于这些硬件的interrupts将会提供给random设备。

以下模拟一个从/dev/random取值但是/dev/random取不到足够值的情况,这时候取值的进程将会等待,直到得到足够的random 值。

rubbitxiao@szmce15:~$ time dd if=/dev/random of=1.dmp bs=1024k count=100 &
[1] 25398

这时dd的进程将会hang住等待足够的random值

rubbitxiao@szmce15:~$ ps
  PID TTY          TIME CMD
24315 pts/11   00:00:00 bash
25398 pts/11   00:00:00 bash
25399 pts/11   00:00:00 dd
25400 pts/11   00:00:00 ps

用strace跟踪dd进程在做什么

rubbitxiao@szmce15:~$ sudo strace -p 25399
[sudo] password for rubbitxiao: 
Process 25399 attached - interrupt to quit
read(0, "\256Yi\314\266\351\1\366", 1048576) = 8
write(1, "\256Yi\314\266\351\1\366", 8) = 8
read(0, "wYyV\264\362K\23", 1048576)    = 8
write(1, "wYyV\264\362K\23", 8)         = 8
read(0, "Cm\220>uy\260\376", 1048576)   = 8
write(1, "Cm\220>uy\260\376", 8)        = 8
read(0, "\365\217\302yk\177\234\244", 1048576) = 8
write(1, "\365\217\302yk\177\234\244", 8) = 8
read(0, "\24,\226l\216\203E\322", 1048576) = 8
write(1, "\24,\226l\216\203E\322", 8)   = 8
read(0, "t\273\27\237\r\243\2164", 1048576) = 8
write(1, "t\273\27\237\r\243\2164", 8)  = 8
read(0, "\232x\n \337M\313/", 1048576)  = 8
write(1, "\232x\n \337M\313/", 8)       = 8
read(0, "\227\251\212\264o\30~\327", 1048576) = 8
write(1, "\227\251\212\264o\30~\327", 8) = 8
read(0, "y\21\20\213cAS\260", 1048576)  = 8
write(1, "y\21\20\213cAS\260", 8)       = 8
read(0, "p\355\356\303\36\35\350\206\323", 1048576) = 9
write(1, "p\355\356\303\36\35\350\206\323", 9) = 9
read(0, "&\1b\32\262L\3\33\10", 1048576) = 9
write(1, "&\1b\32\262L\3\33\10", 9)     = 9
read(0, "O\30\372\374\t-7\36", 1048576) = 8
write(1, "O\30\372\374\t-7\36", 8)      = 8
read(0, "]\277\22\364\260\217\254>", 1048576) = 8
write(1, "]\277\22\364\260\217\254>", 8) = 8
read(0, "R,\0227\307\300\275}", 1048576) = 8
write(1, "R,\0227\307\300\275}", 8)     = 8
read(0, "p^\356V&7\223w\271", 1048576)  = 9
write(1, "p^\356V&7\223w\271", 9)       = 9
read(0, "t\267\325_\7\227\303\313", 1048576) = 8
write(1, "t\267\325_\7\227\303\313", 8) = 8
read(0, "\216DA_\340\211\ts", 1048576)  = 8
write(1, "\216DA_\340\211\ts", 8)       = 8
read(0, "jl\366D\1\25o\315<", 1048576)  = 9
write(1, "jl\366D\1\25o\315<", 9)       = 9
read(0, "\375\266\253\36\234\255I\n", 1048576) = 8
write(1, "\375\266\253\36\234\255I\n", 8) = 8
read(0, "h\216j\3046\315>{", 1048576)   = 8
write(1, "h\216j\3046\315>{", 8)        = 8
read(0, "\270\267\33S\314\354= ", 1048576) = 8
write(1, "\270\267\33S\314\354= ", 8)   = 8
read(0, ");\361\356\363\316_\242", 1048576) = 8

...  ...

write(1, "V\261\373h\267\0104+", 8)     = 8
read(0, "\4\327\335S\304\24\243\362", 1048576) = 8
write(1, "\4\327\335S\304\24\243\362", 8) = 8
read(0, "0\0b\27\363\\\217\"", 1048576) = 8
write(1, "0\0b\27\363\\\217\"", 8)      = 8
close(0)                                = 0
close(1)                                = 0
write(2, "0+100 records in\n0+100 records o"..., 350+100 records in
0+100 records out
) = 35
write(2, "807 bytes (807 B) copied", 24807 bytes (807 B) copied) = 24
write(2, ", 1407.68 s, 0.0 kB/s\n", 22, 1407.68 s, 0.0 kB/s
) = 22
close(2)                                = 0
exit_group(0)                           = ?
Process 25399 detached

real    23m27.695s
user    0m0.012s
sys     0m0.000s
[1]+  Done                    time dd if=/dev/random of=1.dmp bs=1024k count=100

以上可以看出,从/dev/random读取(100*1024K个)随机数,由于中间会阻塞(dd hang),所以总计花了23分钟27秒才完成。为什么会花费这么长的时间,因为它的随机数的提供是依赖与外部中断事件的,如果没有足够多中断事件,就会阻塞,其实为了加速/dev/random提供随机数的速度,你可以通过操作设备的外设,让其产生大量的中断(如网络传输数据,按键,移动鼠标等)。

是否有足够的熵来用于产生随机数,可以通过如下命令来查看:

cat /proc/sys/kernel/random/entropy_avail

rubbitxiao@szmce15:~$ cat /proc/sys/kernel/random/entropy_avail                                                                    
277

接下来我们看/dev/urandom,从它那里取同样多的随机数,

rubbitxiao@szmce15:~$ 
rubbitxiao@szmce15:~$ time dd if=/dev/urandom of=1.dmp bs=1024k count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 6.38387 s, 16.4 MB/s

real    0m6.385s
user    0m0.000s
sys     0m6.364s
rubbitxiao@szmce15:~$

却只需要花费6.385秒,同样的机器上,/dev/urandom不受interrupts的限制,即使没有足够的interrupt它也能通过 random number generator产生足够的输出值,所以它不会导致dd hang

至此可以看出/dev/urandom与/dev/random的区别,前者不受外部中断的影响,照样可以产生随机数,而后者则受系统外部中断的影响,所以如果取较多随机数,可能会导致应用会hang住。在我们开篇的那个log,就是属于这个问题。

还遇见了这个问题,log如下

Configuration file: /etc/hostapd/hostapd.conf
Using interface wlp4s0 with hwaddr 3c:33:00:f6:67:2b and ssid "Codz"
random: Cannot read from /dev/random: Resource temporarily unavailable
random: Only 0/20 bytes of strong random data available from /dev/random
random: Not enough entropy pool available for secure operations
WPA: Not enough entropy in random pool for secure operations - update keys later when the first station connects
wlp4s0: interface state UNINITIALIZED->ENABLED
wlp4s0: AP-ENABLED 总得来说都是random出了问题,最终的解决方法是:
mv /dev/random /dev/random.orig
ln -s /dev/urandom /dev/random
使用urandom产生随机数 本文摘录了https://blog.csdn.net/xiaojsj111/article/details/24366127的一些内容
 

hostapd、/dev/random、/dev/urandom的更多相关文章

  1. /dev/random 和 /dev/urandom的一点备忘

    1.  基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys, ...

  2. /dev/random和/dev/urandom的一点备忘

    1.  基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys, ...

  3. Linux系统产生随机数/dev/random 和 /dev/urandom

    1.  基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys, ...

  4. /dev/random vs /dev/urandom

    If you want random data in a Linux/Unix type OS, the standard way to do so is to use /dev/random or ...

  5. /dev/random 和 /dev/urandmon的差别

    最近使用这两个设备的时候,发现 /dev/random生成随机数很慢:于是就查了查: 这两个设备的差异在于:/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/d ...

  6. Oracle 关于几个随机函数sys_guid、dbms_random.random、dbms_random.value(取随机的结果集)

    sys_guid():SYS_GUID (),是Oracle 8i 后提供的函数.SYS_GUID产生并返回一个全球唯一的标识符(原始值)由16个字节组成.更适合多个数据库数据集成时使用(--源自百度 ...

  7. /dev/random 和 /dev/urandom 的原理

    /dev/null 是一个特殊的设备文件,它丢弃一切写入其中的数据 可以将它 视为一个黑洞, 它等效于只写文件, 写入其中的所有内容都会消失, 尝试从中读取或输出不会有任何结果,同样,/dev/nul ...

  8. 运算符的基本概念以及常用Scanner、随机数Random、选择结构的初步了解

    运算符 分类 算术运算符 位运算符 关系运算符|比较运算符 逻辑运算符 条件运算符 赋值运算符 其中优先级顺序从上到下,可以记忆口诀:单目乘除位关系,逻辑三目后赋值 操作数: 运算符左右两边的数 表达 ...

  9. java中常用到的math方法(Math.PI、Math.random()、Math.abs(double)、Math.floor(double)、Math.ceil(double)、Math.round(double))

    public class MathDemo { public static void main(String args[]){ /** * abs求绝对值 */ System.out.println( ...

随机推荐

  1. PowerBi利用Python Script绕过ODBC来导入MongoDB数据

  2. flex布局实例demo全解

    上篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法. 你会看到,不管是什么布局,Flex往往都可以几行命令搞定. 我只列出代码,详细的语法解释请查阅<Flex布局教程:语法篇> ...

  3. [2019.03.16]使用DOM操作函数和CSS选择器来针对已有的HTML进行只凭JS的改动

    刚入职的时候看到公司用的HTML日志生成工具附带的Panel,工具不够用,找个Fail还要找半天,于是自己琢磨着添砖加瓦.以前也是个半吊子前端工程师,现在可倒好,想要改页面却连页面生成的模板在哪里都不 ...

  4. Java 删除ArrayList中重复元素,保持顺序

    // 删除ArrayList中重复元素,保持顺序          public static List<Map<String, Object>> removeDuplicat ...

  5. [AH2017/HNOI2017]大佬

    题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...

  6. Keepalived配置详解

    Keepalived 配置文件解释 Keepalived的所有配置都在一个配置文件里面,主要分为三类: 全局配置 VRRPD配置 LVS 配置 配置文件是以配置块的形式存在,每个配置块都在一个闭合的{ ...

  7. CF1152E Neko and Flashback--欧拉路径

    RemoteJudge 第一次见到欧拉路径的题 注意到\(b\)和\(c\)的构造方法很特殊,即对于一个位置(经过\(p\)作用后)\(i\),若两个数分别为\(b_i\)和\(c_i\),那么在\( ...

  8. MySQL8.0.19主从环境搭建(CentOS7)

    默认情况下,复制是异步的,从站不需要永久连接以接收来自主站的更新.根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表. MySQL中复制的优点包括: 横向扩展解决方案 - 在多个从站之间 ...

  9. Gym - 101982C Contest Setting (动态规划)

    A group of contest writers have written n problems and want to use k of them in an upcoming contest. ...

  10. ansible安装二进制kubernetes-1.14.1

    主机信息: 主机IP 主机名 角色 10.10.3.181 k8s-m1  kube-apiserver,kube-controller-manager,kube-scheduler,etcd 10. ...