Accessing Your Raspberry Pi Remotely Using Cloudflare
mhrsntrk / December 15, 2023
If you're looking to access your Raspberry Pi securely from anywhere in the world, you've come to the right place (I recently solve that problem, so I am writing it down to not forget it in the future). Often, we need remote access to our devices, whether for monitoring a home system, managing a server, or working on various projects. This guide will show you how to securely connect to your Raspberry Pi using Cloudflare.
Unlike traditional methods like port forwarding, which can expose your device to security risks, Cloudflare offers a safer alternative. It provides a secure, encrypted tunnel for remote access, reducing the risk of cyber-attacks and keeping your connection private. While there are other methods like VPN, RDP and VNC, Cloudflare stands out for its ease of setup and enhanced security features. Let's dive into how you can set up Cloudflare for secure, remote access to your Raspberry Pi.
Installing cloudflared
to Raspberry Pi
- Make sure everything is up-to-date
sudo apt update
sudo apt upgrade
- Install prerequisite packages
sudo apt install curl lsb-release
- Get the Cloudflare repo's GPG key
curl -L https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-archive-keyring.gpg >/dev/null
- Get the Cloudflare repo
echo "deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
- Update the package list cache
sudo apt update
- Get the Cloudflare repo cache
sudo apt install cloudflared
Setting up a Cloudflare Tunnel on the Raspberry Pi
- Initiate the login
cloudflared tunnel login
- Copy the displayed URL into your browser to authenticate
Please open the following URL and log in with your Cloudflare account:
https://dash.cloudflare.com/-------------
Leave cloudflared running to download the cert automatically.
- Initiate the login URL into your browser to authenticate
You have successfully logged in.
If you wish to copy your credentials to a server, they have been saved to:
/home/{USER}/.cloudflared/cert.pem
- Create a tunnel
cloudflared tunnel create {TUNNEL-NAME}
- You will see the created tunnel ID, copy the shown tunnel ID
Tunnel credentials written to /home/{USER}/.cloudflared/1111111-2222-33333-44444-5555555555555.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.
Created tunnel {TUNNEL-NAME} with id 1111111-2222-33333-44444-5555555555555
- Route the tunnel to a Cloudflare managed domain name
cloudflared tunnel route dns {TUNNEL-NAME} {DOMAIN-NAME}
- Upon a successful operation, you will see a success message similar to below
Added CNAME {DOMAIN-NAME} which will route to this tunnel tunnelID=1111111-2222-33333-44444-5555555555555
- Create a config file for Cloudflare
sudo nano ~/.cloudflared/config.yml
- Enter the following details into config file and save
tunnel: {TUNNEL-NAME}
credentials-file: /home/{USER}/.cloudflared/{TUNNEL-ID}.json
ingress:
- hostname: {DOMAIN-NAME}
service: ssh://localhost:22
- service: http_status:404
- Install
cloudflared
as a service
sudo cloudflared --config ~/.cloudflared/config.yml service install
- Enable starting the service on boot
sudo systemctl enable cloudflared
- Check if the service is currently running
sudo systemctl start cloudflared
Create a Cloudflare Zero Trust Application
- Go to
Zero Trust > Access > Applications
on the Cloudflare dashboard - Click
Add an Application
- Select
Self-hosted
- Enter
Application Name
,Subdomain
,Domain
and click next - Enter
Policy Name
, Selector ->Email
, Value ->Email Address
and click next - Enable
Enable automatic cloudflared authentication Disabled
- Enable
Enable automatic cloudflared authentication ->
SSH`
Configure short-lived certificate
- Make sure the
{USER}
matches the email identity (for example; user=mhrsntrk
and email=[email protected]
won't work but user=m
and email=[email protected]
will). You can either create a new user with same email identity or add the following command to Raspberry Pi's/etc/ssh/sshd_config
Match user mhrsntrk
AuthorizedPrincipalsCommand /bin/echo 'm'
AuthorizedPrincipalsCommandUser nobody
- Generate a short-lived certificate public key by visiting
Zero Trust > Access > Service Auth > SSH
on the Cloudflare dashboard and clickingGenerate certificate
button - Copy the public key and paste it to below file on Raspberry Pi
sudo nano /etc/ssh/ca.pub
- Open the
sshd_config
file
sudo nano /etc/ssh/sshd_config
- Make sure
PubkeyAuthentication
is uncommented and set toyes
- Add the below line and save the file
TrustedUserCAKeys /etc/ssh/ca.pub
- Restart SSH service on Raspberry Pi
sudo systemctl restart ssh
Configure your client
- Print the required configuration and copy the output
cloudflared access ssh-config --hostname {DOMAIN-NAME} --short-lived-cert
- Open
~/.ssh/config
file
sudo nano ~/.ssh/config
- Enter the copied configuration into
~/.ssh/config
and save
You've successfully set up a secure connection to your Raspberry Pi using Cloudflare. This approach not only keeps your Raspberry Pi accessible from anywhere but does so in a way that's far safer than traditional methods like port forwarding. By choosing Cloudflare, you've added an extra layer of security, keeping your projects and data safe from potential online threats.
As you continue exploring the vast potential of your Raspberry Pi, remember that the way you connect to it plays a crucial role in your overall experience and security. Whether it's for home automation, personal projects, or learning purposes, your Raspberry Pi is now more accessible and secure, thanks to Cloudflare.