In order to get ssh access to a Raspberry Pi (e.g., through a 4G modem or if it is behind a firewall), the frp reverse proxy can be used.
For this purpose, a server with a public IP or DNS name will act as server (e.g., an AWS server in the free tier) that the Raspberry Pi will connect to.
Inbound ports that need to be open:
- 22 - for general ssh access
- 7000 - general inbound connections from clients
- 6000 - for accepting ssh connections and forwarding them to the client (unique to each client)
Server requires DNS name or fixed IP address. DynDNS, like noip.com, works as well. See the DynDNS article for instructions.
For this example, we are assuming mydevice.ddns.net as the server DNS name.
Install frp:
-
Download appropriate release binary
sudo bash cd /opt wget https://github.com/fatedier/frp/releases/download/v0.37.1/frp_0.37.1_linux_amd64.tar.gz tar -xzf frp_0.37.1_linux_amd64.tar.gz ln -s frp_0.37.1_linux_amd64 frp -
Create
/etc/frps.iniwith the following content:[common] bind_port = 7000
-
Create systemd service
/etc/systemd/system/frps.servicewith the following content:[Unit] Description=frp reverse proxy server After=network.target [Service] User=ubuntu Group=ubuntu WorkingDirectory=/opt/frp ExecStart=/opt/frp/frps -c /etc/frps.ini [Install] WantedBy=multi-user.target
-
Install systemd service
sudo systemctl enable /etc/systemd/system/frps.service -
Start service
sudo systemctl start frps.service
Inbound ports that need to be open:
- 22 - for ssh access
Install frp:
-
Download appropriate release binary
-
32-bit
sudo bash cd /opt wget https://github.com/fatedier/frp/releases/download/v0.37.1/frp_0.37.1_linux_arm.tar.gz tar -xzf frp_0.37.1_linux_arm.tar.gz ln -s frp_0.37.1_linux_arm frp -
64-bit
sudo bash cd /opt wget https://github.com/fatedier/frp/releases/download/v0.37.1/frp_0.37.1_linux_arm64.tar.gz tar -xzf frp_0.37.1_linux_arm64.tar.gz ln -s frp_0.37.1_linux_arm64 frp
-
-
Create
/etc/frpc.iniwith the following content:[common] server_addr = mydevice.ddns.net server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
-
Create systemd service
/etc/systemd/system/frpc.servicewith the following content:[Unit] Description=frp reverse proxy client After=network.target [Service] User=pi Group=pi Restart=on-failure RestartSec=15s WorkingDirectory=/opt/frp ExecStart=/opt/frp/frpc -c /etc/frpc.ini [Install] WantedBy=multi-user.target
-
Install systemd service
sudo systemctl enable /etc/systemd/system/frpc.service -
Start service
sudo systemctl start frpc.service
Changing remote access to the Raspberry Pi to using ssh-keys only (as user pi):
- On admin laptop create a ssh key in
$HOME/.ssh:ssh-keygen -f mydevice
- Output the content of the public key (
mydevice.pub) and paste it on the Raspberry Pi into/home/pi/.ssh/authorized_keys - On admin laptop, create the following entry in
$HOME/.ssh/config:Host mydevice User pi Hostname mydevice.ddns.net Port 6000 IdentityFile ~/.ssh/mydevice - On Raspberry Pi, edit the
/etc/ssh/sshd_configfile and disable password authentication:PasswordAuthentication no - Restart the
sshservice on the Raspberry Pisudo systemctl restart ssh