In Fire We Trust

In the darkest corner light will shine



15 Jun

Print This Post The Perfect SOHO router - Part 4
чети на bulgarian 

This is the fourth part of series of articles in which i will explain how to create the perfect SOHO router. I have to note that this is my idea of a perfect router with all the good and bad points stemming from it.

The series will comprise of the following articles:

After we have installed our router and configured the basic set of services it is time to realise the routing process itself. This is accomplished with the tools route, iptables, arp, iproute2.

In this part we will show the following configurations:

  • Dead simple router - this is the most basic one and it offers almost no features at all.
  • Router doing NAT/masquerade and firewall - this is the most comon type of router which can be seen.
  • Router which is doing load balancing for two or more ISP’s - this is a bit of advanced topic but it is worth.

The examples and the configs are quite basic and skeletal, as almost everyone has different requirements. At the end of this article i will give additional links to read and learn.

Dead simple router
In this situation our router is only moving the traffic. In the most common scenario this router does not do any filtering or masquerading as it is not needed. This solution is usually used in big networks to segment them in smaller and easier manageable parts. It is achieved quite easyly by a simple kernel option and enabling it’s use. The option is IP FORWARDING. I can beallowed in two different ways:

  1. Using the proc subsystem (it is allways available):
    echo "1" > /proc/sys/net/ipv4/ip_forward
  2. Using the sysctl system (it may not be available):
    sysctl -w net.ipv4.ip_forward=1

This setting allows our router to forward packets between it’s interfaces and in reality this way we start it. It is needed this setting to be put in such place that it is applied on every start of our router. Good place for it is /etc/rc.local or a separate file which is executed at the end of the boot process.
As you can see this is a dead simple router not offering anything special to our clients. For the client machines to work each of them has to have a unique IP address, which is visible in the whole network. This router does not do any filtering or protection schemes for the client machines. This solution is suitable for big networks which has to be segmented and have a decent router and firewall at their entrance.

Router doing NAT/masquerade and firewall
This is by far the most commonly used solution. Its advantages are that behind one addres we can hide (masquerade) many machines (in theory almost unlimited if we have the processing power).
The configuration in this example is built with the following assumptions in mind:

  • External interface: eth0 with it’s ip address and mask
  • Internal interface: eth1 with it’s ip address and mask
  • Simple protection from DoS, DDoS and scanning
  • Limit of speciffic ICMP requests
  • Access to http и ssh from the external side to our router
  • Access to http, ssh, dns, dhcp from the internal side
  • SNAT for all clients (even with dinamyc ip address)
  • Forwarding 10 ports for each client - for ease of our clients
  • Explicit filtering of some stuff

The topic of TTL mangling will be skipped. It can be realised very easy and there is a lot of documentation.

#!/bin/bash
 
# Simple firewalling router
# author: vvitkov
# contact: http://www.getoto.net/az/
#
# Licence: CC NC-BY-SA v3
# Disclaimer: i take no responsibility for the consequences of using or not using this.
# It is up to you to decide what to do with this stuff.
# Please if you use this write me a note and don't remove the author info.
 
#######
# Settings, vars
#######
echo "Setting Up Variables ..."
IPT="/sbin/iptables"
if [ -x /sbin/sysctl ] ; then
	SYSCTL="/sbin/sysctl -w"
fi
 
# define external interface, ip, mask, broadcast
EXT_IF="eth0"
EXT_IP="$(/sbin/ifconfig $EXT_IF | grep "addr:" | cut -d":" -f2 | cut -f1 -d" ")"
EXT_NM="$(/sbin/ifconfig $EXT_IF | grep "addr:" | cut -d":" -f4 | cut -f1 -d" ")"
EXT_BC="$(/sbin/ifconfig $EXT_IF | grep "addr:" | cut -d":" -f3 | cut -f1 -d" ")"
 
# define internal interface, ip, mask, broadcast
INT_IF="eth1"
INT_IP="$(/sbin/ifconfig $INT_IF | grep "addr:" | cut -d":" -f2 | cut -f1 -d" ")"
INT_NM="$(/sbin/ifconfig $INT_IF | grep "addr:" | cut -d":" -f4 | cut -f1 -d" ")"
INT_BC="$(/sbin/ifconfig $INT_IF | grep "addr:" | cut -d":" -f3 | cut -f1 -d" ")"
INT_NET="$INT_IP"/"$INT_NM"
 
# define the loopback
LO_IF="lo"
LO_IP="127.0.0.1"
 
# define allowed ports
EXT_IN_TCP="22 80"
EXT_IN_UDP="33434:33524"
 
INT_IN_TCP="22 53 67 68 80"
INT_IN_UDP="53 67 68 33434:33524"
 
#######
# Lets go
#######
echo "Tunning ..."
if [ -z $SYSCTL ] ; then
	# stop forwarding
	$SYSCTL net.ipv4.ip_forward=0
	# fix our routing a bit
	$SYSCTL net.ipv4.conf.default.accept_redirects=0
	$SYSCTL net.ipv4.conf.default.accept_source_route=0
	$SYSCTL net.ipv4.conf.default.send_redirects=0
	$SYSCTL net.ipv4.conf.default.rp_filter=1
	# don't log strange packets
	$SYSCTL net.ipv4.conf.default.log_martians=0
	# smurf rpotection
	$SYSCTL net.ipv4.icmp_echo_ignore_broadcasts=1
	$SYSCTL net.ipv4.icmp_ignore_bogus_error_responses=1
	$SYSCTL net.ipv4.conf.default.proxy_arp=0
	# keep quiet about arp requests/answers
	$SYSCTL net.ipv4.conf.default.arp_filter=1
	$SYSCTL net.ipv4.conf.default.arp_announce=2
	$SYSCTL net.ipv4.conf.default.arp_ignore=2
	# set the ttl to a windows like box (additional layer of security)
	$SYSCTL net.ipv4.ip_default_ttl=128
	# recycle fast unused buckets for packet infos
	$SYSCTL net.ipv4.tcp_tw_recycle=1
	$SYSCTL net.ipv4.tcp_tw_reuse=1
	# do not stamp the packets
	$SYSCTL net.ipv4.tcp_timestamps=0
else
	echo "0" > /proc/sys/net/ipv4/ip_forward
	echo "0" > /proc/sys/net/ipv4/conf/default/accept_redirects
	echo "0" > /proc/sys/net/ipv4/conf/default/accept_source_route
	echo "0" > /proc/sys/net/ipv4/conf/default/accept_send_redirects
	echo "1" > /proc/sys/net/ipv4/conf/default/rp_filter
	echo "0" > /proc/sys/net/ipv4/conf/default/log_martians
	echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
	echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
	echo "0" > /proc/sys/net/ipv4/conf/default/proxy_arp
	echo "1" > /proc/sys/net/ipv4/conf/default/arp_filter
	echo "2" > /proc/sys/net/ipv4/conf/default/arp_announce
	echo "2" > /proc/sys/net/ipv4/conf/default/arp_ignore
	echo "128" > /proc/sys/net/ipv4/ip_default_ttl
	echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle
	echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse
	echo "0" > /proc/sys/net/ipv4/tcp_timestamps
fi
 
# Clear all tables
echo "Start on clean ..."
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
 
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
 
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
 
echo "Setting custom chains ..."
$IPT -N bad_packets
$IPT -N bad_tcp_packets
$IPT -N icmp_packets
$IPT -N tcp_in
$IPT -N udp_in
$IPT -N tcp_out
$IPT -N udp_out
 
echo "Setting some protections ..."
echo "  General"
$IPT -A bad_packets -p ALL -i $EXT_IF -s $INT_NET -j DROP
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP
$IPT -A bad_packets -p tcp -j bad_tcp_packets
$IPT -A bad_packets -p ALL -j RETURN
 
echo "  TCP"
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -A tcp_in -p TCP -s 0/0 --destination-port 113 -j REJECT
$IPT -A bad_tcp_packets -p tcp -j RETURN
 
echo "  ICMP"
$IPT -A icmp_packets --fragment -p ICMP -j DROP
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -m limit --limit 1/s -j ACCEPT
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
$IPT -A icmp_packets -p ICMP -j RETURN
 
echo "  UDP"
$IPT -A udp_in -p UDP -s 0/0 --dport 137 -j DROP
$IPT -A udp_in -p UDP -s 0/0 --dport 139 -j DROP
$IPT -A udp_in -p UDP -s 0/0 --dport 113 -j REJECT
 
echo "Filling the chains ..."
echo "  UDP INCOMING"
for PORT in $EXT_IN_UDP ; do
	$IPT -A udp_in -p UDP -i EXT_IF -s 0/0 --dport $PORT -j ACCEPT;
done
for PORT in $INT_IN_UDP ; do
	$IPT -A udp_in -p UDP -i INT_IF -s 0/0 --dport $PORT -j ACCEPT;
done
$IPT -A udp_in -j RETURN
 
echo "  UDP OUTGOING"
$IPT -A udp_out -p UDP -s 0/0 -j ACCEPT
 
echo "  TCP INCOMING"
for PORT in $EXT_IN_TCP ; do
	$IPT -A tcp_in -p TCP -i $EXT_IF -s 0/0 --dport $PORT -j ACCEPT
done
for PORT in $INT_IN_TCP ; do
	$IPT -A tcp_in -p TCP -i $INT_IF-s 0/0 --dport $PORT -j ACCEPT
done
$IPT -A tcp_in -p TCP -j RETURN
 
echo "  TCP OUTGOING"
$IPT -A tcp_out -p TCP -j ACCEPT
 
echo "  INCOMING"
$IPT -A INPUT -p ALL -i $LO_IF -j ACCEPT
$IPT -A INPUT -p ALL -j bad_packets
$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP
$IPT -A INPUT -p ALL -i $INT_IF -s $INT_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $INT_IF -d $INT_BC -j ACCEPT
$IPT -A INPUT -p UDP -i $INT_IF --sport 68 --dport 67 -j ACCEPT
$IPT -A INPUT -p ALL -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p ALL -i ! $EXT_IF -m state --state NEW -j ACCEPT
$IPT -A INPUT -p TCP -i $EXT_IF -j tcp_in
$IPT -A INPUT -p UDP -i $EXT_IF -j udp_in
$IPT -A INPUT -p ICMP -i $EXT_IF -j icmp_packets
$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP
 
echo "  FORWARD"
$IPT -A FORWARD -p ALL -j bad_packets
$IPT -A FORWARD -p tcp -i $INT_IF -j tcp_out
$IPT -A FORWARD -p udp -i $INT_IF -j udp_out
$IPT -A FORWARD -p ALL -i $INT_IF -j ACCEPT
$IPT -A FORWARD -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p ALL -i $EXT_IF -m state --state NEW -j ACCEPT
 
echo "  OUTPUT"
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP
$IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO_IF -j ACCEPT
$IPT -A OUTPUT -p ALL -s $INT_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -o $INT_IF -j ACCEPT
$IPT -A OUTPUT -p ALL -o $EXT_IF -j ACCEPT
 
echo "  NAT"
echo "      PORT FORWARDING"
TMP="`echo $INT_IP | cut -d\. -f1-3`"
for HOST in `seq 2 254` ; do
        PORTR=$((10000+HOST*10)):$((10009+HOST*10))
        echo "   $PORTR for $TMP.$HOST"
        $IPT -A FORWARD -p udp -i $EXT_IF --dport $PORTR -d $TMP.$HOST -j ACCEPT
        $IPT -A FORWARD -p tcp -i $EXT_IF --dport $PORTR -d $TMP.$HOST -j ACCEPT
        $IPT -t nat -A PREROUTING -p udp -i $EXT_IF --dport $PORTR -j DNAT --to $TMP.$HOST
        $IPT -t nat -A PREROUTING -p tcp -i $EXT_IF --dport $PORTR -j DNAT --to $TMP.$HOST
done
 
$IPT -t nat -A POSTROUTING -o $EXT_IF -j SNAT --to $EXT_IP
 
if [ -z $SYSCTL ] ; then
	$SYSCTL net.ipv4.ip_forward=1
else
	echo "1" > /proc/sys/net/ipv4/ip_forward
fi

All in all this is quite good basic firewall. There are few interesting points in it:

  • The way we get the addresses for our cards - as you can see the only hardcoded variables are the interface names. This way our firewall becomes flexible and can be applied to all sorts of connections.
  • The way we do the masquerading. We do it with SNAT as it is lighter than MASQUERADE. For the people that will say it is inaplicable for dynamic connections (pppoe, ip assigned from dhcp) yes you are right. Unless we use the features of the DHCP client/pppoe client and get around this limitation. At the moment when our ip is changed we can forcibly execute our firewall and it will get the new correct address and rewrite all the rules necessary.
  • The way we forward ports to machines behind the router - the construct used is valid only in bash and we use it to generate two numbers denoting the start and the end of the range. After that we explicitly open them in the FORWARD chain (which is not strictly required) and after that forward them with DNAT.
  • The portrange 33434:33524 - this ports should be open so traceroute can operate correctly

Router which is loa balancing two or more ISP’s
Here we will show only the part that balances the traffic. Our example is only with 2 providers but the example can be easily extended. The task is a bit larger and we will use iproute. It has quite cryptic syntax but after you get used to it you won’t stop using it.

For being able to balance traffic we need the following tools:

  • iproute2
  • kernel support for multipath routing
  • At least one discipline for multipath routing compiled in the kernel - i personally recomend wrr

If we want to be able to use names we must add them to the /etc/iproute2/rt_tables file. The indexes are between 2 and 253. If you need to balance more than 200 providers … this is not the right reading.

#!/bin/bash
#
# Simple balancing router
# author: vvitkov
# contact: http://www.getoto.net/az/
#
# Licence: CC NC-BY-SA v3
# Disclaimer: i take no responsibility for the consequences of using or not using this.
# It is up to you to decide what to do with this stuff.
# Please if you use this write me a note and don't remove the author info.
 
### Settings
ISP1_NET="1.2.3.0/24"
ISP1_GW="1.2.3.1"
ISP1_IF="eth1"
ISP1_OUR_HOST="1.2.3.99"
ISP2_NET="9.8.7.0/24"
ISP2_GW="9.8.7.1"
ISP2_IF="eth2"
ISP2_OUR_HOST="9.8.7.99"
 
INT_NET="10.42.3.0/24"
 
# Defining routing tables for source routing
if ( ip ru ls | grep main | grep 50 )
then
        ip r f t main
else
        ip ru a prio 50 t main
fi
 
if ( ip ru ls | grep isp_rules1 )
then
        ip r f t isp_rules1
else
        ip ru a from $ISP1_NET prio 201 t isp_rules1
fi
 
if ( ip ru ls | grep isp_rules2 )
then
        ip r f t isp_rules2
else
        ip ru a from $ISP2_NET prio 202 t isp_rules2
fi
 
# Clear all the existing routes
ip r f any
ip r f t default
 
# Host routes
ip r a $ISP1_NET dev $ISP1_IF src $ISP1_OUR_HOST
ip r a $ISP2_NET dev $ISP2_IF src $ISP2_OUR_HOST
 
# Local networks
ip r a 127.0.0.0/8 dev lo
ip r a $INT_NET dev eth0
 
# Default gateways
ip r a 0/0 via $ISP1_GW dev $ISP1_IF table isp_rules1 proto static
ip r a prohibit 0/0 table isp_rules1 metric 1 proto static
 
ip r a 0/0 via $ISP2_GW dev $ISP2_IF table isp_rules2 proto static
ip r a prohibit 0/0 table isp_rules2 metric 1 proto static
 
# lets shake it :)
ip r a 0/0 proto static table default nexthop via $ISP1_GW dev $ISP2_IF nexthop via $ISP2_GW dev $ISP2_IF
 
# Remote networks with static routes
ip r a < NETWORK IN ISP1 > via $ISP1_GW dev $ISP1_IF
ip r a < NETWORK IN ISP2 > via $ISP2_GW dev $ISP2_IF
 
# flush caches
ip r f c

With this we end the examples for configuring our router. I know i haven’t covered everything but a man has to do some research on his own.

Links

The Series continues with The Perfect SOHO router - Part 5

13 Responses to “The Perfect SOHO router - Part 4”

  1. 1
    VladSun Says:

    Здрасти :)
    Май е добре да добавим и VPN сърверче за достъп до DMZ-a.
    Ще гледам да правя TC скриптовете в твой стил :)

    Какво ще кажеш за идеята ми за XML конфиг файла?

    http://www.linux-bg.org/cgi-bin/y/index.pl?page=news&key=393860161&cmtkey=393860161_1181588956&id=#comment_info

  2. 2
    zeridon Says:

    За VPN сървър много си мислех дали да го сложа ама … не знам как ще стане раздаването на сертификатите. Че иначе VPN парола ми иде малко … някак си несигурно.

    А колкото до конфиг със XML ако не се лъжа m0n0wall беше със XML конфиг. И то цялата система.

  3. 3
    Schenker Says:

    Много добре изглеждащ firewall!

  4. 4
    ceco Says:

    ami neka az vi dam moq skript koito sam sglobil ot saitovete, samo 4e mislq 4e trqbvashe na FORWARD da e na accpet 4e neshto ne raboti! nqkoi ako moje da go opravi pri 3-te policii na drop neka pishe
    ta eto go :))

    #!/bin/sh
     
    #ZADAVANE NA KONSTANTITE
     
    li="eth1"                    #lan interfeis
    la="192.168.0.1"             #lan adres
    ii="eth0"                    #internet interfeis
    ia="213.145.119.106"         #internet adres
    lo="lo"                      #loopback
    ca="10.0.0.0/8"              #mreja A-klas
    cb="172.16.0.0/12"           #mreja B-klas
    cc="192.168.0.0/16"          #mreja C-klas
    cd="224.0.0.0/4"             #mreja D-klas
    ce="240.0.0.0/5"             #rezervna mreja
    I="/usr/sbin/iptables"       #iptables :)
    zp="1024:65535"              #zabraneni portove
    ftp="213.145.119.30"         #ftp ip
     
     
    #SETVANE NA POLITIKATA
     
    $I -P INPUT DROP
    $I -P OUTPUT DROP
    $I -P FORWARD DROP
     
    #FTP
     
    $I -A INPUT -i $ii -p TCP -m state --state ESTABLISHED,RELATED  --sport 21 --dport $zp  -s 0/0  -d $ia  -j ACCEPT
    $I -A OUTPUT -o $ii  -p TCP -m state --state NEW,ESTABLISHED  --sport  $zp  --dport 21 -s $ia -d 0/0  -j ACCEPT
    $I -A INPUT -i $ii -p TCP -m state --state NEW --sport 20 --dport $zp -s 0/0 -d $ia -j ACCEPT
    $I -A OUTPUT -o $ii -p TCP -m state --state ESTABLISHED,RELATED  --sport $zp --dport 20 -s $ia -d 0/0 -j ACCEPT
    $I -A INPUT -i $ii -p TCP -m state --state ESTABLISHED,RELATED --sport $zp --dport $zp -s 0/0 -d $ia -j ACCEPT
    $I -A OUTPUT -o $ii -p TCP -m state --state NEW,ESTABLISHED  --sport $zp --dport $zp -s $ia -d 0/0 -j ACCEPT
     
                                    #AKO IMA MASKIRANE
     
    $I -A FORWARD -p TCP -s $cc --sport $zp --dport 20:21 -j ACCEPT
    $I -A FORWARD -p TCP -d $cc --sport 20:21 --dport $zp -j ACCEPT
    $I -A FORWARD -p TCP -s $cc --sport $zp --dport $zp -j ACCEPT
    $I -A FORWARD -p TCP -d $cc --sport $zp --dport $zp -j ACCEPT
     
     
    #HTTP
     
    $I -A OUTPUT -o $ii -p TCP  --sport $zp --dport 80 -s $ia -d 0/0 -j ACCEPT
    $I -A INPUT -i $ii -p TCP -m state --state ESTABLISHED,RELATED  --sport 80 --dport $zp -s 0/0 -d $ia -j ACCEPT
                                #AKO IMA MASKIRANE
     
    $I -A FORWARD -p TCP -s $cc --sport $zp --dport 80 -j ACCEPT
    $I -A FORWARD -p TCP -d $cc --sport 80 --dport $zp -j ACCEPT
     
    #HTTPS
     
    $I -A OUTPUT -o $ii -p TCP  --sport $zp --dport 443 -s $ia -d 0/0 -j ACCEPT
    $I -A INPUT -i $ii -p TCP -m state --state ESTABLISHED,RELATED  --sport 443 --dport $zp -s 0/0 -d $ia -j ACCEPT
                                #AKO IMA MASKIRANE
     
    $I -A FORWARD -p TCP -s $cc --sport $zp --dport 443 -j ACCEPT
    $I -A FORWARD -m state --state ESTABLISHED,RELATED -p TCP -d $cc  --sport 443 --dport $zp -j ACCEPT
     
    #TRACEROUTE
     
    $I -A OUTPUT -o $ii -p UDP --sport 32769:65535  --dport 33434:33523  -s $ia -d 0/0 -j ACCEPT
                               #AKO IMA MASKIRANE
     
    $I -A FORWARD -p UDP -s $cc --sport 32769:65535  --dport 33434:33523 -j ACCEPT
    $I -A FORWARD -p UDP -d $cc --sport 33434:33523  --dport 32769:65535 -j ACCEPT
     
     
    #ICQ
     
    $I -A INPUT -p tcp -s 0/0 --destination-port 5000:5100 -j ACCEPT
    $I -A OUTPUT -o $ii -p UDP  --sport $zp --dport 4000 -s $ia -d 0/0 -j ACCEPT
    $I -A INPUT -i $ii -p UDP  --sport 4000 --dport $zp -s 0/0 -d $ia -j ACCEPT
                              #AKO IMA MASKIRANE
     
    $I -A FORWARD -p UDP -s $cc --sport $zp --dport 4000 -j ACCEPT
    $I -A FORWARD -p UDP -d $cc --sport 4000 --dport $zp -j ACCEPT
     
    #PRAVILATA
     
    $I -A INPUT -i $lo -j ACCEPT
    $I -A OUTPUT -o $lo -j ACCEPT
    $I -t nat -A POSTROUTING -s $cc -o $ii -j SNAT  --to $ia
    $I -A INPUT -i $li -s $cc -j ACCEPT
    $I -A OUTPUT -o $li -d $cc -j ACCEPT
     
    #SPOOFED PACKETS
     
    $I -A INPUT -i $ii -s $ia -j DROP
    $I -A INPUT -i $ii -s $ca -j DROP
    $I -A INPUT -i $ii -d $ca -j DROP
    $I -A OUTPUT -o $ii -s $ca -j DROP
    $I -A OUTPUT -o $ii -s $ca -j DROP
    $I -A INPUT -i $ii -s 127.0.0.0/8 -j DROP
    $I -A OUTPUT -o $ii -s $127.0.0.0/8 -j DROP
    $I -A INPUT -i $ii -s 255.255.255.255 -j DROP
    $I -A INPUT -i $ii -d 0.0.0.0  -j DROP
    $I -A OUTPUT -o $ii -s 255.255.255.255 -j DROP
    $I -A OUTPUT -o $ii -d 0.0.0.0  -j DROP
    $I -A INPUT -i $ii -s $cd -j DROP
    $I -A OUTPUT -o $ii -s $cd -j DROP
    $I -A INPUT -i $ii -s $ce -j DROP
    $I -A OUTPUT -o $ii -d $ce -j DROP
    $I -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
    $I -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
    $I -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    $I -A FORWARD -i $ii -m state ! --state NEW -j DROP
     
    # PPTP
     
    #$I -A OUTPUT -o $EXTERNAL_INTERFACE -p TCP  --sport $UNPRIVPORTS --dport 1723 -s $EXTERNAL_IP -d $ANYWHERE -j ACCEPT
    #$I -A INPUT -i $EXTERNAL_INTERFACE -p TCP  --sport 1723 --dport $zp -s 0/0 -d $ia  -m state --state ESTABLISHED,RELATED -j ACCEPT
    #iptables -A INPUT -i $EXTERNAL_INTERFACE -p 47 -j ACCEPT
    #iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p 47 -j ACCEPT
                              #AKO IMA MASKIRANE
     
    #iptables -A INPUT -i $INTERNAL_INTERFACE -p 47 -j ACCEPT
    #iptables -A OUTPUT -o $INTERNAL_INTERFACE -p 47 -j ACCEPT\
    #iptables -A FORWARD -p TCP -s $INTERNAL_NETWORK  --sport $UNPRIVPORTS --dport 1723 -j ACCEPT
    #iptables -A FORWARD -p TCP -d $INTERNAL_NETWORK  -m state --state ESTABLISHED,RELATED  --sport 1723 --dport $UNPRIVPORTS -j ACCEPT
    #iptables -A FORWARD -p 47 -s $INTERNAL_NETWORK -j ACCEPT
    #iptables -A FORWARD -p 47 -d $INTERNAL_NETWORK -j ACCEPT
     
    #KIRIIKI :)
    /usr/bin/echo "1" &gt; /proc/sys/net/ipv4/conf/all/secure_redirects
    /usr/bin/echo "1" &gt;/proc/sys/net/ipv4/conf/eth0/rp_filter
    /usr/bin/echo "0" &gt; /proc/sys/net/ipv4/conf/all/accept_source_route
    /usr/bin/echo "0" &gt; /proc/sys/net/ipv4/conf/all/accept_redirects
     
    #UP NA INTERFEISITE
    /sbin/ifconfig eth0 up
    /sbin/ifconfig eth1 up

  5. 5
    ceco Says:

    eto i dr variant koito moje direktno da se paste v rc.local

    #!/bin/sh
    # Put any local setup commands in here:
    /usr/sbin/iptables -P INPUT ACCEPT
    /usr/sbin/iptables -P OUTPUT ACCEPT
    /usr/sbin/iptables -P FORWARD ACCEPT
    /sbin/ifconfig eth0 up
    /sbin/ifconfig eth1 up
    #OT TUK NADOLU DOBAVQM POZVOLENI NESHTA
    /usr/sbin/iptables -A INPUT -p tcp -s 0/0 --destination-port 5000:5100 -j ACCEPT  #za icq
    /usr/sbin/iptables -A FORWARD -i eth1 -s 192.168.0.1/24 -d ! 192.168.0.1/24 -o eth0  -j ACCEPT
    /usr/sbin/iptables -A FORWARD -p tcp -i eth1 -j ACCEPT
    /usr/sbin/iptables -A FORWARD -p udp -i eth1 -j ACCEPT
    /usr/sbin/iptables -A OUTPUT -p ALL -s 192.168.0.1/24 -j ACCEPT
    /usr/sbin/iptables -A OUTPUT -p ALL -o eth1 -j ACCEPT
    /usr/sbin/iptables -A OUTPUT -p ALL -o eth0 -j ACCEPT
    #/usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 213.145.119.106
    /usr/sbin/iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
    /usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    /usr/sbin/iptables -A INPUT -i eth0 -m state --state NEW,INVALID -j DROP
    /usr/sbin/iptables -A FORWARD -p tcp --dport 445 -j DROP
    /usr/sbin/iptables -A FORWARD -p tcp --dport 135 -j DROP
    /usr/sbin/iptables -A FORWARD -p tcp --dport 1 -j DROP
    /usr/sbin/iptables -A FORWARD -p tcp --dport 25 -j DROP
    /usr/sbin/iptables -A FORWARD -p tcp --sport 25 -j DROP
    /usr/sbin/iptables -A FORWARD -p udp --dport 445 -j DROP
    /usr/sbin/iptables -A FORWARD -p udp --dport 135 -j DROP
    /usr/sbin/iptables -A FORWARD -p udp --dport 1 -j DROP
    /usr/sbin/iptables -A INPUT -p tcp -s 0/0 -d 0/0 --dport 2049 -j DROP
    /usr/sbin/iptables -A INPUT -p udp -s 0/0 -d 0/0 --dport 2049 -j DROP
    /usr/sbin/iptables -A INPUT -p tcp -s 0/0 -d 0/0 --dport 6000:6009 -j DROP
    /usr/sbin/iptables -A INPUT -p tcp -s 0/0 -d 0/0 --dport 7100 -j DROP
    /usr/sbin/iptables -A INPUT -p tcp -s 0/0 -d 0/0 --dport 515 -j DROP
    /usr/sbin/iptables -A INPUT -p udp -s 0/0 -d 0/0 --dport 515 -j DROP
    /usr/sbin/iptables -A INPUT -p tcp -s 0/0 -d 0/0 --dport 111 -j DROP
    /usr/sbin/iptables -A INPUT -p udp -s 0/0 -d 0/0 --dport 111 -j DROP
    /usr/sbin/iptables -A INPUT -p ICMP -s 0/0 --icmp-type 8 -j DROP         #zabrana za ping
    #/usr/sbin/iptables -A INPUT -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with icmp-port-unreachable
    #ZASHTITA OT SYN-FLOOD
    /usr/sbin/iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
    #ZASHTITA OT PORT SCAN
    /usr/sbin/iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
    #ZASHTITA OT PING NA SMURTTA
    /usr/sbin/iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    /usr/sbin/iptables -A FORWARD -i eth0 -m state ! --state NEW -j DROP
    /usr/sbin/iptables -N block
    /usr/sbin/iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
    /usr/sbin/iptables -A block -m state --state NEW -i ! eth0 -j ACCEPT
    /usr/sbin/iptables -j DROP
    /usr/sbin/iptables -A INPUT -j block
    /usr/sbin/iptables -A FORWARD -j block
    #SYN FLOOD PROTECTION
    #/usr/bin/echo "1" &gt; /proc/sys/net/ipv4/tcp_syncookies
    /usr/bin/echo "1" &gt; /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    #DA PRIEMA SAMO OT GATE OT LISTA
    /usr/bin/echo "1" &gt; /proc/sys/net/ipv4/conf/all/secure_redirects
    /usr/bin/echo "1" &gt;/proc/sys/net/ipv4/conf/eth0/rp_filter
    /usr/bin/echo "0" &gt; /proc/sys/net/ipv4/conf/all/accept_source_route
    /usr/bin/echo "0" &gt; /proc/sys/net/ipv4/conf/all/accept_redirects

  6. 6
    Schenker Says:

    Аз имам една питанка по скрипта. Имаме следните правила:

    $IPT -A INPUT -p ALL -i $INT_IF -s $INT_NET -j ACCEPT
    $IPT -A INPUT -p ALL -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT

    … и малко след това друго:
    $IPT -A INPUT -p ALL -i ! $EXT_IF -m state --state NEW -j ACCEPT

    Дали има смисъл от това последното предвид горното и ако да … какъв точно?

  7. 7
    zeridon Says:

    @Schenker: смисъл има …

    • Първият ред казва, ако нещо идва отвътре и източник е нещо което е вътре пущи го на воля
    • Вторият ред казва, ако нещо иде отвън обаче не е първото в серията (вече е изградена връзката) пусни го
    • последният ред пуска всичко което не идва отвън. Т.е. всичко от loopback и internal мрежата

    Вярно е че се получава известно дублиране, но съм имал проблеми при неговата липса. Знам че звучи странно но това ги оправи.

  8. 8
    zeridon Says:

    from tolstoi (recovered):

    И автора и ceco споменават за rc.local при Debian според мен по-правилният начин за стартиране на такива скриптове е с вдигна не на итерфейсите - /etc/network/interfaces и добавяме там
    up /pyt/izpylnim_file

  9. 9
    zeridon Says:

    Малко по-чисто е да се сложи в post-up.d директорията

    Като цяло всичко е въпрос на лично предпочитание. Смятам че посредством rc.local изглежда малко по чисто, но това си е лично мое мнение.

  10. 10
    ssabchew Says:

    Малки корекции

    Някъде около:

    # Local networks
    ip r a 127.0.0.0/8 dev lo
    ip r a $INT_NET dev eth0

    1-во ползвам променлива вместо eth0
    2-ро сожих INT_IF=eth2, защото локалния трафик ми е на eth2

  11. 11
    bobi Says:

    Много добро ръководство ще се опитам да го възпроизведа на slackware. При мен положението е следното имам интернет който е адсл(9Mb/s) и влиза на eth0 lan(служебната мрежа) на eth1 и back-up доставчик който е на eth2 (4Mb/s)но интернета се получава по pptp във вкъщи имам само мрежа (без интернет) от backup доставчика и на работата съм си направил pptp server с който получавам интернет от адсл в къщи (понеже мрежата на back-up доставчика е с подмрежи няма друг вариант да
    ползвам servera на работата като gw освен pptp)Понеже където живея не се продава по бърз интербет от този на адлс пък той вече не стига целта мие да впрегна в load balance и двата доставчика но пък да мога през pptpd да имам и нет във вкъщи.

  12. 12
    iwhanttoknow Says:

    Незнам колко е активна тая тема но все пак от тука взех скрипта тук ще питам за проблема …… Пуснах днеска скрипта за лоад балансинга обаче IRC-то дропи през няколко минути !
    Някои има ли някакви идеи ?
    От един стар firewallми попадна еитова (с коментар преди него “за да не дропи IRC при лоад балансинг)…
    iptables -t mangle -I FORWARD -p tcp –dport 6667 -j ROUTE –oif $EXTIF1 –continue

    като заместих $EXTIF1 с някой от интерфейсите към двата ADSL-а обаче ми даде грешка ” iptables v1.4.0: Unknown arg `–oif’ “.

    Моля някои ако знае решение на проблема нека помогне !
    Благодаря предварително.

  13. 13
    Borislav Says:

    Здравейте колеги и приятели.
    Незнам колко е активана темата надявам се да ми помогнете.
    Разгледах внимателни скрипта за балансиране на два доставчика и се позанимавах един следобед с iproute2. Моята постановка е малко по различна от тази описана по горе, защото на мен ми е нужно решение,при което когато загубя връзка с gataway на първия доставчки всички заявки да се прехвърлят през втория(при възтановяване на връзката да се възтанови рутинга към доставчик 1), с което да гарантирам постоянна свързаност с интернет. Надявам се някои да се е сблъсквал с подобно решение. ще съм му много благодарен ако помогне.

Leave a comment

You must be logged in to post a comment.


In Fire We Trust

Say NO to trud