и вновь iptables (использование squid trans... на тачке с поднятым pptp)

Вот решил докрутить инет почеловечески. Возникло несколько проблем привожу:

Скриптик для iptables: написал(а):
#!/bin/bash

IPT="/sbin/iptables"
AWK="/usr/bin/awk"
SED="/bin/sed"
IFC="/sbin/ifconfig"
GREP="/bin/grep"
ECHO="/bin/echo"

export LC_ALL="en_US.utf8"

POLICY="DROP"

#/sbin/depmod -a

echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/ip_forward

CHAINS=`cat /proc/net/ip_tables_names 2>/dev/null`
for i in $CHAINS
do
$IPT -t $i -F
done
for i in $CHAINS
do
$IPT -t $i -X
done

$IPT -P INPUT $POLICY
$IPT -P FORWARD $POLICY
$IPT -P OUTPUT $POLICY

#$IPT -P INPUT ACCEPT
#$IPT -P FORWARD ACCEPT
#$IPT -P OUTPUT ACCEPT

LAN_IFACE="eth0"
LAN_IP="192.168.1.100"
LAN_RANGE="192.168.1.0/24"

VPN_IFACE="eth1"
#VPN
VPN_IP="`$IFC $VPN_IFACE|$AWK /$VPN_IFACE/'{next}//{split($0,a,":");split(a[2],a," ");print a[1];exit}'`"
VPN_BC="`$IFC $VPN_IFACE|$AWK /$VPN_IFACE/'{next}//{split($0,a,":");split(a[3],a," ");print a[1];exit}'`"
VPN_MSK="`$IFC $VPN_IFACE|$GREP Mask:|$SED 's/.*Mask:\([^ ]*\)/\1/'`"
VPN_MSK="`$IFC $VPN_IFACE|$AWK /$VPN_IFACE/'{next}//{split($0,a,":");split(a[4],a," ");print a[1];exit}'`"
VPN_RANGE="$VPN_IP/$VPN_MSK"
$ECHO "VPN_IFACE=$VPN_IFACE"
$ECHO " VPN_IP=$VPN_IP
VPN_BC=$VPN_BC
VPN_MSK=$VPN_MSK
VPN_RANGE=$VPN_RANGE"

INET_IFACE="ppp0"
#INET
INET_IP="`$IFC $INET_IFACE|$AWK /$INET_IFACE/'{next}//{split($0,a,":");split(a[2],a," ");print a[1];exit}'`"
INET_BC="`$IFC $INET_IFACE|$AWK /$INET_IFACE/'{next}//{split($0,a,":");split(a[3],a," ");print a[1];exit}'`"
INET_MSK="`$IFC $INET_IFACE|$GREP Mask:|$SED 's/.*Mask:\([^ ]*\)/\1/'`"
INET_MSK="`$IFC $INET_IFACE|$AWK /$INET_IFACE/'{next}//{split($0,a,":");split(a[4],a," ");print a[1];exit}'`"
INET_RANGE="$INET_IP/$INET_MSK"
$ECHO "INET_IFACE=$INET_IFACE"
$ECHO " INET_IP=$INET_IP
INET_BC=$INET_BC
INET_MSK=$INET_MSK
INET_RANGE=$INET_RANGE"

LO_IFACE="lo"
LO_IP="127.0.0.1"
LO_RANGE="127.0.0.0/255.0.0.0"
SQUID_TRANSPARENT=$LO_IP

MODULES="ip_tables
ip_conntrack
iptable_filter
iptable_nat
ipt_LOG
iptable_mangle
ipt_limit
xt_state
ip_nat_ftp
ip_conntrack_ftp
ipt_mac
nf_nat_pptp
ip_gre
nf_conntrack_proto_gre
nf_nat_proto_gre"

for i in $MODULES;
do
echo "Inserting module $i"
modprobe $i
done

for f in /proc/sys/net/ipv4/conf/*/rp_filter;
do
echo 1 > $f
done

for f in /proc/sys/net/ipv4/conf/*/accept_source_route;
do
echo 0 > $f
echo 0 > $f
done
for f in /proc/sys/net/ipv4/conf/*/accept_redirects;
do
echo 0 > $f
done

MACs="00:16:36:5d:b4:a3"

$IPT -N allowed
$IPT -N tcp_packets
$IPT -N udp_packets
$IPT -N icmp_in
$IPT -N icmp_out
$IPT -N ssh-in
$IPT -N check_tcp

#CHAIN check_tcp
$IPT -A check_tcp -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPT -A check_tcp -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW not --syn"
$IPT -A check_tcp -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A check_tcp -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j ULOG --ulog-prefix "NMAP-XMAS"
$IPT -A check_tcp -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A check_tcp -p tcp --tcp-flags ALL ALL -m limit --limit 5/minute -j ULOG --ulog-prefix "XMAS"
$IPT -A check_tcp -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A check_tcp -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 5/minute -j ULOG --ulog-prefix "XMAS-PSH"
$IPT -A check_tcp -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPT -A check_tcp -p tcp --tcp-flags ALL NONE -m limit --limit 5/minute -j ULOG --ulog-prefix "NULL_SCAN"
$IPT -A check_tcp -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A check_tcp -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j ULOG --ulog-prefix "SYN/RST"
$IPT -A check_tcp -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A check_tcp -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j ULOG --ulog-prefix "SYN/FIN"
$IPT -A check_tcp -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

#CHAIN udp_packets
#$IPT -A udp_packets -p UDP -i $VPN_IFACE -d 255.255.255.255 --destination-port 67:68 -j DROP
#$IPT -A udp_packets -p UDP -d 255.255.255.255 --destination-port 67:68 -j DROP
$IPT -A udp_packets -p UDP --source-port 53 -j ACCEPT

#CHAIN allowed
$IPT -A allowed -m state --state INVALID -m limit --limit 3/minute -j ULOG --ulog-prefix "INVALID"
$IPT -A allowed -m state --state INVALID -j DROP
$IPT -A allowed -p TCP --syn -j ACCEPT
$IPT -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A allowed -p TCP -j DROP

#CHAIN icmp_in
$IPT -A icmp_in -m state --state NEW,ESTABLISHED -p icmp --icmp-type any -j ACCEPT
$IPT -A icmp_in -m state --state NEW,ESTABLISHED -p icmp --icmp-type echo-request -j ACCEPT
$IPT -A icmp_in -m state --state NEW,ESTABLISHED,RELATED,INVALID -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A icmp_in -m state --state NEW,ESTABLISHED,RELATED,INVALID -p icmp --icmp-type destination-unreachable -j ACCEPT
# $IPT -A icmp_in -p icmp -j LOG --log-prefix "Bad in ICMP-"

#CHAIN icmp_out
$IPT -A icmp_out -p icmp --icmp-type any -j ACCEPT
$IPT -A icmp_out -p icmp --icmp-type echo-request -j ACCEPT
$IPT -A icmp_out -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A icmp_out -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT
# $IPT -A icmp_out -p icmp -j LOG --log-prefix "Bad out ICMP-"

#CHAIN ssh_in
$IPT -A ssh-in -p tcp --dport 22 -j ACCEPT
$IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL RST --dport ssh -j ACCEPT
$IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL FIN --dport ssh -j ACCEPT
$IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL SYN --dport ssh -j ACCEPT
$IPT -A ssh-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT

for i in $MACs;
do
echo "Masquerade to $i"
$IPT -t mangle -A PREROUTING -m mac --mac-source $i -j MARK --set-mark 1
done

$IPT -t nat -A POSTROUTING -p ALL -m mark --mark 1 -s $LAN_RANGE -o $INET_IFACE -j MASQUERADE

$IPT -A INPUT -p TCP -j check_tcp
$IPT -A INPUT ! -i $VPN_IFACE -p ICMP -j icmp_in
$IPT -A INPUT -p ALL -i $LO_IFACE -d $LO_RANGE -j ACCEPT
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPT -A INPUT -p UDP -i $LAN_IFACE -j udp_packets
$IPT -A INPUT -p UDP -s $LAN_RANGE -j udp_packets
$IPT -A INPUT -p TCP --dport 22 -j ssh-in
$IPT -A INPUT -p GRE -i $VPN_IFACE -d $VPN_IP -s 10.0.0.3 -j ACCEPT
$IPT -A INPUT -j allowed

$IPT -A OUTPUT -j check_tcp
$IPT -A OUTPUT ! -o $VPN_IFACE -p ICMP -j icmp_out
$IPT -A OUTPUT -p UDP -o $INET_IFACE --destination-port 53 -j ACCEPT
$IPT -A OUTPUT -p GRE -o $VPN_IFACE -s $VPN_IP -d 10.0.0.3 -j ACCEPT
$IPT -A OUTPUT -p TCP -o $VPN_IFACE -s $VPN_IP -d 10.0.0.3 --destination-port 1723 -j ACCEPT
$IPT -A OUTPUT -o $LO_IFACE -j ACCEPT
$IPT -A OUTPUT -j allowed

$IPT -A FORWARD -j check_tcp
$IPT -A FORWARD -p ICMP -j icmp_in
$IPT -A FORWARD -o $LO_IFACE -d $LO_RANGE -j ACCEPT
$IPT -A FORWARD -p GRE -i $VPN_IFACE -j ACCEPT
$IPT -A FORWARD -p UDP -i $LAN_IFACE -o $INET_IFACE -s $LAN_RANGE --dport 53 -j ACCEPT
$IPT -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_RANGE --sport 53 -j ACCEPT
$IPT -A FORWARD -j LOG --log-prefix "FORWARD"
$IPT -A FORWARD -j allowed

вот собственно вопросы:
1. почему-то при пинге с этой же машины на локальный интерфейс eth0 (192.168.1.100) iptables определяет --icmp-type=0, а не echo-request(8), при чем и при получении и при отправке заголовке icmp заголовки не правильно определяются или формируются. пинг подвисает не выдавая не чего.

привожу лог dmesg: написал(а):
Bad out ICMP-IN= OUT=lo SRC=192.168.1.100 DST=192.168.1.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=20201 PROTO=ICMP TYPE=0 CODE=0 ID=42014 SEQ=7
Bad in ICMP-IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=192.168.1.100 DST=192.168.1.100 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=20201 PROTO=ICMP TYPE=0 CODE=0 ID=42014 SEQ=7

если выставить несуществующий адрес, например 192.168.1.103 команда пинг возвращает значение Destination Host Unreachable

2. на тачке поднят pptp через VPN_IFACE. обычно во всех мануалах и статьях используются настройки прозрачного проксирования через squid на шлюзе через dnat и redirect, но как сделать на самом шлюзе чтобы инет шел через squid а не напрямую через ppp0 интерфейс.
при использовании PREROUTING не работает dport 80 так как, при отправке пакеты tcp инкапсулируются в gre, а из них iptables не может вытащить tcp пакет и перенаправить в squid.

ps: c icmp заколебся уже, поэтому поставил any (0), в этом режиме работает.

вот че показывает iptables -L -v -n:

Цитата:
Chain icmp_in (2 references)
pkts bytes target prot opt in out source destination
4 336 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED icmp type 8
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID,NEW,RELATED,ESTABLISHED icmp type 11
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID,NEW,RELATED,ESTABLISHED icmp type 3
4 336 LOG icmp -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `Bad in ICMP-'

Chain icmp_out (1 references)
pkts bytes target prot opt in out source destination
4 336 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW icmp type 11
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW icmp type 3
4 336 LOG icmp -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `Bad out ICMP-'

заметте попав в цепочку один пакет отмечается сразу в двух местах и в ACCEPT и в LOG, как такое возможно?
3. вот еще правила туда обратно, типа:
$IPT -A FORWARD -p UDP -i $LAN_IFACE -o $INET_IFACE -s $LAN_RANGE --dport 53 -j ACCEPT
$IPT -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_RANGE --sport 53 -j ACCEPT
может можно как нибудь заменить покороче?
занее спасибо.