| #!/usr/bin/env bash |
| # Copyright 2025 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| #### CATEGORY=Other |
| ### setup Linux firewall rules to allow Fuchsia device and emulator traffic. |
| ## Setup Linux firewall via iptables to allow Fuchsia device and emulator traffic. |
| ## |
| ## This command detects whether iptables is installed, |
| ## and if so, will add special rules to allow Fuchsia-specific traffic to |
| ## go through the link-local IPv6 network interfaces used by Fuchsia devices |
| ## and emulators. If `ufw` (Uncomplicated Firewall) is installed on the system, |
| ## we will abort, and recommend the script `fx setup-ufw`. |
| ## |
| ## NOTE: This script uses sudo and will thus ask for your password! |
| ## |
| ## -n|--dry-run Just print all steps, don't do any configuration |
| ## -u|--undo Remove all firewall rules installed by this script |
| |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $? |
| |
| if [[ "$(uname -s)" != "Linux" ]]; then |
| fx-error "This script can only be used on Linux!" |
| exit 1 |
| fi |
| |
| if which ufw >/dev/null 2>&1; then |
| fx-error "UFW is installed on the system. Please use `fx setup-ufw` instead." |
| exit 1 |
| fi |
| |
| if ! which iptables >/dev/null 2>&1; then |
| fx-error "iptables is not found on the system. This script cannot continue." |
| exit 1 |
| fi |
| |
| dryrun=false |
| undo_all=false |
| while [[ $# -gt 0 ]]; do |
| case "$1" in |
| -n|--dry-run) |
| dryrun=true |
| ;; |
| -u|--undo) |
| undo_all=true |
| ;; |
| -h|--help|*) |
| fx-command-help |
| exit 1 |
| ;; |
| esac |
| shift |
| done |
| |
| dryer() { |
| if ! "$dryrun"; then |
| "${@}" |
| return $? |
| fi |
| echo >&2 "+ $*" |
| return 0 |
| } |
| |
| # Does a check before running an iptables firewall rule, preventing setting |
| # rules multiple times. In addition, prevents multiple removals for rules that |
| # do not exist. |
| do_firewall_checked() { |
| ARG="$1" |
| shift |
| if dryer sudo ip6tables -C "$@" 2>/dev/null; then |
| if [[ "$ARG" == "-A" ]]; then |
| fx-info "Skipping add via 'sudo ip6tables -A $*'. Rule already set." |
| return 0 |
| fi |
| else |
| if [[ "$ARG" == "-D" ]]; then |
| fx-info "Skipping removal 'sudo ip6tables -D $*'. Rule doesn't exist." |
| return 0 |
| fi |
| fi |
| dryer sudo ip6tables "$ARG" "$@" |
| } |
| |
| ARG="-A" |
| if "$undo_all"; then |
| ARG="-D" |
| fi |
| |
| for SRC_ADDR in "fe80::/10" "fc00::/7"; do |
| do_firewall_checked "$ARG" INPUT -p udp -s "$SRC_ADDR" -m multiport --dport 33331:33340 -m comment --comment 'Fuchsia Netboot Protocol' -j ACCEPT |
| do_firewall_checked "$ARG" INPUT -p tcp -s "$SRC_ADDR" --dport 8083 -m comment --comment 'Fuchsia Package Server' -j ACCEPT |
| do_firewall_checked "$ARG" INPUT -p udp -s "$SRC_ADDR" --sport 33340 -m comment --comment 'Fuchsia Netboot TFTP Source Port' -j ACCEPT |
| do_firewall_checked "$ARG" INPUT -p udp -s "$SRC_ADDR" --sport 5353 -m comment --comment 'Fuchsia MDNS' -j ACCEPT |
| done |
| echo "Done!" |