--cat-rc.firewall---
#!/bin/bash
IF_INT="eth1"
IF_EXT="eth0"
IPADDR=`ifconfig $IF_EXT|grep "inet addr"|awk -F" " -- '{print($2)}'|awk -F":" -- '{print($2)}'`
IPINT=`ifconfig $IF_INT|grep "inet addr"|awk -F" " -- '{print($2)}'|awk -F":" -- '{print($2)}'`
LOCALNET=$IPINT/24
ROUTER=`ifconfig|grep "inet addr"|awk -F" " -- '{print($2)}'|awk -F":" -- '{print($2)}'`
LOOPBACK=`ifconfig lo|grep "inet addr"|awk -F" " -- '{print($2)}'|awk -F":" -- '{print($2)}'`
IPT="/usr/sbin/iptables"
ECHO="/usr/bin/echo"
TRUSTED_HOSTS="192.168.x.2 192.168.x.3..."
MASQUERADE_HOSTS="192.168.x.4 192.168.x.5..."
# Open port for outside
IV_PORTS="25 110"
IV_ICMP="echo-request"
# Open port for external connection
PUBLIC_PORTS="22"
PUBLIC_ICMP="echo-request"
EXCLUDE_HOST="192.168.x.5 192.168.x.6"
EXCLUDE_PORT="15515 15516"
case "$1" in
'stop')
# Clear all chains/tables
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -X TCP_FLAGS
$IPT -X ACCT
$IPT -X $IF_EXT
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
;;
'start')
# Calculating all traffic
$IPT -N ACCT
$IPT -A ACCT -j RETURN
$IPT -A ACCT -j RETURN
$IPT -A INPUT -i $IF_EXT -j ACCT
$IPT -A OUTPUT -o $IF_EXT -j ACCT
$IPT -P INPUT DROP ## Рули по умолчанию
$IPT -P FORWARD DROP ## Рули по умолчанию
$IPT -P OUTPUT ACCEPT ## Рули по умолчанию
# All for himself, but througth loopback
for host in $ROUTER
do
$IPT -A INPUT -s $host -i lo -j ACCEPT
done
# Trusted hosts allow all
for host in $TRUSTED_HOSTS
do
$IPT -A FORWARD -d $host -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -s $host -o $IF_EXT -j SNAT --to $IPADDR
$IPT -A FORWARD -s $host -j ACCEPT
done
# Accept only right packets
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
for host in $MASQUERADE_HOSTS
do
$IPT -t nat -A POSTROUTING -p icmp -s $host -o $IF_EXT -j SNAT --to $IPADDR
$IPT -A FORWARD -d $host -m state --state ESTABLISHED,RELATED -j ACCEPT
for port in $IV_PORTS
do
for proto in tcp udp
do
$IPT -t nat -A POSTROUTING -p $proto -s $host -o $IF_EXT --dport $port -j SNAT --to $IPADDR
done
done
$IPT -A FORWARD -s $host -j ACCEPT
done
#Exclude hosts:
for host in $EXCLUDE_HOST
do
for port in $EXCLUDE_PORT
do
for proto in tcp udp
do
$IPT -t nat -A POSTROUTING -p $proto -s $host -o $IF_EXT --dport $port -j SNAT
--to $IPADDR
done
done
done
# $IPT -A INPUT -i $IF_EXT -s ! $LOCALNET -p icmp -j REJECT - раскомментировать, если не хотите, чтобы сервер снаружи откликался на пинги
# "паранойя"

)
$IPT -N TCP_FLAGS
$IPT -F TCP_FLAGS
$IPT -A TCP_FLAGS -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A TCP_FLAGS -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A TCP_FLAGS -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -A TCP_FLAGS -p tcp --tcp-option 64 -j DROP
$IPT -A TCP_FLAGS -p tcp --tcp-option 128 -j DROP
$IPT -A INPUT -i $IF_EXT -p tcp -j TCP_FLAGS
# Rules for outside
for port in $PUBLIC_PORTS
do
for proto in tcp udp
do
$IPT -A INPUT -p $proto --dport $port -m state --state NEW -j ACCEPT
done
done
for type in $PUBLIC_ICMP
do
$IPT -A INPUT -p icmp --icmp-type $type -j ACCEPT
done
# Rules for inside
$IPT -A INPUT -s $LOCALNET -j ACCEPT
$IPT -N $IF_EXT
$IPT -A $IF_EXT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A $IF_EXT -m state --state NEW -i ! $IF_EXT -j ACCEPT
# $IPT -A $IF_EXT -i $IF_EXT -m limit -j LOG --log-prefix "Bad packet from $IF_EXT:"
# $IPT -A $IF_EXT -i ! $IF_EXT -m limit -j LOG --log-prefix "Bad packet not from $IF_EXT:"
$IPT -A INPUT -j $IF_EXT
$IPT -A FORWARD -j $IF_EXT
;;
'restart')
$0 stop && $0 start
;;
*)
echo "usage $0 start|stop|restart"
;;
esac
---end-of-cat-rc.firewall
IF_INT - внутренний интерфейс
IF_EXT - внешний
TRUSTED_HOSTS - доверенные хосты(которым порты не режутся)
MASQ_HOSTS - все остальные, которым можно ходить по портам, опиманным в IV_PORTS
PUBLIC_PORTS - порты, которые будут видны снаружи
EXCLUDE_HOST - хосты из локалки, которым нужны дополнительные порты(EXCLUDE_PORT - например, какие-нть банковские системы)