Въпрос за iptables?

2 отговора 199 прегледа
#1

Въпрос за iptables?

Здравейте и честита Коледа!
Искам да питам за нещо, което не разбирам, но все пак успях да подкарам. Става на въпрос за рутиране на интернет към компа на дъщерята . Условията - дистрото изпълняващо ролята и на рутер е Debian Sarge, кърнъл 2.6.8, интернета - DSL/PPPoE и TTL=1. Първо започвам с компилирането на новото ядро. Предпочетох да си направя ново, а не да добавям модул към старото, защото ако се оакам (както доста често правят начинаещите) да си ми стои непокътнато работещото. Какво направих?
1) Изчетох тонове литература
2) Свалих изходните кодове на кърнъла (2.6.8 sarge1), iptables 1.3.3 и patch-o-matic -ng-20040621 (доста е старо, но го имам от преди, а сега май вече не е достъпно за сваляне) . По неизвестни за мен причини най-новата версия (20051223) нямаше пач за ттл. Разархивирах ги в /usr/src, направих си символни връзки към тях (като не се справям бързо с писането ), и пачнах ядрото само с ттл-а. В /usr/src/linux/Makefile зададох extraversion да е -2-k7+ttl (защото ядрото ми е 2.6.8-2-к7, а новото ще е пълно негово копие (с make oldconfig)) и запретнах ръкави. Пиша по спомени и с неизвестни (за самия мен), но това се случи преди 2 седмици. И така - make oldconfig и бях попитан единствено за ттл пач-а. От къде прочете отговорите на останалите въпроси е загадка за мен, защото в /usr/src/linux при първа компилация от този сорс не би трябвало (поне според мен) да има .config, а и вчера (когато направих всичко отначало и на чисто) нямаше. Мислех си, че е намерило в /boot config-а, който се инсталира с ядрото, но и това май не е, защото вчера не поиска (oldconfig започна с въпросите от първия, но config-овете в /boot вече бяха 2 (за 386 (по подразбиране) и за к7), а не помня преди 2 седмици дали бях инсталирал ядрото за к7 - може и това да има значение, знам ли? Ако някой знае нека каже - опитвам се да направя връзките "кое от къде и защо". Продължавам нататък - make dep и компа отговори "This is unnesesary now", което аз си го превеждам като "това не е необходимо сега (вече?) ". Статиите, от които четох са стари (за 2.2 и 2.4 ядра) и може вече да не е необходимо. Следва make bzImage module module_install, което мина без нито един FATAL и само няколко предупреждения (които според статиите не трябва да будят безпокойство) и продължих нататък. Копирах в /boot bzImage (като vmlinuz-2.6.8-2-k7+ttl) и System.map (estestweno s с неободимите цифрички отзад ) и се заех с редактирането на menu.lst на grub-а и чак тогава се сетих за initrd (ако някой ми обясни накратко и без много подробности какво прави този рам драив, кога и защо е необходим преди да ми каже google->initrd (za da imam nqkakwa predstawa i predwaritelna podgotowka), цена няма да има. И така реших, че понеже ядрото е само с един модул различно от досегашното то стария инитрд може и да го подкара (а и какво друго ми оставаше след като бях вече компилирал ядрото), но първо пробвах без него (винаги започвам с най-невъзможните неща, за да се убедя, че так наистина не става. Резултатът - "не знам кое е sda7, блок 0,0 и немога да монтирам руут файловата система (или нещо подобно, ако преводът ми изобщо има нещо общо с истината). Това се и очакваше, така че рестартирах и разкоментирах реда
initrd /boot/iinitrd.img-2.6.8-2-k7 (т.е. на работещото ядро),
но не би. Резултатът - modprobe: fatal /lib/module/2.6.8-2-k7+ttl/module.dep - No sush file or directory - а файла си го имаше, по дяволите!
Вчера намерих друга статия, която беше за apt-build, но накратко се споменаваше и за kernel-package и за това как да си направим инитрд (ако ползваме - сякаш имаме избор ). Реших да започна отново и на чисто и след като затърках директорите със сорсовете (без tar.bz2 файловете) започнах отново, само че този път с "make-kpkg --config oldconfig --initrd kernel_image" и както писах по-горе започна с въпросите отначало. ^c и този път "make-kpkg --config menuconfig --initrd kernel_image" (като предварително бях инсталирал libncurses5-dev) и той знаеше дефолтните отговори (от къде?), но никъде не видях ттл пач-а, за да го конфигурирам, и пак ^c. С cp /boot/config-2.6.8-2-k7 /usr/src/linux/.config и make-kpkg --config oldconfig --initrd kernel_image реших проблема. От там нататък проблеми с ядрото нямах.
Започва стадии 2 - iptables. Тук мъглата е почти непрогледна. Какво имам в предвид? Например правилото iptables -t mangle -A POSTROUTING -o ppp0 -j TTL --ttl-set 128 (koeto napisah sam ) буквално означава "таблицата за промяна на TOS, след рутиране, изходен интерфеис ppp0, цел ттл, установяване на стойност 128" какво точно прави? Най-много ме смущават понятията "преди" и "след" рутиране, защото това са посоки зависещи от направлението на пакета (т.е. ако при входящ пакет е "преди", то при изходящ е "след"), Може ли типа на интерфеиса (входящ/изходящ) да е указател за посоката на движение на пакета и спрямо нея да се определя преди/след, макар, че комбинациите преди- изходящ и след-входящ не са позволени, но все пак искам да го чуя от устата на човек, който знае какво говори, а не като мен - само предполага. И така, изпълнява ли се замисъла ми, всички пакети излизащи от рутера да са с ттл=128. Все пак имам 4 компа с линукс и уиндоуз ( и 5-ти, който в бъдеще ще бъде само рутер), макар че 1-ия за сега въобще не се пуска (не съм намерил работа на жена ми, а тя се придържа към правилото "колкото по-далече, толкова по-добре"), а лаптопа избягвам да го пускам в интернет - има данни, които ако се прецакат може доста сериозно да пострада семейния (а за фирмения да не говорим) бюджет, но все пак мисля в перспектива. И така, ако към ИСП-то ми почнат да ходят пакети които си сменят ттл-а за по-малко от минута, ще му е безпределно ясно какво става. И в този ред на мисли как мога да контролирам и променям mtu-то в УиндоузХП? Знам, че това не е този форум, но вие сте спецове .
И сега най-сериозния проблем, на който за сега не намирам решение. Забравих да уточня топологията на "мрежата" - към компа ми, който освен рутер, активно изъплнява и ролята на работна станция, чрез кроснат кабел е свързан този на дъщеря ми. Пакетите предназначени за моя не подлежат на рутиране,а тези към другия - да, За да стигнат до него трябва да инкрементирам ттл-а преди рутиране, но пакетите за моя комп стават с ттл=2 и не умират, а това също е сигнал (до колкото сванах) за исп-то. Сега ще copy/paste един файл, чието съдржание (като изключим 1-ия и последните 2 реда, който са мои) е съвсем леко модифициран firewall.ini от дискетното дистро floppyfw-2.9.13-pppoe. Модификацията се състой в това, че са коментирани 3 реда обръщащи се към липсващи при мене файлове, задаване на вярните за мене стоиности на мрежи, маски, интерфеиси и замяна на променливи дефинирани в други файлове с конкретните стойности. Не съм променял таблици, вериги, цели, политики и т.н. Истината е, че като изключим 4-5 реда другите нищо не ми говорят , няма да е зле с по-няколко думи да ми разясните за какво иде реч . Малко нахално, ама 4 часа писане да отидат на кино ще е много гадно . Ето го и самият файл:

ifconfig eth0 up 192.168.0.1

#!/bin/sh

# $Id: firewall.ini,v 1.2 2004/10/17 13:29:42 thomasez Exp $

# If you want the box to just act as a router, uncomment the 2 lines below
#echo 1 > /proc/sys/net/ipv4/ip_forward
#exit 0
#
# Firewall setup.
#

#. /etc/config


#
# Do you want to do port forwaring to an internal server?
# Set the server IP here and sort out the port stuff later in this file.
#
SERVER_IP=192.168.0.1

#
# Stopping forwarding (this script may be run during normal uptime because
# for re-lease of HDCP or demand dialing / PPPoE.
#
echo "0" > /proc/sys/net/ipv4/ip_forward

#
# Overriding the /etc/config and adding additional information.
#
#. /etc/outside.info
#. /etc/inside.info

#
# Brad suggested this:
# And he suggested to check and maybe change the formatting.
# We'll do that later.
#
echo "Starting firewall with the following config:"
echo
echo " Inside Outside"
echo " Physical device: ${INSIDE_DEV} ${OUTSIDE_DEV}"
echo " Logical device: ${INSIDE_DEVICE} ${OUTSIDE_DEVICE}"
echo " Network: ${INSIDE_NETWORK} ${OUTSIDE_NETWORK}"
echo " IP Address: ${INSIDE_IP} ${OUTSIDE_IP}"
echo " Netmask: ${INSIDE_NETMASK} ${OUTSIDE_NETMASK}"
echo " Broadcast: ${INSIDE_BROADCAST} ${OUTSIDE_BROADCAST}"
echo " Gateway: [None Set] ${OUTSIDE_GATEWAY}"
echo

#
# Flushing the chains.
#

iptables -F
iptables -X
iptables -Z
for i in `cat /proc/net/ip_tables_names`
do
iptables -F -t $i
iptables -X -t $i
iptables -Z -t $i
done


#
# Policy for chains DROP everything
#

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#
# SYN-Flooding protection
# Looks good and nicked from a firewall script mentioned on floppyfw.something.
# Didn't work that well..
#
iptables -N syn-flood
iptables -A INPUT -i ppp0 -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
# Make sure NEW tcp connections are SYN packets
iptables -A INPUT -i ppp0 -p tcp ! --syn -m state --state NEW -j DROP


#
# Good old masquerading.
#
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o ppp0 -j MASQUERADE

#
# Forwarding outside ports to an internal server.
# This used to be the ipchains / ipmasqadm portfw commad.
#
# SSH:

#iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 22 -j DNAT --to ${SERVER_IP}:22
#iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 22 -o ${INSIDE_DEVICE} -j ACCEPT


# Web:
#iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 80 -j DNAT --to ${SERVER_IP}:80
#iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 80 -o ${INSIDE_DEVICE} -j ACCEPT
# This rule helps the "I can't reach my web server from the inside" problem.
#iptables -A POSTROUTING -t nat -p tcp -d ${SERVER_IP} --dport 80 -s ${INSIDE_NETWORK}/${INSIDE_NETMASK} -j SNAT --to ${OUTSIDE_IP}

# FTP:

#iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 21 -j DNAT --to ${SERVER_IP}:21
#iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 21 -o ${INSIDE_DEVICE} -j ACCEPT

# SMTP (Internal mail server):
#iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 25 -j DNAT --to ${SERVER_IP}:25
#iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 25 -o ${INSIDE_DEVICE} -j ACCEPT
# This rule helps the "I can't reach my server from the inside" problem.
#iptables -A POSTROUTING -t nat -p tcp -d ${SERVER_IP} --dport 25 -s ${INSIDE_NETWORK} -j SNAT --to ${OUTSIDE_IP}

#
# Keep state and open up for outgoing connections.
#
iptables -A FORWARD -m state --state NEW -i eth0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW,INVALID -i ppp0 -j DROP

#
# This is mainly for PPPoE usage but it won't hurt anyway so we'll just
# keep it here.
#
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

#
# We don't like the NetBIOS and Samba leaking..
#
iptables -t nat -A PREROUTING -p TCP --dport 135:139 -j DROP
iptables -t nat -A PREROUTING -p UDP --dport 137:139 -j DROP
iptables -t nat -A PREROUTING -p TCP --dport 445 -j DROP
iptables -t nat -A PREROUTING -p UDP --dport 445 -j DROP


#
# We would like to ask for names from our floppyfw box
#
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# Ping and friends.
iptables -A OUTPUT -p icmp -j ACCEPT # to both sides.
iptables -A INPUT -p icmp -j ACCEPT

# And also, DHCP, but we can basically accept anything from the inside.
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT
# And also accept talking to ourself.
iptables -A INPUT -i lo -j ACCEPT

#
# If the user wants to have the fake identd running, the identd has to
# be able to answer.
#
if [ ${FAKEIDENT} ]
then
iptables -A INPUT -p TCP --dport 113 -i ppp0 -j ACCEPT
else
iptables -A INPUT -p TCP --dport 113 -i ppp0 -j REJECT --reject-with tcp-reset
fi



#
# This will also help:
# It does look weird but it is explained here:
# [линк]
#
# The "240Kbit" rate should be set at "a tad less than the speedn you have"
# 240Kbit is for my 256Kbit "upload"-link.
#
# tc qdisc add dev $OUTSIDE_DEVICE root tbf rate 240kbit latency 50ms burst 1540

# Or maybe you chose to use Wondershaper?
if [ $WONDER_SHAPER = "y" ]
then
/sbin/wshaper.htb
else
#
# And, some attempt to get interactive sesions a bit more interactive
# under load:
#
iptables -A PREROUTING -t mangle -p tcp --sport ssh -j TOS --set-tos Minimize-Delay
iptables -A PREROUTING -t mangle -p tcp --sport ftp -j TOS --set-tos Minimize-Delay
# iptables -A PREROUTING -t mangle -p tcp --sport ftp-data -j TOS --set-tos Maximize-Throughput

fi

#
# DMZ Stuff goes here:
#

if [ -f /etc/dmz.info ];
then
echo "Setting up DMZ."
. /etc/dmz.info
iptables -N dmz
if [ "$DMZ_USE_NAT" = "y" ]
then
iptables -t nat -A POSTROUTING -s ${DMZ_NETWORK}/${DMZ_NETMASK} -o ${OUTSIDE_DEVICE} -j MASQUERADE
fi


fi


#
# Finally, list what we have
#
#
iptables -L

# If broken DNS:
#iptables -L -n

#
# The insert stuff into the kernel (ipsysctl) - section:
#
# Some of there goes under the "Better safe than sorry" - banner.
#


#
# This enables dynamic IP address following
#
echo 7 > /proc/sys/net/ipv4/ip_dynaddr

#
# trying to stop some smurf attacks.
#
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#
# Don't accept source routed packets.
#
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

#
# Syncookies (if they are really needed any more?)
#
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

#
# We don't like IP spoofing,
#
if [ -f /proc/sys/net/ipv4/conf/all/rp_filter ]
then
# These two are redundant but I'll kepp'em here for now.
# Will remind me that I can add the first one somewhere smart later.
echo "1" > /proc/sys/net/ipv4/conf/default/rp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter

# while read filter
# do
# echo "1" > $filter
# done < `find /proc/sys/net/ipv4/conf -name rp_filter -print`
else
echo "Anti spoofing is not available, the author of this floppy spoofed, mail him."
fi

#
# nor ICMP redirect,
#

if [ -f /proc/sys/net/ipv4/conf/all/accept_redirects ]
then
echo "0" > /proc/sys/net/ipv4/conf/default/accept_redirects
echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects

# while read accr
# do
# echo -n "fil"
# echo $accr
# echo "fil2"
# echo "0" > $accr
# done < `find /proc/sys/net/ipv4/conf -name accept_redirects -print`

else
echo "Anti spoofing is not available, the author of this floppy spoofed, mail him."
fi

#
# Enable bad error message protection.
#
/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# Maximum limit of ip_conntrack
# This is RAM dependant so be careful with this.
# The max, which is the valuehere, needs around 32M RAM to work properly.
# echo "65535" > /proc/sys/net/ipv4/ip_conntrack_max

#
# This is commented out and will be an option when we have a "LOG_STUFF"
# config option.
# /bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

#
# Rules set, we can enable forwarding in the kernel.
#
echo "Enabling IP forwarding."

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -t mangle -A POSTROUTING -o ppp0 -j TTL --ttl-set 128
iptables -t mangle -A PREROUTING -i ppp0 -j TTL --ttl-inc 1


Много, много, много 10х на тези който стигнаха до тук, а на тези, които отговорят (без да псуват и да дават определения, които не са тяхна работа) - нямам думи

Още малко толерантност никога не е излишна
Отговор
в отговор на мeтъл Джyмa #2

Ново 5

С така направения (горния постинг) конфигурационен файл пинга (от компа-рутер) към интернет хост ми е с ТТЛ=2, а на другия е 1. Като коментирам последния ред на моя е 1, а на другия няма (то пък оставаше и да е друго), но защо по дяволите като добавя най-отдолу (ако позицията е от значение) следното правило: iptables -t mangle -A INPUT -i ppp0 -j TTL --ttl-dec 1, ттл-а на пакетите от интернет в моя комп се увеличава (вместо да се намалява) -> става 3 (а не 1)?!? На другия си остава 1.
На предпоследния ред има следното правило: iptables -t mangle -A POSTROUTING -o ppp0 -j TTL --ttl-set 128 и както писах горе целта му е всички пакети от мен и мрежата ми да отиват при ИСП-то ми с един ттл (128 - предпочитам да си мисли, че работя под Уиндоуз), но май това ще става само с пакетите от мрежата, а за моите трябва да добавя iptables -t mangle -A OUTPUT -o ppp0 -j TTL --ttl-set 128. На прав път ли съм?

П.С. Реших си проблема като използвах ttl-set 1 вместо ttl-dec 1, но защо по дяволите декремент действа като инкремент за мен си остава загадка. Чакам някой да я разбули

Още малко толерантност никога не е излишна

Редактирано от мeтъл Джyмa на

Отговор
в отговор на мeтъл Джyмa #3

.config

Все пак е съществувал в началото, след като си разархивирал сорсовете на кърнъла.

[линк]

Понякога има остатъчни настройки и конфигурации.

Отговор