Raspberry Pi 4:将树莓派作为网桥使用

概述

由于家里网线布局问题,只有一条网线能够到达我卧室,但是PC和树莓派均需要网线上网,因此,一个奇怪的需求诞生了:

  • 给树莓派加一个USB网卡
  • 将USB网卡和树莓派自身网卡桥接
  • PC直连树莓派USB网卡,树莓派网卡直连路由器
  • PC通过树莓派的网卡桥接进行上网

需求

  • 树莓派
  • USB网卡
  • 网线

准备操作

首先,我们可以将树莓派连上Wifi,防止在之后的网络真空期不能使用SSH连接树莓派。

创建网桥

这里,我们将直接通过配置文件的方式,在/etc/systemd/network文件夹下创建多个文件,让树莓派在重启后能够自动创建相关的网络设备。

  • br-lan.netdev:自动创建网桥
[NetDev]
Name=br-lan
Kind=bridge
  • br-lan.network:配置网桥的网络,打开DHCP
[Match]
Name=br-lan
[Network]
DHCP=yes
DNSSEC=no
  • en.network:USB网卡接入网桥
[Match]
Name=en*
[Network]
DHCP=no
DNSSEC=no
Bridge=br-lan
  • eth.network:树莓派网卡接入网桥
[Match]
Name=eth*
[Network]
DHCP=no
DNSSEC=no
Bridge=br-lan

完成以上几个文件后,在树莓派重启后将会自动完成网桥的建立。但是,现在先别重启,还需要对iptables进行转发配置。

备注

树莓派接入更多网卡之后,可能需要编辑/usr/lib/systemd/system/systemd-networkd-wait-online.service,忽略树莓派本身网卡eth0和USB网卡:

ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --ignore eth0 --ignore enp1s0u1u2

不然可能出现systemd-netword-wait-online启动超时的问题。

iptables

增加网桥转发规则,并持久化

# iptables -I FORWARD_direct -i br-lan -o br-lan -j ACCEPT
# iptables-save > /etc/iptables/iptables.rules
# systemctl enable iptables

如果有IPv6环境,也需要进行配置:

# ip6tables -I FORWARD_direct -i br-lan -o br-lan -j ACCEPT
# ip6tables-save > /etc/iptables/ip6tables.rules
# systemctl enable ip6tables

结果

最后,重启树莓派,我们的电脑就能够通过树莓派连接到路由器,通过路由器的DHCP获得IP地址上网了,同时,树莓派上的网桥br-lan也能够通过DHCP获取到树莓派的IP地址。

参考

Raspberry Pi 4:使用bluez和bluealsa,将树莓派改造为蓝牙音箱

概述

家里有个不带蓝牙的音箱,而带蓝牙的小爱同学Mini又居然是单声道,因此,为了让音箱能连上蓝牙,只能掏出我珍藏已久的树莓派4了。
我的Raspberry Pi 4装的是ArchLinux AArch64,至于别的发行版不是很清楚,不过应该可以作为参考使用

安装

bluez

可以使用pacman或者yay等其他包管理直接安装(官方源就有)

bluez-alsa-git

这个包仅在AUR源有,我使用的是yay,因此能够直接安装。
也可以通过以下步骤手动编译安装:

  • git clone https://aur.archlinux.org/bluez-alsa-git.git
  • makepkg -sri

配置

config.txt

树莓派默认是未启动Bluetooth蓝牙和Audio音频功能的,我们需要在/boot/config.txt内增加以下语句来打开蓝牙和音频,并强制将音频输出改为3.5mm接口:

dtparam=krnbt=on,audio=on
audio_pwm_mode=2
hdmi_drive=1
hdmi_ignore_edid_audio=1

bluez

首先,我们需要设置bluetooth.service为自启动:

  • sudo systemctl enable bluetooth

然后,编辑/etc/bluetooth/main.conf,修改以下选项来实现蓝牙设备的开机自启:

[General]
Name = RaspberryPi4     # 可以改为自己的设备名称
DiscoverableTimeout = 0
Discoverable = true     # 默认开启可发现模式(实测可能没用)
[Policy]
AutoEnable = true       # 自动启动蓝牙设备

bluez-alsa

接下来,我们需要对bluez-alsa进行配置。
编辑/etc/default/bluealsa

OPTIONS="-p a2dp-source -p a2dp-sink -p hfp-hf -p hfp-ag -p hsp-hs -p hsp-ag"

这一步的作用是设置bluez-alsa的默认支持配置。
之后,我们编辑/etc/dbus-1/system.d/bluealsa.conf,在其中的<policy user="root">下增加两行:

<allow send_destination="org.bluealsa.sink" />
<allow send_destination="org.bluealsa.source" />

然后我们设置bluez-alsa自启动:

sudo systemctl enable bluealsa.service

为了能够让bluealsa-aplay自启动,我们还需要增加一个/usr/lib/systemd/system/bluealsa-aplay.service服务:

[Unit]
Description=Bluealsa Aplay daemon
Documentation=https://github.com/Arkq/bluez-alsa/
After=bluealsa.service
Requires=bluealsa.service

[Service]
Type=simple
ExecStart=/usr/bin/bluealsa-aplay
Restart=on-failure

[Install]
WantedBy=bluetooth.target

这个服务用于将我们蓝牙传输的音频,发送到ALSA设备:

sudo systemctl enable bluealsa-aplay

最后,重启树莓派。

连接蓝牙

树莓派重启后,先给自己当前用户增加bluez的用户组lp

sudo usermod -a -G lp ricky

通过bluetoothctl,进行蓝牙配置:

$ sudo bluetoothctl
[Bluetooth] discoverable on

然后手机搜索并连接树莓派蓝牙,期间会出现几个(yes/no)的询问,一致yes就行。
最后,设置信任设备:

[Bluetooth] trust xx:xx:xx:xx

这样,我们就可以将手机通过蓝牙连接到树莓派播放音乐了。

参考

使用frp配置内网穿透

0x00 缘由

最近Oray的花生壳需要实名才能使用(就很难受)。然后在网上搜了一波发现一挺好用的工具frp

0x01 获得frp服务端

从Github上frp的Release下载最新的版本Release
其中的frps就是服务端本体,frps_full.ini是完全版本的服务端配置。(感觉在linux服务器上看到.ini文件瞬间出戏233)

0x02 配置frp服务端

在这里,frps_full.ini配置文件以及写的很清楚了,只有以下几项需要注意下:
* dashboard: 配置里,user和password最好都改一下
* log_file: 这项若是被注释掉,那么将会将所有日志直接输出在控制台里
* privilege_token: 这项是密钥,只有相同密钥的frp才能连接。
* privilege_allow_ports: 允许使用的端口,可以按照现有形式来自定义下。
* subdomain_host: 服务器使用的域名,其他web服务可以设置二级域名。

0x03 配置frp客户端

首先,是客户端的通用配置

server_addr = 服务器ip
server_port = 服务器端口
privilege_token = 服务器密钥
user = 客户端名称
protocol = 服务器协议(tcp或者kcp)
login_fail_exit = false表示自动重试
start = 启动的配置

接下来是最简单的配置(例如RDP)

[rdp]   #不要使用common
type = tcp  #使用的协议
local_ip = 127.0.0.1    #本地ip,可以是本机,也可以是局域网内其他ip
local_port = 3389   #RDP端口
use_encryption = true   #使用加密
use_compression = true  #使用压缩

对于一些内网web服务,可以这样配置

[web]
type = http #Web服务类型,可以是https
local_port = 80 #http端口,https为443
subdomain = web #可以使用web.servername.com直接访问内网服务

0x04 总结

frp的潜力还很大,准备用其将自己的各个设备串联在一起(例如树莓派什么的)。相对于ngrok,开源的1.x版本和frp比起来还是没有这么方便。当然,希望frp能够提供更多的流量加密算法,以及TLS?

Raspberry(树莓派) 2 B 之搭建Minecraft服务器

被某盘威胁,所以有了这篇教程。
那么,开始咯!
首先呢,我们要搭建的是Kcauldron服务端。这个服务端呢,可以同时加载Mod和插件,所以是比较好用的。
但是,因为更新略慢,所以最新只有到1.7.10版本。

Kcauldron的下载地址

QQ图片20151010160045.png

如图,下载这两个,然后解压到同一个文件夹内。
接下来,通过以下代码来开启服务器。

java-Xmx1024M -Xms1024M -jar Kcauldron-*

其中的内存占用部分可以按需更改,不过不要太小。
第一次开完服务器,他会在文件夹内新建很多东西,所以有点慢。
当开启成功后,输入stop停止服务端。
然后,可以看到在文件夹里面有一个叫做server.properties的文件。
打开编辑它。

#Minecraft server properties
#Fri Oct 09 10:25:57 UTC 2015
generator-settings=
op-permission-level=4
allow-nether=true
level-name=world
enable-query=false
allow-flight=false                    //是否允许飞行
announce-player-achievements=true
server-port=25565                    //服务器端口号,默认25565
level-type=DEFAULT
enable-rcon=false
force-gamemode=false
level-seed=
server-ip=                            //服务器IP,留空就是本机IP
max-build-height=256
spawn-npcs=true
white-list=false
spawn-animals=true                //是否生成动物
snooper-enabled=true
hardcore=false                    //极限模式
online-mode=false                //这项是正版认证,必须关掉不然盗版玩不了
resource-pack=
pvp=true
difficulty=1
enable-command-block=false
player-idle-timeout=0
gamemode=0                        //默认游戏模式
max-players=20                    //最大玩家数
spawn-monsters=true
view-distance=10                   //服务器视距
generate-structures=true        
motd=A Minecraft Server            //服务器名称(中文需插件)

最重要的就是把online-mode改为false,其他可以以后再看。

然后,服务端根目录下有一个plugins文件夹。将需要使用的插件放进去即可。
还有一个mods文件夹,将要用的mods放进去即可。
最后,再来一遍

java-Xmx1024M -Xms1024M -jar Kcauldron-*

服务器搞定!

那么,现在来一点插件。
首先,权限管理和基础插件推荐Essentials

Essentials下载

下载完,解压全部扔plugins文件夹就好。

至于其他的插件,可以在
http://dev.bukkit.org/bukkit-plugins

http://www.mcbbs.net/
找到。

Raspberry(树莓派) 2 B 之内网穿透

想在树莓派上开一个Minecraft服务器来试试性能(zuosi),但是,有一个问题。
因为,树莓派是放在校园网里面的,没有公网IP。所以外网的人就访问不了我的服务器。
刚好,我有一台Aliyun的服务器,有公网IP。那么,我们就可以利用SSH端口转发来实现内网穿透!

首先,我们来看几条命令:

ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host

参数解释:

-R port:host:hostport

将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

-L port:host:hostport

将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

-f Fork into background after authentication.

后台认证用户/密码,通常和-N连用,不用登录到远程主机。

-C Enable compression.

压缩数据传输。

-N Do not execute a shell or command.

不执行脚本或命令,通常与-f连用。

好吧,如果懒得看的话,那么下面简单解释下:
无标题.png

树莓派的25565端口转发到公网服务器B的25566端口,再在公网服务器内部将端口25565转发到端口25566,这也就意味着,只要客户端访问服务器B的25565端口,那么流量就会被转发到B:25566端口,进而转发到A:25565

有木有很绕?其实就两行命令的事情:
首先,在树莓派上输入:

ssh -NfR *:25566:127.0.0.1:25565 服务器B的用户名@服务器B的IP -p 22

然后输入密码,如果成功就会在后台运行ssh

然后,再在服务器B上运行:

ssh -CNfg -L 25565:localhost:25566 服务器B的用户名@localhost

一样,输入密码,搞定!
这样就可以通过访问服务器B的IP:25565来连接我们的MC服务器了!

Raspberry(树莓派) 2 B 之Kali系统进行pppoe拨号上网

首先,我们得下载pppoe的拨号软件,rp-pppoe(人品拨号)

wget https://www.roaringpenguin.com/files/download/rp-pppoe-3.11.tar.gz
tar -zvxf rp-pppoe-3.11.tar.gz
cd rp-pppoe-3.11
./go

这里,如果提示没有gcc和make,那么就得安装

sudo apt-get install gcc make

rp-pppoe安装完之后,会要求你填写

Enter your PPPoE user name :         
输入ADSL帐号的用户名

Enter the Ethernet interface connected to the ADSL modem 
For Solaris, this is likely to be something like /dev/hme0. 
For Linux, it will be ethn, where 'n' is a number. 
(default eth0): 
输入 eth0 ,这是ADSL相连的网卡的名字

Enter the demand value (default no):     
输入 no

Enter the DNS information here: 
输入 server ,这表示使用ADSL拨号自动获得的DNS服务器IP地址

Please enter your PPPoE password: 
输入ADSL帐号的密码

Choose a type of firewall (0-2): 
输入 0 ,不使用防火墙

Accept these settings and adjust configuration files (y/n)? 
如果输入的信息正确,输入 y ,完成配置,否则,输入 n 重新输入。

在配置完之后,输入

pppoe-start

就可以进行拨号。

Raspberry(树莓派) 2 B 之Kali系统PPPOE拨号并开启热点

首先,关于PPPOE拨号和开启热点的,可以看我前两篇文章。
PPPOE拨号
开启热点

其实,有一件很奇怪的事情就是。
当我pppoe拨号的时候,拨号程序并不会将我的pppoe网关加入路由表中
这是因为,检测到了路由表里原来就有一个默认网关(可能是校园网的问题,默认校园网的网关,可是我是翼迅拨号。网关可能不一样。)
那么,这样就造成了,即使PPPoE拨号成功也上不了网。

对于这个问题,我们可以手工地在路由表里面添加我们的PPPoE网关

route add default gw PPPoE拨号获取的IP

这里的PPPoE拨号获取的IP可以这样查询到:

ifconfig ppp0

添加完网关之后,就可以上网了。

然后,你会很神奇地发现,树莓派发出来的WIFI并不能够上网。
经过我的排查发现,是因为在之前建立热点的时候,我们做的NAT数据转发是将wlan0的数据转发到eth0上
而eth0走的是校园网的网关,和翼迅PPPoE的不一样
那么,我们就可以重新添加NAT转发(注意!这个必须在每次PPPoE拨号成功后添加才有效,别问我为什么这样。)

sudo iptables -A FORWARD -i ppp0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o ppp0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

添加完之后,你就会神奇地发现,WIFI有网了!!!啊哈哈哈哈哈哈哈哈哈

Raspberry(树莓派) 2 B 之Kali系统开无线热点(RTL8188CUS)

首先,我们得下载hostapd

sudo apt-get install hostapd unzip

因为,官方提供的hostapd不支持RTL8188CUS的驱动,所以,我们得再下载别人已经编译好的继承了8188CUS驱动的hostapd,然后覆盖安装。

wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip
unzip hostapd.zip 
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
sudo mv hostapd /usr/sbin/hostapd.edimax 
sudo ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd 
sudo chown root.root /usr/sbin/hostapd 
sudo chmod 755 /usr/sbin/hostapd

然后,安装DHCP服务

sudo apt-get install udhcpd

配置udhcpd

vi /etc/udhcpd.conf

然后,将文件中以下几项改成如下所示

start 192.168.42.2 # This is the range of IPs that the hostspot will give to client devices.
end 192.168.42.20
interface wlan0 # The device uDHCP listens on.
remaining yes
opt dns 8.8.8.8 4.2.2.2 # The DNS servers client devices will use.
opt subnet 255.255.255.0
opt router 192.168.42.1 # The Pi's IP address on wlan0 which we will set up shortly.
opt lease 864000 # 10 day DHCP lease time in seconds

然后,编辑

vi /etc/default/udhcpd

并将其改为

#DHCPD_ENABLED="no"

接下来,我们要给无线网卡配置一个静态IP,以便DHCP分配

vi /etc/network/interfaces

将其中所有的含有wlan0的全部注释掉,然后添加

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0

然后,我们要给hostapd创建一个配置文件

sudo vi /etc/hostapd/hostapd.conf

文件内容

interface=wlan0
driver=rtl871xdrv
ssid=My_SSID_Name
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=MYPASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

启动IP转向功能以便于开通NAT

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

编辑/etc/sysctl.conf改动下面这行:

net.ipv4.ip_forward=1

配置iptables防火墙

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

到这里路由的NAT功能已经被启用,我们将刚才配置的iptables保存下来以便于下次使用:

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

编辑/etc/network/interfaces然后在最后加上下面这行以使每次启动都自动加载iptables配置:

up iptables-restore < /etc/iptables.ipv4.nat

重启并测试hostapd

sudo hostapd -dd /etc/hostapd/hostapd.conf

如果没有错误的话,你这时应该能搜索到你所配置的无线信号。然后Ctrl+C退出这个测试。

如果一切正常的话,我们可以设置hostapd的配置文件路径了。

sudo vi /etc/default/hostapd

去掉注释符号并改动下面这行为我们的配置文件路径:

DAEMON_CONF="/etc/hostapd/hostapd.conf"

启动相应软件,并加入启动项

sudo service hostapd start
sudo service udhcpd start
sudo update-rc.d hostapd enable
sudo update-rc.d udhcpd enable