RSS
 

Debian iptables firewall bash script

Статья, а точнее скрипт разчитан на тех кто понимает что делает 🙂 ну или жаждет разобраться.

Это простой скрипт для шлюза с двумя интерфейсами: один в интернет, другой в локалку. Все необходимые комментарии в самом скрипте.

Начинаем, потребуетстя любой текстовый ректор vi, vim, kate, gedit

#!/bin/sh

wan_ip= «81.12.123.180»

wan_if= «eth1»

lan_ip= «192.168.0.1»

lan_if= «eth0»

lo_if= «lo»

lo_ip= «127.0.0.1»

dc= «192.168.0.10»

db= «192.168.0.11»

itchief= «192.168.0.12»

IPTABLES = «/sbin/iptables»

# Загружаем необходимые модули
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state

# Включаем пересылку пакетов между сетевыми интерфейсами.
echo «1» > /proc/sys/net/ipv4/ip_forward

# Защита от Syn флуда
echo «1» > /proc/sys/net/ipv4/tcp_syncookies

# Перед применением новых правил удалим старые
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F

# Устанавливаем политики по умолчанию. ACCEPT для Output может показаться не
# особо правильным, но я так не считаю )) т.к. у меня четко настроеный линуксовый
# шлюз, а не зараженная виндовая машина.
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

##############  INPUT chain ################

# Bad TCP packets we don’t want
$IPTABLES -A INPUT -p tcp —tcp-flags SYN,ACK SYN,ACK -m state —state NEW -j REJECT —reject-with tcp-reset
$IPTABLES -A INPUT -p tcp ! —syn -m state —state NEW -j DROP

# Loopback
$IPTABLES -A INPUT -p ALL -i $lo_if -s $lo_ip -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $lo_if -s $lan_ip -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $lo_if -s $wan_ip -j ACCEPT

# Rules for LAN
# На внутреннем интерфейсе разрешаем весь входящитй трафик.
# Можно сделать жестче: разрешить только определенные порты и протоколы,
# указать подсети.
$IPTABLES -A INPUT -p ALL -i $lan_if -j ACCEPT

# Rules for Internet.
$IPTABLES -A INPUT -p ICMP -i $wan_if —icmp-type echo-request -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $wan_ip -m state —state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $wan_if —dport 22 -j ACCEPT
$IPTABLES -A INPUT -p UDP -i $wan_if —dport 53 -j ACCEPT

# Пишем в лог зарубленные пакеты
$IPTABLES -A INPUT -m limit —limit 3/minute —limit-burst 3 -j LOG —log-level info —log-prefix «IPTABLES INPUT blocked: »

############### FORWARD chain ################

# Bad TCP packets we don’t want
$IPTABLES -A FORWARD -p tcp —tcp-flags SYN,ACK SYN,ACK -m state —state NEW -j REJECT —reject-with tcp-reset
$IPTABLES -A FORWARD -p tcp ! —syn -m state —state NEW -j DROP

# Rules for LAN
# Даем для пк локалки выход в инет по определенным портам.
# Себе любимому полный доступ.
$IPTABLES -A FORWARD -p ICMP -i $lan_if -j ACCEPT
$IPTABLES -A FORWARD -p ALL -i $lan_if -o $lan_if -j ACCEPT
$IPTABLES -A FORWARD -m state —state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -p TCP -i $lan_if —dport 5190 -j ACCEPT
$IPTABLES -A FORWARD -p TCP -i $lan_if —dport 3389 -j ACCEPT
$IPTABLES -A FORWARD -p TCP -s $itchief -i $lan_if -j ACCEPT

# Rules for Internet.
# Доступ к внутренним серверам. DNAT для них чуть дальше.
$IPTABLES -A FORWARD -i $wan_if -d $dс -p tcp —dport 4899 -j ACCEPT
$IPTABLES -A FORWARD -i $wan_if -d $db -p tcp —dport 3389 -j ACCEPT

# Пишем в лог зарубленные пакеты
$IPTABLES -A FORWARD -m limit —limit 3/minute —limit-burst 3 -j LOG —log-level info —log-prefix «IPTABLES FORWARD blocked: »

############### NAT table ################

# Собственно сам NAT на выходе с внешнего интерфейса
$IPTABLES -t nat -A POSTROUTING -o $wan_if -j MASQUERADE

# Проброс портов на внутренние серверы
$IPTABLES -t nat -A PREROUTING -p TCP -i $wan_if —dport 2222 -j DNAT —to-destination $dc:4899
$IPTABLES -t nat -A PREROUTING -p TCP -i $wan_if —dport 3333 -j DNAT —to-destination $db:3389

echo «Iptables rules reloaded!»

Делаем скрипт исполняемым chmod +x iptables.sh, кидаем его, или линк на него, в /etc/network/if-pre-up.d

Оставить комментарий