All pastes #948233 Raw Edit

Miscellany

public text v1 · immutable
·published 2008-03-18 23:46 UTC
rendered paste body
/etc/config/firewall
config policy lan
	option nat      wan
	option allow    wan

config accept ssh
	option proto tcp
	option dport 22
	option module state
	option state new

config accept icmp
	option proto icmp

config forward webserver
	option target           192.168.1.10
	option proto            tcp
	option dports           80,443

/etc/init.d/firewall

#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org

## Please make changes in /etc/firewall.user
START=45

get_variables() {
	config_get proto "$1" proto
	config_get dport "$1" dport
	config_get dports "$1" dports
	[ -n "$dports" ] && dports=`echo $dports | sed 's/-/:/'`
	[ -n "$dports" ] && dports="-m multiport --dports $dports"
	config_get sport "$1" sport
	config_get sports "$1" sports
	[ -n "$sports" ] && sports=`echo $sports | sed 's/-/:/'`
	[ -n "$sports" -a -z "$dports" ] && sports="-m multiport --sports $sports"
	[ -n "$sports" -a -n "$dports" ] && sports="--sports $sports"
	config_get dest "$1" dest
	config_get source "$1" source
	config_get target "$1" target
}

config_cb() {
	local cfg_type="$1" #TYPE
	export cfg_name_firewall="$2"
	case "$cfg_type" in
		policy)
			option_cb() {
				case "$1" in
					allow)
						(include /lib/network
						scan_interfaces
						# Allow connections between networks
						config_get iface1 "$cfg_name_firewall" ifname
						config_get iface2 $2 ifname
						echo "iptables -A FORWARD -i $iface1 -o $iface2 -j ACCEPT">>/tmp/firewall)
					;;
					nat)
						(include /lib/network
						scan_interfaces
						config_get LAN_MASK "$cfg_name_firewall" netmask
						config_get LAN_IP "$cfg_name_firewall" ipaddr
						LAN_NET=$(/bin/ipcalc.sh $LAN_IP $LAN_MASK | grep NETWORK | cut -d= -f2)
						echo "iptables -t nat -A POSTROUTING --src $LAN_NET/$LAN_MASK -o $2 -j MASQUERADE">>/tmp/firewall)
					;;
				esac
			}
		;;
		forward)
			append forward "$cfg_name_firewall" "$N"
		;;
		accept)
			append accept "$cfg_name_firewall" "$N"
		;;	
	esac
}

clear_variables() {
	proto=
	dport=
	dports=
	sport=
	sports=
	dest=
	source=
	target=
}

start() {
	#
	# delete all existing rules.
	#
	echo "iptables -F
	iptables -t nat -F
	iptables -t mangle -F
	iptables -X
	
	# base case
	iptables -P INPUT DROP
	iptables -A INPUT -m state --state INVALID -j DROP
	iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
	iptables -A INPUT -p tcp --tcp-flags SYN SYN --tcp-option \! 2 -j  DROP

	iptables -P OUTPUT DROP
	iptables -A OUTPUT -m state --state INVALID -j DROP
	iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

	iptables -P FORWARD DROP 
	iptables -A FORWARD -m state --state INVALID -j DROP
	iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
	iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT">/tmp/firewall

	uci_load firewall
	for section in $forward; do
		clear_options
		get_info "$section"
		echo "iptables -A PREROUTING -t nat -p $proto ${source:+ --source $source} ${dest:+ -d $dest} ${dport:+ --dport $dport} ${dports:+ $dports} ${sports:+ $sports} -j DNAT --to $target">>/tmp/firewall
		echo "iptables -A FORWARD -p $proto -m state --state NEW ${source:+ --source $source} ${dest:+ -d $dest} ${dport:+ --dport $dport} ${dports:+ $dports} ${sports:+ $sports} -j ACCEPT">>/tmp/firewall 
	done
	for section in $accept; do
		clear_options
		get_variables "$section"
		echo "iptables -A INPUT -p $proto -m state --state NEW ${source:+ --source $source} ${dest:+ -d $dest} ${dport:+ --dport $dport} ${dports:+ $dports} ${sports:+ $sports} -j ACCEPT">>/tmp/firewall
	done
	#[ -f /etc/firewall.user ] && . /etc/firewall.user

}

stop() {
	iptables -P INPUT ACCEPT
	iptables -P OUTPUT ACCEPT
	iptables -P FORWARD ACCEPT
	iptables -F
	iptables -X
	iptables -t nat -P PREROUTING ACCEPT
	iptables -t nat -P POSTROUTING ACCEPT
	iptables -t nat -P OUTPUT ACCEPT
	iptables -t nat -F
	iptables -t nat -X
}

firewall.spec

policy[] {
	default: enum,deny,allow required;
}
forward[] {
	target: ip, required;
	proto: string;
	dports: ports;
	sports: ports;
	dport: port;
	sport: port;
	dest: ip;		# for routers with more than one "outside" ip
	src: ip;		# restrict connections to a source host
}
allow[] {
	proto: string;
	dports: ports;
	sports: ports;
	dport: port;
	sport: port;
	dest: ip;		# for routers with more than one "outside" ip
	src: ip;		# restrict connections to a source host
}
drop[] {
	proto: string;
	dports: ports;
	sports: ports;
	dport: port;
	sport: port;
	dest: ip;		# for routers with more than one "outside" ip
	src: ip;		# restrict connections to a source host
}