#!/usr/bin/env bash # Copyright (C) 2014 Multi-Tech Systems # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. set -e do_start() { lan_interfaces=$(echo "$lan" | sed "s/,/ /g") echo "Configuring firewall rules..." # Flush all the tables first iptables -t filter -F iptables -t nat -F iptables -t mangle -F # Drop all incoming packets by default iptables -t filter -P INPUT DROP # Accept all on local loopback iptables -t filter -A INPUT -i lo -j ACCEPT # Allow packets in for existing socket connections iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Accept all from LAN interfaces for i in $lan_interfaces; do iptables -t filter -A INPUT -i $i -j ACCEPT # Accept ssh from the LAN (Wired) #iptables -t filter -A INPUT -i $i -p tcp --dport 22 -j ACCEPT # Accept http from the LAN (Wired) #iptables -t filter -A INPUT -i $i -p tcp --dport 80 -j ACCEPT # Accept tftp from the LAN (Wired) #iptables -t filter -A INPUT -i $i -p udp --dport 69 -j ACCEPT done # Accept ssh from the WAN (Wireless) #iptables -t filter -A INPUT -i $wan -p tcp --dport 22 -j ACCEPT # Accept http from the WAN (Wireless) #iptables -t filter -A INPUT -i $wan -p tcp --dport 80 -j ACCEPT # Allow packet fowarding from LAN interfaces to WAN (cell router) iptables -t filter -P FORWARD DROP iptables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT for i in $lan_interfaces; do iptables -t filter -A FORWARD -i $i -o $wan -j ACCEPT done # Allow all output packets iptables -t filter -P OUTPUT ACCEPT # enable NAT for cell router iptables -t nat -A POSTROUTING -o $wan -j MASQUERADE echo "Enabling packet forwarding..." # turn on packet forwarding last echo 1 > /proc/sys/net/ipv4/ip_forward echo "Done" } do_stop() { echo "Clearing firewall rules..." # clear all tables iptables -t filter -F iptables -t nat -F iptables -t mangle -F # reset policies to ACCEPT iptables -t filter -P INPUT ACCEPT iptables -t filter -P OUTPUT ACCEPT iptables -t filter -P FORWARD ACCEPT # turn off packet forwarding echo "Disabling packet forwarding..." echo 0 > /proc/sys/net/ipv4/ip_forward echo "Done" } usage() { echo "Usage: $(basename $0) start|stop [options]" echo " options:" echo " -l LAN interfaces to allow, comma-separated (defaults to \"eth0\")" echo " -w WAN interface to route out (defaults to \"ppp0\")" exit 1 } # main if [[ $# < 1 ]]; then usage fi cmd=$1 shift while getopts "l:w:h" opt; do case "$opt" in l) l=$OPTARG ;; w) w=$OPTARG ;; h) usage ;; *) usage ;; esac done # default lan to eth0 if not specified lan=${l-eth0} # default wan to ppp0 if not specified wan=${w-ppp0} case $cmd in start) echo "LAN: $lan" echo "WAN: $wan" do_start ;; stop) do_stop ;; *) usage ;; esac exit 0