Last active
November 6, 2023 14:18
-
-
Save martintrojer/d24ae36b31a261a07e7582d451e0636d to your computer and use it in GitHub Desktop.
wifi -> eth bridge
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
set -e | |
[ $EUID -ne 0 ] && echo "run as root" >&2 && exit 1 | |
########################################################## | |
# You should not need to update anything below this line # | |
########################################################## | |
# parprouted - Proxy ARP IP bridging daemon | |
# dhcp-helper - DHCP/BOOTP relay agent | |
apt update && apt install -y parprouted dhcp-helper | |
systemctl stop dhcp-helper | |
systemctl enable dhcp-helper | |
# Enable ipv4 forwarding. | |
sed -i'' s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/ /etc/sysctl.conf | |
# Service configuration for standard WiFi connection. Connectivity will | |
# be lost if the username and password are incorrect. | |
systemctl restart wpa_supplicant.service | |
# Enable IP forwarding for wlan0 if it's not already enabled. | |
# grep '^option ip-forwarding 1$' /etc/dhcpcd.conf || printf "option ip-forwarding 1\n" >> /etc/dhcpcd.conf | |
# Disable dhcpcd control of eth0. | |
# grep '^denyinterfaces eth0$' /etc/dhcpcd.conf || printf "denyinterfaces eth0\n" >> /etc/dhcpcd.conf | |
# Tell NetworkManafer to leave eth0 alone | |
cat > /etc/NetworkManager/conf.d/ <<EOF | |
[main] | |
plugins=ifcfg-rh,keyfile | |
[keyfile] | |
unmanaged-devices=interface-name:eth0 | |
EOF | |
# Configure dhcp-helper. | |
cat > /etc/default/dhcp-helper <<EOF | |
DHCPHELPER_OPTS="-b wlan0" | |
EOF | |
# Enable avahi reflector if it's not already enabled. | |
sed -i'' 's/#enable-reflector=no/enable-reflector=yes/' /etc/avahi/avahi-daemon.conf | |
grep '^enable-reflector=yes$' /etc/avahi/avahi-daemon.conf || { | |
printf "something went wrong...\n\n" | |
printf "Manually set 'enable-reflector=yes in /etc/avahi/avahi-daemon.conf'\n" | |
} | |
# I have to admit, I do not understand ARP and IP forwarding enough to explain | |
# exactly what is happening here. I am building off the work of others. In short | |
# this is a service to forward traffic from WiFi to Ethernet. | |
cat <<'EOF' >/usr/lib/systemd/system/parprouted.service | |
[Unit] | |
Description=proxy arp routing service | |
Documentation=https://raspberrypi.stackexchange.com/q/88954/79866 | |
Requires=sys-subsystem-net-devices-wlan0.device | |
After=sys-subsystem-net-devices-wlan0.device | |
[Service] | |
Type=forking | |
# Restart until wlan0 gained carrier | |
Restart=on-failure | |
RestartSec=30 | |
TimeoutStartSec=30 | |
Nice=-20 | |
# clone the dhcp-allocated IP to eth0 so dhcp-helper will relay for the correct subnet | |
ExecStartPre=/bin/bash -c '/sbin/ip addr add $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0' | |
ExecStartPre=/sbin/ip link set dev eth0 up | |
ExecStartPre=/sbin/ip link set wlan0 promisc on | |
ExecStart=-/usr/sbin/parprouted eth0 wlan0 | |
ExecStopPost=/sbin/ip link set wlan0 promisc off | |
ExecStopPost=/sbin/ip link set dev eth0 down | |
ExecStopPost=/bin/bash -c '/sbin/ip addr del $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0' | |
[Install] | |
WantedBy=wpa_supplicant.service | |
EOF | |
systemctl daemon-reload | |
systemctl enable parprouted | |
systemctl start parprouted dhcp-helper |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment