[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: iptables



On Fri, May 26, 2006 at 11:44:35PM +0300, sly mAd wrote:
> здарова народ.
> извините за глупый вопрос(самому аж стыдно:))
> как в debain sarge запустить iptables?
> всё поставлено(по умолчанию стаяло)
> 
> в /etc/init.d/ нет и намёка на iptables

Если ты про настройку файрвола, то здесь есть несколько возможностей.
Во-первых, в дистрибутиве есть пакеты (fiaif, например), выполняющие
эту задачу. Во-вторых, всегда можно написать скрипт самому и добавить его в
/etc/init.d/ Второй путь, на мой взгляд, наиболее естественный и простой.

Вообще,

$ apt-cache search firewall

покажет тебе, что есть в дистрибутиве на тему файрволов.

Если писать скрипт самому, то предварительно, конечно, надо изучить
документацию к iptables. Ищи в /usr/share/doc/iptables.

В качестве примера прилагаю свой скрипт. Он для машины (оне не роутер),
которая подключена к локальной сети через eth0 и ходит в интернет через ppp0.
Управляется файрвол командами

# /etc/init.d/firewall { start | stop | restart }

как и другие скрипты из /etc/init.d/.

При загрузке скрипт вызывается из /etc/init.d/networking для чего я добавил
туда нужные команды. На всякий случай, цепляю его тоже. Помнится, я его тоже
правил довольно заметно, так что он не чисто дистрибутивный.

-- 
Cтанислав
#! /bin/sh
#
# firewall	Firewall initialization script
#
# Author:	Stanislav Maslovski <stas@shota.mine.nu>
#
# Version:	0.1  16-April-2005

CMD=/sbin/iptables

test -x $CMD || exit 0

#
#	Function that starts firewalling
#
d_start() {
    modprobe ip_conntrack_ftp
    modprobe ip_conntrack_irc

    TORRENT=7881:7999
    VALKNUT=9176
    USER=30000:30100

    # default behaviour
    POLICY="$CMD -P"

    $POLICY INPUT DROP
    $POLICY FORWARD DROP

    # filter table
    NEWCHAIN="$CMD -t filter -N"
    ADDTO="$CMD -t filter -A"

    $NEWCHAIN tcpsyn
    $ADDTO tcpsyn -m state --state NEW -m limit --limit 1/s -j ACCEPT
    $ADDTO tcpsyn -m limit -j LOG
    $ADDTO tcpsyn -j DROP

    $NEWCHAIN p2p
    $ADDTO p2p -p TCP --dport $TORRENT -j tcpsyn
    $ADDTO p2p -p TCP --dport $VALKNUT -j tcpsyn
    $ADDTO p2p -p UDP --dport $VALKNUT -j ACCEPT
    $ADDTO p2p -p TCP --dport $USER -j tcpsyn
    $ADDTO p2p -p UDP --dport $USER -j ACCEPT

    $NEWCHAIN daemon
    $ADDTO daemon -p TCP --dport ssh -j tcpsyn
    $ADDTO daemon -p TCP --dport ftp-data:ftp -j tcpsyn
    $ADDTO daemon -p TCP --dport auth -j tcpsyn

    $NEWCHAIN inet
    $ADDTO inet -j p2p
    $ADDTO inet -j DROP

    $NEWCHAIN lan
    $ADDTO lan -j p2p
    $ADDTO lan -j daemon
    $ADDTO lan -j DROP

    $ADDTO INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $ADDTO INPUT -i eth+ -j lan
    $ADDTO INPUT -i ppp+ -j inet
    $ADDTO INPUT -i lo -j ACCEPT

    # mangle table
    NEWCHAIN="$CMD -t mangle -N"
    ADDTO="$CMD -t mangle -A"
    $NEWCHAIN settos
    $ADDTO settos -p UDP --dport domain -j TOS --set-tos Minimize-Delay
    $ADDTO settos -p TCP --dport www -j TOS --set-tos Minimize-Delay
    $ADDTO settos -p TCP --sport $TORRENT -j TOS --set-tos Minimize-Cost
    $ADDTO settos -p TCP --dport $TORRENT -j TOS --set-tos Minimize-Cost

    $ADDTO OUTPUT -j settos
}

#
#	Function that stops firewalling
#
d_stop() {
    $CMD -t filter -F
    $CMD -t filter -X
    $CMD -t mangle -F
    $CMD -t mangle -X
    rmmod ipt_state ip_conntrack_ftp ip_conntrack_irc ip_conntrack
    rmmod ipt_LOG
    rmmod ipt_limit iptable_filter ipt_TOS iptable_mangle ip_tables
}

case "$1" in
  start)
	echo "Starting firewall..."
	d_start
	;;
  stop)
	echo "Stopping firewall..."
	d_stop
	;;
  restart|force-reload)
	echo "Restarting firewall..."
	d_stop
	sleep 1
	d_start
	;;
  *)
	echo "Usage: firewall {start|stop|restart|force-reload}" >&2
	exit 1
	;;
esac

exit 0
#!/bin/sh
#
# manage network interfaces and configure some networking options

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

if ! [ -x /sbin/ifup ]; then
    exit 0
fi

spoofprotect_rp_filter () {
    # This is the best method: turn on Source Address Verification and get
    # spoof protection on all current and future interfaces.
    
    if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
        for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
            echo 1 > $f
        done
        return 0
    else
        return 1
    fi
}

spoofprotect () {
    echo -n "Setting up IP spoofing protection: "
    if spoofprotect_rp_filter; then
        echo "rp_filter."
    else
        echo "FAILED."
    fi
}

ip_forward () {
    if [ -e /proc/sys/net/ipv4/ip_forward ]; then
        echo -n "Enabling packet forwarding..."
        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo "done."
    fi
}

syncookies () {
    if [ -e /proc/sys/net/ipv4/tcp_syncookies ]; then
        echo -n "Enabling TCP/IP SYN cookies..."
        echo 1 > /proc/sys/net/ipv4/tcp_syncookies
        echo "done."
    fi
}

no_redirects () {
    if [ -e /proc/sys/net/ipv4/conf/all/accept_redirects ]; then
	echo -n "Not accepting ICMP redirects..."
	for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
	    echo 0 > $f
	done
	echo "done."
    fi
    if [ -e /proc/sys/net/ipv4/conf/all/send_redirects ]; then
	echo -n "Not sending ICMP redirects..."
	for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
	    echo 0 > $f
	done
	echo "done."
    fi
}

no_source_routed () {
    if [ -e /proc/sys/net/ipv4/conf/all/accept_source_route ]; then
	echo -n "Disabling source routed packets..."
	for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
	    echo 0 > $f
	done
	echo "done."
    fi
}

harden_icmp () {
    if [ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ]; then
	echo -n "Ignoring ICMP broadcasts..."
	echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
	echo "done."
    fi
    if [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ]; then
	echo -n "Ignoring bogus ICMP error responses..."
	echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
	echo "done."
    fi
}

log_martians () {
    if [ -e /proc/sys/net/ipv4/conf/all/log_martians ]; then
    echo -n "Enabling logging of strange packets..."
	for f in /proc/sys/net/ipv4/conf/*/log_martians; do
	    echo 1 > $f
	done
    echo "done."
    fi
}

doopt () {
    optname=$1
    default=$2
    opt=`grep "^$optname=" /etc/network/options`
    if [ -z "$opt" ]; then
        opt="$optname=$default"
    fi
    optval=${opt#$optname=}
    if [ "$optval" = "yes" ]; then
        eval $optname
    fi
}

case "$1" in
    start)
	doopt spoofprotect yes
        doopt syncookies no
        doopt ip_forward no
	doopt no_redirects yes
	doopt no_source_routed yes
	doopt harden_icmp yes
	doopt log_martians yes

	/etc/init.d/firewall start
        echo -n "Configuring network interfaces..."
        ifup -a
	echo "done."
	;;
    stop)
        if sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\1 \2/p' /proc/mounts | 
          grep -q "^/ nfs$"; then
            echo "NOT deconfiguring network interfaces: / is an NFS mount"
        elif sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\1 \2/p' /proc/mounts |  
          grep -q "^/ smbfs$"; then
            echo "NOT deconfiguring network interfaces: / is an SMB mount"
	elif sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\2/p' /proc/mounts | 
          grep -qE '^(nfs[1234]?|smbfs|ncp|ncpfs|coda|cifs)$'; then
            echo "NOT deconfiguring network interfaces: network shares still mounted."
        else
            echo -n "Deconfiguring network interfaces..."
            ifdown -a --exclude=lo
	    echo "done."
	    /etc/init.d/firewall stop
        fi
	;;
    force-reload|restart)
	doopt spoofprotect yes
        doopt syncookies no
        doopt ip_forward no
	doopt no_redirects yes
	doopt no_source_routed yes
	doopt harden_icmp yes
	doopt log_martians yes

        echo -n "Reconfiguring network interfaces..."
        ifdown -a --exclude=lo
	/etc/init.d/firewall restart
        ifup -a
	echo "done."
	;;
    *)
	echo "Usage: /etc/init.d/networking {start|stop|restart|force-reload}"
	exit 1
	;;
esac

exit 0


Reply to: