Enable Internet Access on Raspberry Pi Through Wired Connection
The first I got my hands on a raspberry pi, I wanted to update its OS to the latest, but the problem is that my RPi is connected to my laptop (using OpenSuse) and I am using SSH to access it (I don't have access to any displays).
Preparation##
First, prepare your SDCard for RPi, there are plenty of resources on how to prepare your SDCard. Then, follow this guide to configure your RPi for SSH access from your machine.
IP Addressing###
For this guide, I am using the following addressing scheme:
- RPi eth0 => 192.168.10.2/24
- Laptop eth0 (connected to RPi) => 192.168.10.1/24
- Laptop wlan0 (connected to router, default gateway) => 192.168.1.6/24
- Router (Internet access) => 192.168.1.254/24
Fixing Default Gateway on my Laptop##
When I connected to my RPi, Network Manager replaced my default gateway to eth0
, so I am not able to access the Internet after connected to RPi. You verify it by using route
command without parameters, if the default line points to eth0, it means your default gateway is overwritten, if it's not, it means you can skip this section, you can verify it by ping-ing www.google.com
. To fix this problem, I deleted the default gateway and added a new default gateway that points to my router:
$ sudo /sbin/route del default
$ sudo /sbin/route add default gw 192.168.1.254 dev wlan0
Verify that your default gateway now points to wlan0 using route
command without parameters. Try to ping www.google.com
to make sure that your laptop have access to the Internet, your RPi won't be able to access the Internet if your laptop does not.
Adding Default Gateway to RPi##
Using the route command
add a default that points to eth0 interface:
$ sudo route add default gw 192.168.10.1 dev eth0
The Problem##
Out of the box without masquerading, once a packet sourced from 192.168.10.0/24 network (my RPi <==> laptop subnet) reaches the router on subnet 192.168.1.0/24, depends on the configuration, it will route or drop the packet. Even if the router successfully routed the packet to the Internet, it will definitely drop the packet, because it does not know where to route the packet for network 192.168.10.0/24 network. So, masquerading seems to be the only solution here.
Masquerading and Configuration##
Masquerading is like that Linux version of NAT, it translates your internal network to external network (e.g. for Internet access). What it does is that any packets bound for any network from 192.168.10.0/24 subnet will be translated to 192.168.1.0/24 subnet, so my router knows where to route my 192.168.10.0/24 packet.
Since I am using OpenSUSE, I will configure masquerading through its own firewall using YaST.
- Open up firewall configuration in YaST and select
Interfaces
- Double click eth0 interface and change it to
External Zone
- Select
Masquerading
on the left and clickMasquerade Networks
- Add
80
torequested port
- Add
192.168.1.6
(or your wlan0 IP) toRedirect to Masqueraded IP
- Add
81
toRedirect to Port
or any ports you want your traffic to be translated to, but make sure you are not using any servers on that port - Click
Add
- Select
Startup
on the left and clickSave Settings and Restart Firewall Now
- Try to ping
www.google.com
from your RPi, you should get be able to at this point