Securi-Pi:使用树莓派作为安全跳板

像很多 LinuxJournal 的读者一样,我也过上了当今非常普遍的“科技游牧”生活,在网络之间,从一个接入点到另一个接入点,我们身处现实世界的不同地方却始终保持连接到互联网和日常使用的其它网络上。近来我发现越来越多的网络环境开始屏蔽对外的常用端口比如 SMTP(端口 25),SSH(端口 22)之类的。当你走进一家咖啡馆然后想 SSH 到你的一台服务器上做点事情的时候发现端口 22 被屏蔽了是一件很烦的事情。

不过,我到目前为止还没发现有什么网络环境会把 HTTPS 给墙了(端口 443)。在稍微配置了一下家中的树莓派 2 之后,我成功地让自己通过接入树莓派的 443 端口充当跳板,从而让我在各种网络环境下都能连上想要的目标端口。简而言之,我把家中的树莓派设置成了一个 OpenVPN 的端点和 SSH 端点,同时也是一个 Apache 服务器,所有这些服务都监听在 443 端口上,以便可以限制我不想暴露的网络服务。

备注

此解决方案能搞定大多数有限制的网络环境,但有些防火墙会对外部流量调用深度包检查Deep packet inspection,它们时常能屏蔽掉用本篇文章里的方式传输的信息。不过我到目前为止还没在这样的防火墙后测试过。同时,尽管我使用了很多基于密码学的工具(OpenVPN,HTTPS,SSH),我并没有非常严格地审计过这套配置方案(LCTT 译注:作者的意思是指这套方案能帮你绕过端口限制,但不代表你的活动就是完全安全的)。有时候甚至 DNS 服务都会泄露你的信息,很可能在我没有考虑周到的角落里会有遗漏。我强烈不推荐把此跳板配置方案当作是万无一失的隐藏网络流量的办法,此配置只是希望能绕过一些端口限制连上网络,而不是做一些危险的事情。

起步

让我们先从你需要什么说起,我用的是树莓派 2,装载了最新版本的 Raspbian,不过这个配置也应该能在树莓派 Model B 上运行;512MB 的内存对我们来说绰绰有余了,虽然性能可能没有树莓派 2这么好,毕竟相比于四核心的树莓派 2, Model B 只有一颗单核心 CPU。我的树莓派放置在家里的防火墙和路由器的后面,所以我还能用这个树莓派作为跳板访问家里的其他电子设备。同时这也意味着我的流量在互联网上看起来仿佛来自我家的 ip 地址,所以这也算某种意义上保护了我的匿名性。如果你没有树莓派,或者不想从家里运行这个服务,那你完全可以把这个配置放在一台小型云服务器上(LCTT 译注:比如 IPS )。你只要确保服务器运行着基于 Debian 的 Linux 发行版即可,这份指南依然可用。

图 1 树莓派,即将成为我们的加密网络端点

安装并配置 BIND

无论你是用树莓派还是一台服务器,当你成功启动之后你就可以安装 BIND 了,这是一个驱动了互联网相当一部分的域名服务软件。你将会把 BIND 仅仅作为缓存域名服务使用,而不用把它配置为用来处理来自互联网的域名请求。安装 BIND 会让你拥有一个可以被 OpenVPN 使用的 DNS 服务器。安装 BIND 十分简单,apt-get 就可以直接搞定:


  1. root@test:~# apt-get install bind9
  2. Reading package lists... Done
  3. Building dependency tree
  4. Reading state information... Done
  5. The following extra packages will be installed:
  6. bind9utils
  7. Suggested packages:
  8. bind9-doc resolvconf ufw
  9. The following NEW packages will be installed:
  10. bind9 bind9utils
  11. 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
  12. Need to get 490 kB of archives.
  13. After this operation, 1,128 kB of additional disk space will be used.
  14. Do you want to continue [Y/n]? y

在我们把 BIND 作为缓存域名服务器之前,还有一些小细节需要配置。两个修改都在/etc/bind/named.conf.options里完成。首先你要取消注释掉 forwarders 这一节内容,同时你还要增加一个可以转发域名请求的目标服务器。作为例子我会用 Google 的 DNS 服务器(8.8.8.8)(LCTT 译注:国内的话需要找一个替代品);文件的 forwarders 节看上去大致是这样的:


  1. forwarders {
  2. 8.8.8.8;
  3. };

第二点你需要做的更改是允许来自内网和本机的查询请求,直接把这一行加入配置文件的后面,记得放在最后一个};之前就可以了:


  1. allow-query { 192.168.1.0/24; 127.0.0.0/16; };

上面那行配置会允许此 DNS 服务器接收来自其所在的网络(在本例中,我的网络就在我的防火墙之后)和本机的请求。下一步,你需要重启一下 BIND 的服务:


  1. root@test:~# /etc/init.d/bind9 restart
  2. [....] Stopping domain name service...: bind9
    waiting for pid 13209 to die
  3. . ok
  4. [ ok ] Starting domain name service...: bind9.

现在你可以测试一下 nslookup 来确保你的服务正常运行了:


  1. root@test:~# nslookup
  2. > server localhost
  3. Default server: localhost
  4. Address: 127.0.0.1#53
  5. > www.google.com
  6. Server: localhost
  7. Address: 127.0.0.1#53
  8. Non-authoritative answer:
  9. Name: www.google.com
  10. Address: 173.194.33.176
  11. Name: www.google.com
  12. Address: 173.194.33.177
  13. Name: www.google.com
  14. Address: 173.194.33.178
  15. Name: www.google.com
  16. Address: 173.194.33.179
  17. Name: www.google.com
  18. Address: 173.194.33.180

完美!现在你的系统里已经有一个正常的域名服务在工作了,下一步我们来配置一下OpenVPN。

安装并配置 OpenVPN

OpenVPN 是一个运用 SSL/TLS 作为密钥交换的开源 VPN 解决方案。同时它也非常便于在 Linux 环境下部署。配置 OpenVPN 可能有一点点难,不过其实你也不需要在默认的配置文件里做太多修改。首先你需要运行一下 apt-get 来安装 OpenVPN:


  1. root@test:~# apt-get install openvpn
  2. Reading package lists... Done
  3. Building dependency tree
  4. Reading state information... Done
  5. The following extra packages will be installed:
  6. liblzo2-2 libpkcs11-helper1
  7. Suggested packages:
  8. resolvconf
  9. The following NEW packages will be installed:
  10. liblzo2-2 libpkcs11-helper1 openvpn
  11. 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
  12. Need to get 621 kB of archives.
  13. After this operation, 1,489 kB of additional disk space will be used.
  14. Do you want to continue [Y/n]? y

现在 OpenVPN 已经安装好了,你需要去配置它了。OpenVPN 是基于 SSL 的,并且它同时依赖于服务端和客户端两方的证书来工作。为了生成这些证书,你需要在机器上配置一个证书签发(CA)。幸运地,OpenVPN 在安装中自带了一些用于生成证书的脚本比如 “easy-rsa” 来帮助你加快这个过程。你将要创建一个文件目录用于放置 easy-rsa 脚本,从模板目录复制过来:


  1. root@test:~# mkdir /etc/openvpn/easy-rsa
  2. root@test:~# cp -rpv /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

下一步,把 vars 文件复制一个备份:


  1. root@test:/etc/openvpn/easy-rsa# cp vars vars.bak

接下来,编辑一下 vars 以让其中的信息符合你的状态。我将以我需要编辑的信息作为例子:


  1. KEY_SIZE=4096
  2. KEY_COUNTRY="US"
  3. KEY_PROVINCE="CA"
  4. KEY_CITY="Silicon Valley"
  5. KEY_ORG="Linux Journal"
  6. KEY_EMAIL="bill.childers@linuxjournal.com"

下一步是导入(source)一下 vars 中的环境变量,这样系统就能把其中的信息当作环境变量处理了:


  1. root@test:/etc/openvpn/easy-rsa# source ./vars
  2. NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

搭建 CA(证书签发)

接下来你要运行一下 clean-all 来确保有一个清理干净的系统工作环境,紧接着你就要做证书签发了。注意一下我修改了一些 changeme 的所提示修改的内容以符合我需要的安装情况:


  1. root@test:/etc/openvpn/easy-rsa# ./clean-all
  2. root@test:/etc/openvpn/easy-rsa# ./build-ca
  3. Generating a 4096 bit RSA private key
  4. ...................................................++
  5. ...................................................++
  6. writing new private key to 'ca.key'
  7. -----
  8. You are about to be asked to enter information that
  9. will be incorporated into your certificate request.
  10. What you are about to enter is what is called a
  11. Distinguished Name or a DN.
  12. There are quite a few fields but you can leave some
  13. blank. For some fields there will be a default value,
  14. If you enter '.', the field will be left blank.
  15. -----
  16. Country Name (2 letter code) [US]:
  17. State or Province Name (full name) [CA]:
  18. Locality Name (eg, city) [Silicon Valley]:
  19. Organization Name (eg, company) [Linux Journal]:
  20. Organizational Unit Name (eg, section) [changeme]:SecTeam
  21. Common Name (eg, your name or your server's hostname [changeme]:test.linuxjournal.com
  22. Name [changeme]:test.linuxjournal.com
  23. Email Address [bill.childers@linuxjournal.com]:

生成服务端证书

一旦 CA 创建好了,你接着就可以生成客户端的 OpenVPN 证书了:


  1. root@test:/etc/openvpn/easy-rsa# ./build-key-server test.linuxjournal.com
  2. Generating a 4096 bit RSA private key
  3. ...................................................++
  4. writing new private key to 'test.linuxjournal.com.key'
  5. -----
  6. You are about to be asked to enter information that
  7. will be incorporated into your certificate request.
  8. What you are about to enter is what is called a
  9. Distinguished Name or a DN.
  10. There are quite a few fields but you can leave some
  11. blank. For some fields there will be a default value,
  12. If you enter '.', the field will be left blank.
  13. -----
  14. Country Name (2 letter code) [US]:
  15. State or Province Name (full name) [CA]:
  16. Locality Name (eg, city) [Silicon Valley]:
  17. Organization Name (eg, company) [Linux Journal]:
  18. Organizational Unit Name (eg, section) [changeme]:SecTeam
  19. Common Name (eg, your name or your server's hostname) [test.linuxjournal.com]:
  20. Name [changeme]:test.linuxjournal.com
  21. Email Address [bill.childers@linuxjournal.com]:
  22. Please enter the following 'extra' attributes
  23. to be sent with your certificate request
  24. A challenge password []:
  25. An optional company name []:
  26. Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
  27. Check that the request matches the signature
  28. Signature ok
  29. The Subject's Distinguished Name is as follows
  30. countryName :PRINTABLE:'US'
  31. stateOrProvinceName :PRINTABLE:'CA'
  32. localityName :PRINTABLE:'Silicon Valley'
  33. organizationName :PRINTABLE:'Linux Journal'
  34. organizationalUnitName:PRINTABLE:'SecTeam'
  35. commonName :PRINTABLE:'test.linuxjournal.com'
  36. name :PRINTABLE:'test.linuxjournal.com'
  37. emailAddress :IA5STRING:'bill.childers@linuxjournal.com'
  38. Certificate is to be certified until Sep 1 06:23:59 2025 GMT (3650 days)
  39. Sign the certificate? [y/n]:y
  40. 1 out of 1 certificate requests certified, commit? [y/n]y
  41. Write out database with 1 new entries
  42. Data Base Updated

下一步需要用掉一些时间来生成 OpenVPN 服务器需要的 Diffie-Hellman 密钥。这个步骤在一般的桌面级 CPU 上会需要几分钟的时间,但在 ARM 构架的树莓派上,会用掉超级超级长的时间。耐心点,只要终端上的点还在跳,那么一切就在按部就班运行(下面的示例省略了不少的点):


  1. root@test:/etc/openvpn/easy-rsa# ./build-dh
  2. Generating DH parameters, 4096 bit long safe prime,
  3. generator 2
  4. This is going to take a long time
  5. ....................................................+
  6. <省略了不少的点>

生成客户端证书

现在你要生成一下客户端用于登录 OpenVPN 的密钥。通常来说 OpenVPN 都会被配置成使用证书验证的加密方式,在这个配置下客户端需要持有由服务端签发的一份证书:


  1. root@test:/etc/openvpn/easy-rsa# ./build-key bills-computer
  2. Generating a 4096 bit RSA private key
  3. ...................................................++
  4. ...................................................++
  5. writing new private key to 'bills-computer.key'
  6. -----
  7. You are about to be asked to enter information that
  8. will be incorporated into your certificate request.
  9. What you are about to enter is what is called a
  10. Distinguished Name or a DN. There are quite a few
  11. fields but you can leave some blank.
  12. For some fields there will be a default value,
  13. If you enter '.', the field will be left blank.
  14. -----
  15. Country Name (2 letter code) [US]:
  16. State or Province Name (full name) [CA]:
  17. Locality Name (eg, city) [Silicon Valley]:
  18. Organization Name (eg, company) [Linux Journal]:
  19. Organizational Unit Name (eg, section) [changeme]:SecTeam
  20. Common Name (eg, your name or your server's hostname) [bills-computer]:
  21. Name [changeme]:bills-computer
  22. Email Address [bill.childers@linuxjournal.com]:
  23. Please enter the following 'extra' attributes
  24. to be sent with your certificate request
  25. A challenge password []:
  26. An optional company name []:
  27. Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
  28. Check that the request matches the signature
  29. Signature ok
  30. The Subject's Distinguished Name is as follows
  31. countryName :PRINTABLE:'US'
  32. stateOrProvinceName :PRINTABLE:'CA'
  33. localityName :PRINTABLE:'Silicon Valley'
  34. organizationName :PRINTABLE:'Linux Journal'
  35. organizationalUnitName:PRINTABLE:'SecTeam'
  36. commonName :PRINTABLE:'bills-computer'
  37. name :PRINTABLE:'bills-computer'
  38. emailAddress :IA5STRING:'bill.childers@linuxjournal.com'
  39. Certificate is to be certified until Sep 1 07:35:07 2025 GMT (3650 days)
  40. Sign the certificate? [y/n]:y
  41. 1 out of 1 certificate requests certified, commit? [y/n]y
  42. Write out database with 1 new entries
  43. Data Base Updated
  44. root@test:/etc/openvpn/easy-rsa#

现在你需要再生成一个 HMAC 码作为共享密钥来进一步增加整个加密提供的安全性:


  1. root@test:~# openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key

配置服务器

最后,我们到了配置 OpenVPN 服务的时候了。你需要创建一个 /etc/openvpn/server.conf 文件;这个配置文件的大多数地方都可以套用模板解决。设置 OpenVPN 服务的主要修改在于让它只用 TCP 而不是 UDP 链接。这是下一步所必需的---如果不是 TCP 连接那么你的服务将不能工作在端口 443 上。创建/etc/openvpn/server.conf 然后把下述配置丢进去:


  1. port 1194
  2. proto tcp
  3. dev tun
  4. ca easy-rsa/keys/ca.crt
  5. cert easy-rsa/keys/test.linuxjournal.com.crt ## or whatever your hostname was
  6. key easy-rsa/keys/test.linuxjournal.com.key ## Hostname key- This file should be kept secret
  7. management localhost 7505
  8. dh easy-rsa/keys/dh4096.pem
  9. tls-auth /etc/openvpn/certs/ta.key 0
  10. server 10.8.0.0 255.255.255.0 # The server will use this subnet for clients connecting to it
  11. ifconfig-pool-persist ipp.txt
  12. push "redirect-gateway def1 bypass-dhcp" # Forces clients to redirect all traffic through the VPN
  13. push "dhcp-option DNS 192.168.1.1" # Tells the client to use the DNS server at 192.168.1.1 for DNS - replace with the IP address of the OpenVPN machine and clients will use the BIND server setup earlier
  14. keepalive 30 240
  15. comp-lzo # Enable compression
  16. persist-key
  17. persist-tun
  18. status openvpn-status.log
  19. verb 3

最后,你将需要在服务器上启用 IP 转发,配置 OpenVPN 为开机启动,并立刻启动 OpenVPN 服务:


  1. root@test:/etc/openvpn/easy-rsa/keys# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
  2. root@test:/etc/openvpn/easy-rsa/keys# sysctl -p /etc/sysctl.conf
  3. net.core.wmem_max = 12582912
  4. net.core.rmem_max = 12582912
  5. net.ipv4.tcp_rmem = 10240 87380 12582912
  6. net.ipv4.tcp_wmem = 10240 87380 12582912
  7. net.core.wmem_max = 12582912
  8. net.core.rmem_max = 12582912
  9. net.ipv4.tcp_rmem = 10240 87380 12582912
  10. net.ipv4.tcp_wmem = 10240 87380 12582912
  11. net.core.wmem_max = 12582912
  12. net.core.rmem_max = 12582912
  13. net.ipv4.tcp_rmem = 10240 87380 12582912
  14. net.ipv4.tcp_wmem = 10240 87380 12582912
  15. net.ipv4.ip_forward = 0
  16. net.ipv4.ip_forward = 1
  17. root@test:/etc/openvpn/easy-rsa/keys# update-rc.d openvpn defaults
  18. update-rc.d: using dependency based boot sequencing
  19. root@test:/etc/openvpn/easy-rsa/keys# /etc/init.d/openvpn start
  20. [ ok ] Starting virtual private network daemon:.

配置 OpenVPN 客户端

客户端的安装取决于客户端的操作系统,但你需要将之前生成的证书和密钥复制到你的客户端上,并导入你的 OpenVPN 客户端并新建一个配置文件。每种操作系统下的 OpenVPN 客户端在操作上会有些稍许不同,这也不在这篇文章的覆盖范围内,所以你最好去看看特定操作系统下的 OpenVPN 文档来获取更多信息。请参考本文档里的资源那一节。

安装 SSLH —— "魔法"多协议切换工具

本文章介绍的解决方案最有趣的部分就是运用 SSLH 了。SSLH 是一个多重协议工具——它可以监听 443 端口的流量,然后分析他们是 SSH,HTTPS 还是 OpenVPN 的通讯包,并把它们分别转发给正确的系统服务。这就是为何本解决方案可以让你绕过大多数端口封杀——你可以一直使用 HTTPS 通讯,因为它几乎从来不会被封杀。

同样,直接 apt-get 安装:


  1. root@test:/etc/openvpn/easy-rsa/keys# apt-get install sslh
  2. Reading package lists... Done
  3. Building dependency tree
  4. Reading state information... Done
  5. The following extra packages will be installed:
  6. apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common
  7. libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libconfig9
  8. Suggested packages:
  9. apache2-doc apache2-suexec apache2-suexec-custom openbsd-inetd inet-superserver
  10. The following NEW packages will be installed:
  11. apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common
  12. libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libconfig9 sslh
  13. 0 upgraded, 11 newly installed, 0 to remove and 0 not upgraded.
  14. Need to get 1,568 kB of archives.
  15. After this operation, 5,822 kB of additional disk space will be used.
  16. Do you want to continue [Y/n]? y

在 SSLH 被安装之后,包管理器会询问要在 inetd 还是 standalone 模式下允许。选择 standalone 模式,因为你希望 SSLH 在它自己的进程里运行。如果你没有安装 Apache,apt 包管理器会自动帮你下载并安装的,尽管它也不是完全不可或缺。如果你已经有 Apache 了,那你需要确保它只监听 localhost 端口而不是所有的端口(不然的话 SSLH 会无法运行,因为 443 端口已经被 Apache 监听占用)。安装后,你会看到一个如下所示的错误信息:


  1. [....] Starting ssl/ssh multiplexer: sslhsslh disabled, please adjust the configuration to your needs
  2. [FAIL] and then set RUN to 'yes' in /etc/default/sslh to enable it. ... failed!
  3. failed!

这其实并不是错误信息,只是 SSLH 在提醒你它还未被配置所以无法启动,这很正常。配置 SSLH 相对来说比较简单。它的配置文件放置在 /etc/default/sslh,你只需要修改 RUN 和 DAEMON_OPTS 变量就可以了。我的 SSLH 配置文件如下所示:


  1. # Default options for sslh initscript
  2. # sourced by /etc/init.d/sslh
  3. # Disabled by default, to force yourself
  4. # to read the configuration:
  5. # - /usr/share/doc/sslh/README.Debian (quick start)
  6. # - /usr/share/doc/sslh/README, at "Configuration" section
  7. # - sslh(8) via "man sslh" for more configuration details.
  8. # Once configuration ready, you *must* set RUN to yes here
  9. # and try to start sslh (standalone mode only)
  10. RUN=yes
  11. # binary to use: forked (sslh) or single-thread (sslh-select) version
  12. DAEMON=/usr/sbin/sslh
  13. DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --openvpn 127.0.0.1:1194 --pidfile /var/run/sslh/sslh.pid"

保存编辑并启动 SSLH:


  1. root@test:/etc/openvpn/easy-rsa/keys# /etc/init.d/sslh start
  2. [ ok ] Starting ssl/ssh multiplexer: sslh.

现在你应该可以从 443 端口 ssh 到你的树莓派了,它会正确地使用 SSLH 转发:


  1. $ ssh -p 443 root@test.linuxjournal.com
  2. root@test:~#

SSLH 现在开始监听端口 443 并且可以转发流量信息到 SSH、Apache 或者 OpenVPN ,这取决于抵达流量包的类型。这套系统现已整装待发了!

原文发布时间为:2016-07-09

本文来自合作伙伴“Linux中国”

时间: 2024-09-22 21:27:23

Securi-Pi:使用树莓派作为安全跳板的相关文章

【合集】用Raspberry Pi(树莓派)打造各种服务器

[合集]用Raspberry Pi(树莓派)打造各种服务器 Raspberry Pi(树莓派)有很多的应用,其中搭建服务器是大家应用比较多的,今天就整理一个合集用Raspberry Pi(树莓派)打造各种服务器.欢迎大家提出宝贵意见,更欢迎大家补充您用树莓派所做的好玩的应用! [教程] 将树莓派变成网络打印机服务器(更新PC和手机端设置)!http://www.eeboard.com/bbs/thread-8818-1-1.html[心得] [分享]用树莓派构建你自己的微型服务器,可以外网访问h

Arduino 与 Raspberry Pi: 哪个是更适合你的DIY平台?

Arduino 与 Raspberry Pi: 哪个是更适合你的DIY平台? 你想做硬件DIY吗?它们哪个更适合你? 如果你很熟悉电子DIY,那么应该听过Arduino和Raspberry Pi(树莓派)的特点对比.你也许甚至会猜测到,像我之前认为的,它们两个是处理相似问题的相互竞争的硬件平台. 实际上,Arduino和树莓派非常不一样.对于初学者来说,树莓派是一台完整功能的计算机,而Arduino只是一个微控制器,它仅仅是组成计算机的一个模块. 这里有一些指引来帮助你区分Arduino和树莓派

《开源硬件创客——15个酷应用玩转树莓派》——导读

前言 开源硬件创客--15个酷应用玩转树莓派 最近,在爱范儿上有篇文章<树莓派为什么这么火>.它的开头是这么一句话"3年售出500万台Raspberry Pi,树莓派基金会成为了英国最大的计算机制造商".短短3年时间,树莓派从原来的小众开源爱好者的"玩具"渐渐走入了"寻常百姓家",其版本从最初的Model-A到B再到B+和A+,版本升级带来的是更加强大的功能.而在正式推出的第二代产品--Pi 2中,处理器升级到了四核,速度比第一代快6

树莓派最主要制造商以 8.7 亿美元的身价被收购

相比微软前天深夜 262 亿美元的大手笔,8.7 亿美元着实不算什么. 这则新闻的两位主角分别是 PremierFarnell PLC 和 Daetwyler Holding AG,后者以 8.7 亿美元的总价对前者进行了收购.也许你看到这里就该倒退或者退出了,但假如我告诉你前者是目前全球最便宜电脑 Raspberry Pi(树莓派)的最主要制造商呢? PremierFarnell 和树莓派 Raspberry Pi 实际由 Raspberry Foundation(树莓派基金会)这一非盈利组织

GSM Hacking:使用BladeRF、树莓派、YatesBTS搭建便携式GSM基站

每次看到黑客在网上发布的那些GSM技术相关文章我都十分惊讶.然而在没有Software Defined Radios (SDRs)之前,玩GSM并不便宜,除此之外想要好好玩你得下大功夫. 拓展阅读 GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站 极客DIY:如何构建一台属于自己的基站 在阅读多篇有关GSM基站的文章之后,我注意到有关GSM基站这个话题有许多的不一致或者是讲的不够细致. 基于这一点,我决定写下今天这篇文章,进行手把手教学. 在文章开始之前,我要感谢所有

怎么估算空间利用率?新研发传感器分分钟搞定!

据麦姆斯咨询报道,研究人员已设计出集成声音和运动传感器的物联网(IoT)网络,用以估算公共空间利用率.这些想法可以应用于其它物联网传感器网络. <智慧城市中传感器与公共空间利用率监测的融合>(Sensor Fusion for Public Space Utilization Monitoring in a Smart City)是物联网产品设计人员.开发人员和实施人员的最佳读物.它通过设计系统来测量城市的空间利用率,权衡传感器选择和校准.电源选择.网络设计.数据清理和规范化.以及数据处理等各

物联网竞争硝烟已起 科技巨头系统较量升级

5月25日,作为全球规模最大的消费科技产品交易会之一的CES 首度登陆亚洲,正式在上海新国际博览中心举行.中国移动在本届展会上发布了"OneNet设备云平台"和"物联网专网业务管理平台"两大物联网开放平台.OneNet设备云平台专供智能设备,是介于终端和应用直接的云服务和信息处理平台,具备数据处理好模块化应用能力可为物联网企业提供多种协议的接入支持.物联网专网业务管理平台则是一个管理遍布全球的数据卡的综合性平台,无论是在全国甚至全球的任何地方,只要接入了网络,都可以

站在泡沫之巅的可穿戴设备

在科技行业,人人都希望自己站在浪潮之巅,大部分时候却在泡沫之巅. 厂家是这样.极客们是这样.媒体也是这样. 在2014年的美国CES展会,我溜达完一圈后,最大的感受是,如果非要为每年的CES加个关键词,"可穿戴设备"当仁不让. 这个至少已经风行了五年的科技概念,在全产业链条的各巨头公司正式加入后,终于半只脚踏入了大众的视野. 只是,泡沫依然横行. 泡沫一:创客改变世界 <创客>一书已经流行起来了,硬件中的极客们人手一本<创客>,志得意满,好比文艺青年抱着海子诗集

《Effective Debugging:软件和系统调试的66个有效方法》——第7条:试着用多种工具构建软件,并将其放在不同的环境下执行

第7条:试着用多种工具构建软件,并将其放在不同的环境下执行 有时我们可以通过改变环境来锁定一些难以捕获的bug.例如,我们可以用另外一款编译器来构建这个软件,也可以切换到其他的运行时解释器.虚拟机.中间件.操作系统或CPU架构上.由于那些环境可能会更加严格地检查输入数据,或能通过其结构来凸现程序中的错误(参见第17条),因此可以帮助我们发现原来很难找到的一些bug.如果程序不够稳定.总是发生无法重现的崩溃问题,或移植起来不太顺利,那就应该试着把它放在另外一种环境下进行测试,这使得我们能够使用更为