0%

树莓派配合frp内网穿透及ADS-B信号捕获的应用

通常情况下对于公网环境下访问局域网设备的需求而言,其解决方案有使用动态域名解析DDNS以及各种内网穿透工具(如Frp,Ngrok等等)。对于DDNS方式和Frp而言,两种方式各有千秋。首先对于动态域名解析,其基本要求是本地网关设备能够获取到运营商提供的公网IPv4地址,这对大多数中国移动宽带和部分地区中国电信宽带用户而言或许会有一些困扰;对于Frp内网穿透方式则无需苛刻的条件,只需要一台具有公网IPv4地址的服务器即可,进而间接的通过该服务器建立公网到局域网的逻辑链路访问。

frp相关配置

首先先给出frp中文文档的Github地址,简而言之,frp是一个可用于内网穿透的高性能的反向代理应用,支持tcp,udp协议,并且为http和https应用协议提供了额外的能力,其中对于http协议的内网穿透还支持配置用户名和密码以保证安全。
服务器端安装frp,服务器端为x86 64位主机,需要选择例如“frp_0.34.3_linux_amd64.tar.gz”字样的安装包,复制链接地址,wget直接下载到当前目录,并使用tar -zxvf frp_0.34.3_linux_amd64.tar.gz解压该软件包即可。倘若此时就希望运行frp测试是否可以启动成功,可以运行./frps -c frps.ini以测试。
其次对于服务器上运行的frp,通常情况下是需要后台持续运行该进程的,可以用screen窗口来维持frp后台,这里我更推荐将frp写入系统的service服务中去,既可以后台运行,又可以开机自启,感谢这位Youtuber司波图给予的灵感。

下面给出frp.service的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#服务器运行服务创建
vi /lib/systemd/system/frps.service

#Frps服务命令
[Unit]
Description=fraps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/root/frp/frps -c /root/frp/frps.ini
#此处安实际情况修改,该路径为frp安装目录。

[Install]
WantedBy=multi-user.target

之后需要注册服务以及配置开机自启,命令如下:

1
2
3
4
5
6
7
#frp注册服务
systemctl start frps
systemctl enable frps
#倘若有需要查看该frp服务状态
service frps status
#查看后台正在运行的进程
ps -auxw

下面给出frps服务端配置文件frps.ini中的内容以供参考:

1
2
3
4
5
6
7
8
9
10
[common]
bind_port = 7000
token = ***
vhost_http_port = 7080
vhost_https_port = 7443
dashboard_port = 7001
dashboard_user = root
dashboard_pwd = ***
tcp_mux = true
max_pool_count = 10

配置完成服务器端的frps后,便是配置客户端中的详细参数了。由于本人的frp客户端是OpenWRT软路由GUI图形界面,参考意义不大,重要的是设置好需要映射的本地端口和密码即可,故配置略。

树莓派相关配置

树莓派家族的硬件设备有官方提供的镜像,也可以刷入Debian/Ubuntu系列的第三方镜像,其实官方提供的树莓派Raspberry Pi Buster系统号称可以兼容所有树莓派板子型号,其系统也是基于Debian开发而来。
首先下载Raspberry Pi Buster,之后将此.img文件/镜像刷入SD卡中,我使用的刷入软件名为:balenaEtcher,看官们也可以选择你所熟悉和顺手的软件。
之后在boot分区下新建一个空文件,名为ssh,就可以开启SSH命令行登录,再在boot分区下新建wpa_supplicant.conf文件,并写入无线的相关配置。为了不泄漏信息,下面只是示例,可以同时配置多个无线网络。当然,我们也可以直接使用RJ-45网线接入路由器,进入路由器后台查看该树莓派设备的IP地址,进行IP地址和MAC地址的绑定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="wifi名"
psk="wifi密码"
key_mgmt=WPA-PSK #加密方式
priority=1 #优先级
}
network={
ssid="another wi-fi name here"
psk="another wi-fi password here"
key_mgmt=WPA-PSK
}

倘若你有LCD 3.5英寸的显示屏(40个针脚,该LCD需要占用26个针脚)的话,可以使用以下命令安装LCD驱动并开启显示屏(树莓派默认是由HDMI输出视频信号),倘若出现屏幕图像反转等问题,可以查看详细配置

1
2
3
4
5
6
7
8
9
10
#在线安装方式
git clone https://github.com/waveshare/LCD-show.git
cd LCD–show/
sudo ./LCD35–show
#离线安装方式
wget http://www.lcdwiki.com/res/RaspDriver/LCD-show.tar.gz
#将文件拷贝到boot目录下,进行解压缩
cd /boot
sudo tar zxvf LCD-show.tar.gz
cd LCD-show/

ADS-B相关配置

本次配置需要用到的软件为Mode-S Beast开源驱动,要从源码编译打包的软件有beast-splitter和dump1090-fa,此外还需要编译安装作为dump1090依赖项而存在的bladeRF。
首先准备编译的环境:

1
2
3
#默认使用pi用户登录,而非root用户
pi@raspberrypi:~$ sudo apt update && apt-get upgrade
pi@raspberrypi:~$ sudo apt install -y git cmake build-essential debhelper librtlsdr-dev pkg-config dh-systemd libncurses5-dev libboost-system-dev libboost-program-options-dev libboost-regex-dev libusb-1.0-0-dev doxygen libtecla-dev libtecla1 help2man pandoc

而后将所需的源码拉取到本地,考虑到Github在国内的访问体验,故本次操作所需的代码拉取是导入Gitee后再进行的拉取操作。

1
2
3
pi@raspberrypi:~$ git clone https://gitee.com/turbulance/bladeRF ~/src/bladeRF
pi@raspberrypi:~$ git clone https://gitee.com/turbulance/beast-splitter ~/src/beast-splitter
pi@raspberrypi:~$ git clone https://gitee.com/turbulance/dump1090 ~/src/dump1090

进入 beast-splitter 的源码目录,然后通过 dpkg 生成 deb 包。

1
2
pi@raspberrypi:~$ cd ~/src/beast-splitter
pi@raspberrypi:~/src/beast-splitter$ dpkg-buildpackage -b --no-sign

生成的 deb 位于上级目录,安装 beast-splitter_3.8.0_armhf.deb 即可。

1
pi@raspberrypi:~/src/beast-splitter$ sudo dpkg --install ../beast-splitter_3.8.0_armhf.deb

而后将Mode-S Beast与天线和树莓派连接,启动 beast-spliter。

1
pi@raspberrypi:~/src/beast-splitter$ sudo systemctl start beast-splitter

倘若一切情况正常,应该可以看到绿色指示灯不断闪烁,可以看到/dev目录多出了一个名为beast的设备。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pi@raspberrypi:~/src/beast-splitter$ ls /dev
autofs input null serial tty23 tty44 tty8 vcsa3
beast kmsg ppp shm tty24 tty45 tty9 vcsa4
block log ptmx snd tty25 tty46 ttyAMA0 vcsa5
btrfs-control loop0 pts stderr tty26 tty47 ttyprintk vcsa6
bus loop1 ram0 stdin tty27 tty48 ttyUSB0 vcsm
cachefiles loop2 ram1 stdout tty28 tty49 ttyUSB1 vcsm-cma
char loop3 ram10 tty tty29 tty5 uhid vcsu
console loop4 ram11 tty0 tty3 tty50 uinput vcsu1
cpu_dma_latency loop5 ram12 tty1 tty30 tty51 urandom vcsu2
cuse loop6 ram13 tty10 tty31 tty52 v4l vcsu3
disk loop7 ram14 tty11 tty32 tty53 vchiq vcsu4
fb0 loop-control ram15 tty12 tty33 tty54 vcio vcsu5
fd mapper ram2 tty13 tty34 tty55 vc-mem vcsu6
full media0 ram3 tty14 tty35 tty56 vcs vhci
fuse mem ram4 tty15 tty36 tty57 vcs1 video10
gpiochip0 memory_bandwidth ram5 tty16 tty37 tty58 vcs2 video11
gpiochip1 mmcblk0 ram6 tty17 tty38 tty59 vcs3 video12
gpiochip2 mmcblk0p1 ram7 tty18 tty39 tty6 vcs4 watchdog
gpiochip3 mmcblk0p2 ram8 tty19 tty4 tty60 vcs5 watchdog0
gpiochip4 mqueue ram9 tty2 tty40 tty61 vcs6 zero
gpiomem net random tty20 tty41 tty62 vcsa
hwrng network_latency raw tty21 tty42 tty63 vcsa1
initctl network_throughput rfkill tty22 tty43 tty7 vcsa2

安装好了Beast的驱动,已经成功了一半,接下来是编译打包bladeRF和dump1090-fa。前面已经提到,dump1090-fa依赖于bladeRF,所以先要安装bladeRF才能编译dump1090-fa。

1
2
3
4
5
6
pi@raspberrypi:~/src/beast-splitter$ cd ~/src/bladeRF
pi@raspberrypi:~/src/beast-splitter$ git checkout 2017.12-rc1
pi@raspberrypi:~/src/bladeRF$ dpkg-buildpackage -b --no-sign
pi@raspberrypi:~/src/bladeRF$ sudo dpkg --install ../libbladerf1_2017.07_armhf.deb
pi@raspberrypi:~/src/bladeRF$ sudo dpkg --install ../libbladerf-dev_2017.07_armhf.deb
pi@raspberrypi:~/src/bladeRF$ sudo dpkg --install ../libbladerf-udev_2017.07_armhf.deb

在安装好bladeRF过后,就可以编译dump1090-fa了。

1
2
pi@raspberrypi:~/src/bladeRF$ cd ~/src/dump1090
pi@raspberrypi:~/src/dump1090$ dpkg-buildpackage -b --no-sign

由于dump1090-fa 依赖于lighttpd 工作,所以安装打包好的dump1090-fa之前还要先安装lighttpd,否则会报错。

1
pi@raspberrypi:~/src/dump1090$ sudo apt install -y lighttpd

接下来才是安装 dump1090-fa。

1
pi@raspberrypi:~/src/dump1090$ sudo dpkg --install ~/src/dump1090-fa_3.8.0_armhf.deb

最后重启设备即可。

1
pi@raspberrypi:~/src/dump1090$ sudo reboot

待到机器重启完毕后,打开http://[树莓派 IP]:80/dump1090-fa/或者IP:8080即可看到实时的 ADS-B 资讯。
假如你有修改GPS坐标的需求,则需要修改 /etc/default/dump1090-fa,该文件是dump1090的配置文件。

1
root@pi:/home# vi /etc/default/dump1090-fa

首先配置dump1090开机启动,直接将配置文件中ENABLED字段赋值为yes即可。
考虑到经纬度设置及隐私问题安全,可以填一个大致的位置,所以在 DECODER_OPTIONS 字段加入 –lat 41.00 –lon 112.00这样一句话。
综合上述要求,这里给出一个配置文件示范,详细可参考RTL-SDR的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# dump1090-fa configuration
# This is sourced by /usr/share/dump1090-fa/start-dump1090-fa as a
# shellscript fragment.

# If you are using a PiAware sdcard image, this config file is regenerated
# on boot based on the contents of piaware-config.txt; any changes made to this
# file will be lost.

# dump1090-fa won't automatically start unless ENABLED=yes
ENABLED=yes

RECEIVER_OPTIONS="--device-index 1 --gain 50 --ppm 0"
DECODER_OPTIONS="--lat 33.000 --lon 118.000 --max-range 360 --fix"
NET_OPTIONS="--net --net-heartbeat 60 --net-ro-size 1300 --net-ro-interval 0.2 --net-ri-port 0 --net-ro-port 30002 --net-sbs-port 30003 --net-bi-port 30004,30104 --net-bo-port 30005"
JSON_OPTIONS="--json-location-accuracy 1"

------
# dump1090-fa configuration
# This is sourced by /usr/share/dump1090-fa/start-dump1090-fa as a
# shellscript fragment.

# If you are using a PiAware sdcard image, this config file is regenerated
# on boot based on the contents of piaware-config.txt; any changes made to this
# file will be lost.

# dump1090-fa won't automatically start unless ENABLED=yes
ENABLED=yes

#DECODER_OPTIONS="--lat <env1> --lon <env2> --max-range 360"
DECODER_OPTIONS="--lat 35.8 --lon 125.3 --max-range 360"
NET_OPTIONS="--net --net-heartbeat 60 --net-ro-size 1000 --net-ro-interval 1 --net-http-port 0 --net-ri-port 0 --net-ro-port 30002 --net-sbs-port 30003 --net-bi-port 30004,30104"
JSON_OPTIONS="--json-location-accuracy 2"
RECEIVER_OPTIONS="--net-only --net-bo-port 0 --fix"

Nginx反向代理相关配置

每一次进行frp内网穿透时,总是需要进行输入IP地址和高位端口,甚是麻烦和不方便记忆,所以我能想到的一种方法便是利用Nginx的proxy_pass参数进行反向代理本地端口进行内网穿透,并且在frp使用http的用户名和密码验证的情况下,使用https配合CDN以达到更高效更便捷的访问。
下面直接给出Nginx vhost配置文件示例:(该文件中所以相关设置已经经过本人实际检验)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
server
{
listen 80;
server_name ***;
#http重定向到https
if ($scheme = http ) {
return 301 https://$host$request_uri;
}
location /{
proxy_pass http://127.0.0.1:7080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}

access_log /home/wwwlogs/***.log;
}

server
{
listen 443 ssl http2;
server_name ***;

ssl_certificate /usr/local/nginx/conf/ssl/**.com/***.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/**.com/***.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_session_cache builtin:1000 shared:SSL:10m;
# openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;


location / {
#关于frp与Nginx配合使用的问题:https://blog.csdn.net/rfrftt/article/details/89317529
#https://www.v2ex.com/t/378393
proxy_pass http://127.0.0.1:7080/;
proxy_ssl_server_name on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
#防止出现https页面中包含http不安全链接问题
add_header Content-Security-Policy upgrade-insecure-requests;
}

access_log /home/wwwlogs/***.log;
}
  • 本文作者: 夜阑听烟雨
  • 本文链接: https://blog.kixcs.com/archives/adb7/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!