]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/initscripts/init.d/firewall
Merge remote-tracking branch 'alfh/feature_vnstat_1.11' into beyond-next
[people/teissler/ipfire-2.x.git] / src / initscripts / init.d / firewall
index 77da2324243008dfa2d352839abc46f0b34cf639..a67af7056486ad4e93db4786100d0a83ea80d100 100644 (file)
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+. /etc/sysconfig/rc
+. ${rc_functions}
+
 eval $(/usr/local/bin/readhash /var/ipfire/ppp/settings)
 eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings)
 eval $(/usr/local/bin/readhash /var/ipfire/optionsfw/settings)
@@ -103,9 +106,10 @@ iptables_init() {
 
        # Block OpenVPN transfer networks
        iptables -N OVPNBLOCK
-       for i in INPUT FORWARD; do
-               iptables -A ${i} -j OVPNBLOCK
-       done
+       iptables -A INPUT   -i tun+ -j OVPNBLOCK
+       iptables -A OUTPUT  -o tun+ -j OVPNBLOCK
+       iptables -A FORWARD -i tun+ -j OVPNBLOCK
+       iptables -A FORWARD -o tun+ -j OVPNBLOCK
 
        # OpenVPN transfer network translation
        iptables -t nat -N OVPNNAT
@@ -185,16 +189,6 @@ iptables_init() {
        iptables -t nat -N NAT_SOURCE
        iptables -t nat -A POSTROUTING -j NAT_SOURCE
 
-       # RED chain, used for the red interface
-       iptables -N REDINPUT
-       iptables -A INPUT -j REDINPUT
-       iptables -N REDFORWARD
-       iptables -A FORWARD -j REDFORWARD
-       iptables -t nat -N REDNAT
-       iptables -t nat -A POSTROUTING -j REDNAT
-
-       iptables_red
-
        # Custom prerouting chains (for transparent proxy)
        iptables -t nat -N SQUID
        iptables -t nat -A PREROUTING -j SQUID
@@ -203,12 +197,53 @@ iptables_init() {
        iptables -t nat -N NAT_DESTINATION
        iptables -t nat -A PREROUTING -j NAT_DESTINATION
 
+       iptables -t mangle -N NAT_DESTINATION
+       iptables -t mangle -A PREROUTING -j NAT_DESTINATION
+
+       iptables -t nat -N NAT_DESTINATION_FIX
+       iptables -t nat -A POSTROUTING -j NAT_DESTINATION_FIX
+
+       iptables -t nat -A NAT_DESTINATION_FIX \
+               -m mark --mark 1 -j SNAT --to-source "${GREEN_ADDRESS}"
+
+       if [ -n "${BLUE_ADDRESS}" ]; then
+               iptables -t nat -A NAT_DESTINATION_FIX \
+                       -m mark --mark 2 -j SNAT --to-source "${BLUE_ADDRESS}"
+       fi
+
+       if [ -n "${ORANGE_ADDRESS}" ]; then
+               iptables -t nat -A NAT_DESTINATION_FIX \
+                       -m mark --mark 3 -j SNAT --to-source "${ORANGE_ADDRESS}"
+       fi
+
        # upnp chain for our upnp daemon
        iptables -t nat -N UPNPFW
        iptables -t nat -A PREROUTING -j UPNPFW
        iptables -N UPNPFW
        iptables -A FORWARD -m conntrack --ctstate NEW -j UPNPFW
 
+       # RED chain, used for the red interface
+       iptables -N REDINPUT
+       iptables -A INPUT -j REDINPUT
+       iptables -N REDFORWARD
+       iptables -A FORWARD -j REDFORWARD
+       iptables -t nat -N REDNAT
+       iptables -t nat -A POSTROUTING -j REDNAT
+
+       # Filter logging of incoming broadcasts.
+       iptables -N BROADCAST_FILTER
+       iptables -A INPUT -j BROADCAST_FILTER
+
+       iptables -A BROADCAST_FILTER -i "${GREEN_DEV}" -d "${GREEN_BROADCAST}" -j DROP
+
+       if [ -n "${BLUE_DEV}" -a -n "${BLUE_BROADCAST}" ]; then
+               iptables -A BROADCAST_FILTER -i "${BLUE_DEV}" -d "${BLUE_BROADCAST}" -j DROP
+       fi
+
+       if [ -n "${ORANGE_DEV}" -a -n "${ORANGE_BROADCAST}" ]; then
+               iptables -A BROADCAST_FILTER -i "${ORANGE_DEV}" -d "${ORANGE_BROADCAST}" -j DROP
+       fi
+
        # Apply OpenVPN firewall rules
        /usr/local/bin/openvpnctrl --firewall-rules
 
@@ -223,19 +258,11 @@ iptables_init() {
        iptables -N POLICYOUT
        iptables -A OUTPUT -j POLICYOUT
 
+       # Initialize firewall policies.
        /usr/sbin/firewall-policy
 
-       # read new firewall
-       /usr/local/bin/firewallctrl
-
-       if [ "$DROPINPUT" == "on" ]; then
-               iptables -A INPUT   -m limit --limit 10/minute -j LOG --log-prefix "DROP_INPUT"
-       fi
-       iptables -A INPUT -j DROP -m comment --comment "DROP_INPUT"
-       if [ "$DROPFORWARD" == "on" ]; then
-               iptables -A FORWARD -m limit --limit 10/minute -j LOG --log-prefix "DROP_FORWARD"
-       fi
-       iptables -A FORWARD -j DROP -m comment --comment "DROP_FORWARD"
+       # Install firewall rules for the red interface.
+       iptables_red
 }
 
 iptables_red() {
@@ -287,19 +314,46 @@ iptables_red() {
                iptables -t nat -A REDNAT -o $IFACE -j MASQUERADE
 
        fi
+
+       # Reload all rules.
+       /usr/local/bin/firewallctrl
 }
 
 # See how we were called.
 case "$1" in
   start)
+       boot_mesg "Loading firewall modules into the kernel"
+       modprobe iptable_nat || failed=1
+       for i in $(find /lib/modules/$(uname -r) -name nf_conntrack*); do
+               modprobe $(basename $i | cut -d. -f1) || failed=1
+       done
+       for i in $(find /lib/modules/$(uname -r) -name nf_nat*); do
+               modprobe $(basename $i | cut -d. -f1) || failed=1
+       done
+       (exit ${failed})
+       evaluate_retval
+
+       if [ -e /var/ipfire/main/disable_nf_sip ]; then
+               rmmod nf_nat_sip
+               rmmod nf_conntrack_sip
+               rmmod nf_nat_h323
+               rmmod nf_conntrack_h323
+       fi
+
+       boot_mesg "Setting up firewall"
        iptables_init
+       evaluate_retval
+
        # run local firewall configuration, if present
        if [ -x /etc/sysconfig/firewall.local ]; then
                /etc/sysconfig/firewall.local start
        fi
        ;;
   reload)
+       boot_mesg "Reloading firewall"
        iptables_red
+       evaluate_retval
+
        # run local firewall configuration, if present
        if [ -x /etc/sysconfig/firewall.local ]; then
                /etc/sysconfig/firewall.local reload