теория оно конечно хорошо, но уж больно не терпелось перейти к практической реализации полученных знаний. ну и нифига не получается \=
Код: Выделить всё
#!/bin/sh
### BEGIN INIT INFO
# Provides: iptables
# Required-Start: $syslog $network $time
# Required-Stop: $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 6
# Short-Description: Start firewall at boot time
# Description: Enable service provided by iptables.
### END INIT INFO
#IPTables Configuration.
ipfw='/sbin/iptables'
#Local Area Network configuration
#lan0_ip='192.168.1.24'
#lan0_ip_range='192.168.1.0/24'
lan_broadcast='192.168.1.255'
#if0='eth0'
lan1_ip='192.168.1.25'
lan1_ip_range='192.168.1.0/24'
if1='eth1'
#Localhost Configuration
lo='lo'
lo_ip='127.0.0.1'
start_fw()
{
$ipfw -F
$ipfw -X
###########################################################################
#
# 4. rules set up.
#
######
# 4.1 Filter table
#
#
# 4.1.1 Set policies
#
$ipfw -P INPUT DROP
$ipfw -P OUTPUT DROP
$ipfw -P FORWARD DROP
#
# 4.1.2 Create userspecified chains
#
#
# Create chain for bad tcp packets
#
$ipfw -N bad_tcp_packets
#
# Create separate chains for ICMP, TCP and UDP to traverse
#
$ipfw -N allowed
$ipfw -N tcp_packets
$ipfw -N udp_packets
$ipfw -N icmp_packets
#
# 4.1.3 Create content in userspecified chains
#
#
# bad_tcp_packets chain
#
$ipfw -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$ipfw -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
$ipfw -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
#
# allowed chain
#
$ipfw -A allowed -p TCP --syn -j ACCEPT
$ipfw -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$ipfw -A allowed -p TCP -j DROP
#
# TCP rules
#
$ipfw -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
#
# UDP ports
#
$ipfw -A udp_packets -p UDP -s 0/0 --dport 53 -j ACCEPT
$ipfw -A udp_packets -p UDP -s 0/0 --dport 123 -j ACCEPT
#$ipfw -A udp_packets -p UDP -i $if1 --dport 67:68 -j ACCEPT
#
# ICMP rules
#
$ipfw -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$ipfw -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
#
# 4.1.4 INPUT chain
#
#
# Bad TCP packets we don't want.
#
$ipfw -A INPUT -p tcp -j bad_tcp_packets
#
# Rules for networks
#
$ipfw -A INPUT -p ALL -i $if1 -s $lan1_ip_range -j ACCEPT
$ipfw -A INPUT -p ALL -i $lo -s $lo_ip -j ACCEPT
$ipfw -A INPUT -p ALL -i $lo -s $lan1_ip -j ACCEPT
#
# Rules for incoming packets from the lan.
#
$ipfw -A INPUT -p ALL -d $lan1_ip -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$ipfw -A INPUT -p TCP -i $if1 -j tcp_packets
$ipfw -A INPUT -p UDP -i $if1 -j udp_packets
$ipfw -A INPUT -p ICMP -i $if1 -j icmp_packets
# 4.1.6 OUTPUT chain
$ipfw -A OUTPUT -p tcp -j bad_tcp_packets
$ipfw -A OUTPUT -p ALL -i $lo -j ACCEPT
$ipfw -A OUTPUT -p ALL -i $if1 -j ACCEPT
}
case "$1" in
start) echo -n "Starting firewall: iptables"
start_fw
echo "."
;;
stop) echo -n "Stopping firewall: iptables"
$ipfw -F
$ipfw -X
$ipfw -P INPUT ACCEPT
$ipfw -P OUTPUT ACCEPT
$ipfw -P FORWARD ACCEPT
echo "."
;;
save) echo -n "Saving firewall: iptables"
iptables-save > /etc/rules-save
echo "."
;;
restart) echo -n "Restarting firewall: iptables"
$ipfw -F
$ipfw -X
cat /etc/rules-save | iptables-restore
echo "."
;;
reload|force-reload) echo -n "Reloading configuration files for firewall: iptables"
echo "."
;;
*) echo "Usage: /etc/init.d/rc.firewall start|stop|restart|reload|force-reload"
exit 1
;;
esac
exit 0
после запуска достучаться на 22 порт машины не представляется возможным. пинг ни на машину, ни с самой машины не ходят. В принципе нового я ничего не придумал, как я понимаю работу этого фаервола: пакет из сети 192.168.1.0/24 пришел на порт 22 сервера sshd (который на машине с фаерволом). Он попадает в цепочку INPUT в которой мы первым правилом отправляем его в цепочку bad_tcp_packets. Бит SYN у нас установлен, состояние NEW присутствует, но нет бита ACK, поэтому в цепочке bad_tcp_packets ни под одно правило наш пакет не попадает и возвращается в цепочку INPUT на следующее правило. А там у нас
$ipfw -A INPUT -p ALL -i $if1 -s $lan1_ip_range -j ACCEPT. Проктокол подходит, интерфейс подходит, источник подходит. т.е. все критерии совпали. Пакет принят. ДАлее он попал к сервису sshd, та произошла черная магия и сервер sshd отправляет ответный пакет с битами SYN/ACK. Попадаем в цепочку OUTPUT. Там переадресуется на цепочку bad_tcp_packets, где не попав ни под один критерий, т.к. состояние уже меняется на ESTABLISHED, через правило
$ipfw -A OUTPUT -p ALL -i $if1 -j ACCEPT улетает к "клиенту". Однако не работает!
Код: Выделить всё
#iptables -L -Z -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
3 144 bad_tcp_packets tcp -- any any anywhere anywhere
6 1194 ACCEPT all -- eth1 any localnet/24 anywhere
0 0 ACCEPT all -- lo any localhost anywhere
0 0 ACCEPT all -- lo any debian.vlgsi anywhere
0 0 ACCEPT all -- any any anywhere debian.vlgsi state NEW,RELATED,ESTABLISHED
0 0 tcp_packets tcp -- eth1 any anywhere anywhere
0 0 udp_packets udp -- eth1 any anywhere anywhere
0 0 icmp_packets icmp -- eth1 any anywhere anywhere
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 16 packets, 6372 bytes)
pkts bytes target prot opt in out source destination
16 6372 bad_tcp_packets tcp -- any any anywhere anywhere
Chain allowed (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- any any anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN
0 0 ACCEPT tcp -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 DROP tcp -- any any anywhere anywhere
Chain bad_tcp_packets (2 references)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- any any anywhere anywhere tcp flags:SYN,ACK/SYN,ACK state NEW reject-with tcp-reset
0 0 LOG tcp -- any any anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW LOG level warning prefix `New not syn:'
0 0 DROP tcp -- any any anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
Chain icmp_packets (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
0 0 ACCEPT icmp -- any any anywhere anywhere icmp time-exceeded
Chain tcp_packets (1 references)
pkts bytes target prot opt in out source destination
0 0 allowed tcp -- any any anywhere anywhere tcp dpt:ssh
Chain udp_packets (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- any any anywhere anywhere udp dpt:domain
0 0 ACCEPT udp -- any any anywhere anywhere udp dpt:ntp
Zeroing chain `INPUT'
Zeroing chain `FORWARD'
Zeroing chain `OUTPUT'
Zeroing chain `allowed'
Zeroing chain `bad_tcp_packets'
Zeroing chain `icmp_packets'
Zeroing chain `tcp_packets'
Zeroing chain `udp_packets'
что не так?
