IPTABLES voor o.a. router functionaliteit

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
Ik heb een Ubuntu servertje in de meterkast staan die sinds kort ook als router dient. Ik heb dit voor elkaar gekregen door er een twee NIC in te zetten en via masquerading NAT te configureren. Er draait tevens een DHCP servertje op die de clients voorziet van een ipadres uit de "local pool" en gegevens als gateway, etc. Dit werkt allemaal erg goed moet ik zetten. Ook hartstikke tof om "zelf" zoiets te maken, i.p.v. een standaard router te kopen.

code:
1
2
eth0 --> static adres: 192.168.1.1. Deze is verbonden met de switch
eth1 --> DHCP, krijgt ipadres van UPC modem


Met de volgende iptables configuratie zorg ik ervoor dat de clients in mijn netwerk via de server kunnen internetten

code:
1
2
3
4
sudo iptables -A FORWARD -o eth1 -i eth0 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE


Voor de rest heb ik dus helemaal GEEN andere regels o.i.d. Dit lijkt me niet echt de bedoeling. De server an sich doet -naast spelen voor router ;)- nog een aantal andere taken zoals web (80), ssh (22), dropbox, etc. Nu vroeg ik mij af hoe ik middels iptables de server zo kan configureren dat het allemaal een beetje veilig is. De lokale clients vertrouw ik 100%. Hoe pak ik dit aan? Wat ik functioneel wil is volgens mij het volgende:
  • Al het verkeer van buitanaf (dus op eth1) blokkeren
  • Interne computers (op eth0) moeten wel normaal kunnen internetten; deze hoeven volgens mij geen restricties opgelegd krijgen
  • Verkeer op poort 80 moet wel mogelijk zijn; Apache draait er immers op
  • SSH verkeer op 22 moet mogelijk zijn
Zie ik nu iets over het hoofd? En hoe regel ik zoiets zonder mezelf buiten te sluiten? :D

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

als eerste op lo en eth0 alles toestaan, daarna op eth1 alles wat je toe wilt staan toestaan (80, 22) en vervolgens alle state NEW connections droppen en dan ben je al een heel eind.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
CyBeR schreef op dinsdag 23 oktober 2012 @ 12:07:
als eerste op lo en eth0 alles toestaan, daarna op eth1 alles wat je toe wilt staan toestaan (80, 22) en vervolgens alle state NEW connections droppen en dan ben je al een heel eind.
Oke thanks; ik heb een beetje op internet lopen zoeken en ben op het volgende uitgekomen. Zou je eens mee willen kijken of deze set van regels doet wat ik graag wil?

- Als eerste op lo en eth0 alles toestaan
code:
1
2
3
4
iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -j ACCEPT -p all -s 192.168.1.0/24 -i eth0
iptables -A OUTPUT -j ACCEPT -p all -d 192.168.1.0/24 -o eth0

Hiermee zet ik dus alles open voor lo en eth0 (mijn interne netwerk). Op deze kunnen interne computers dus zonder gezeik overal en via alle poorten naar toe, right?

- Daarna op eth1 alles wat je toe wilt staan toestaan (80, 22)
code:
1
2
3
4
5
6
# Allow previously established connections, interface eth0 is the internet interface
iptables -A OUTPUT -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow port 80 (www) and 22 (SSH) connections to the firewall
iptables -A INPUT -p tcp -i eth1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -i eth1 --dport 80 -j ACCEPT
Ik weet niet zeker of het eerste deel (allow previously established connections) noodzakelijk is. Voor de rest wil ik hiermee dus bereiken dat van buitenaf verkeer mogelijk is naar de apache webserevr en naar de SSH server.

- Uiteraard nog de regels voor de NAT translatie zodat computers op het interne netwerk via eth0 kunnen internetten.
code:
1
2
3
4
iptables -A FORWARD -o eth1 -i eth0 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE


- Vervolgens alle state NEW connections droppen
code:
1
iptables -A INPUT -i eth1 -j REJECT

Of moet ik hier kiezen om ze te droppen? Hoe doen jullie dit?
En hiermee de rest dus dichtgooien. Hiermee sluit ik dus NIET de hierboven genoemde regels, toch?

[ Voor 12% gewijzigd door smeerbartje op 23-10-2012 15:38 ]


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

smeerbartje schreef op dinsdag 23 oktober 2012 @ 15:29:
[...]
Oke thanks; ik heb een beetje op internet lopen zoeken en ben op het volgende uitgekomen. Zou je eens mee willen kijken of deze set van regels doet wat ik graag wil?

- Als eerste op lo en eth0 alles toestaan
code:
1
2
3
4
iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -j ACCEPT -p all -s 192.168.1.0/24 -i eth0
iptables -A OUTPUT -j ACCEPT -p all -d 192.168.1.0/24 -o eth0

Hiermee zet ik dus alles open voor lo en eth0 (mijn interne netwerk). Op deze kunnen interne computers dus zonder gezeik overal en via alle poorten naar toe, right?
Op zich zijn die -s en -d niet nodig, en met je lo zelfs niet allesomvattend. Heel 127.0.0.0/8 is loopback.

Verder: wat je hier toestaat is dat je interne netwerk met alle services op de router kunnen verbinden. De INPUT en OUTPUT tables zijn alleen voor de lokale host. Verkeer wat gerouteerd wordt gaat via de FORWARD table. Die staat overigens standaard op allow alles dus da's ok.
- Daarna op eth1 alles wat je toe wilt staan toestaan (80, 22)
code:
1
2
3
4
5
6
# Allow previously established connections, interface eth0 is the internet interface
iptables -A OUTPUT -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow port 80 (www) and 22 (SSH) connections to the firewall
iptables -A INPUT -p tcp -i eth1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -i eth1 --dport 80 -j ACCEPT
Ik weet niet zeker of het eerste deel (allow previously established connections) noodzakelijk is. Voor de rest wil ik hiermee dus bereiken dat van buitenaf verkeer mogelijk is naar de apache webserevr en naar de SSH server.
Die rule op je OUTPUT table is alleen nodig als je uitgaande verbindingen verderop in de table blokkeert.
- Vervolgens alle state NEW connections droppen
code:
1
iptables -A INPUT -i eth1 -j REJECT

Of moet ik hier kiezen om ze te droppen? Hoe doen jullie dit?
En hiermee de rest dus dichtgooien. Hiermee sluit ik dus NIET de hierboven genoemde regels, toch?
Correct, de tables worden van boven naar beneden afgegaan en de 1e match doet 't 'm.

Je mist alleen nog iets om bij input established en related connecties toe te staan volgens mij.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • WHiZZi
  • Registratie: Januari 2001
  • Laatst online: 17:09

WHiZZi

Museumdirecteurtje

Ik zou sowieso als eerste:
iptables -P INPUT -j DROP
Je zou kunnen overwegen om OUTPUT ook te droppen mits je verder vanuit je server geen externe servers wilt bereiken.
Zet daarna poort 80, 22 en eventuele verdere poorten expliciet open op je eth1.

Het werkt namelijk makkelijker (en overzichtelijk) om vanuit de visie alles dicht en ik zet alles open te werken ipv alles open en ik laat eerst mijn hele firewall doorlopen op regels om als laatste de boel dicht te maken.

Just my 0,02 :)

enne, UPC doet nog geen IPv6, maar wellicht wel al handig om ook deze te firewallen ;). IPv4 firewallen is leuk en absoluut goed, maar vergeet IPv6 ook niet als je dat hebt/gaat gebruiken ;)

HomeComputerMuseum - Interactief computermuseum waar wij de geschiedenis van de thuiscomputer preserveren. Centraal gelegen in de Benelux.


Acties:
  • 0 Henk 'm!

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 18:29

deadinspace

The what goes where now?

Als je met iptables aan de slag gaat, bestudeer dan vooral ook dit heldenplaatje:
Afbeeldingslocatie: http://blogs.longwin.com.tw/lifetype/nfk-traversal.png
smeerbartje schreef op dinsdag 23 oktober 2012 @ 11:49:
code:
1
2
sudo iptables -A FORWARD -o eth1 -i eth0 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Dat ziet er goed uit, maar vergeet niet dat de FORWARD chain (net als elke chain!) als default policy ACCEPT heeft. Alleen maar dingen accepten heeft dus weinig nut, want dat is al de default :)
Wat je voor dit geval wil is de FORWARD policy op DROP zetten.
code:
1
2
sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Die eerste regel dient alleen om de nat/POSTROUTING chain leeg te maken. Dat is of niet nodig, of je moet dat voor je andere chains ook doen.
Voor de rest heb ik dus helemaal GEEN andere regels o.i.d. Dit lijkt me niet echt de bedoeling.
Mwoh, hangt van je doel af. In principe heb je met mijn bovenstaande opmerkingen een nette router.
De server an sich doet -naast spelen voor router ;)- nog een aantal andere taken zoals web (80), ssh (22), dropbox, etc. Nu vroeg ik mij af hoe ik middels iptables de server zo kan configureren dat het allemaal een beetje veilig is.
Als op een poort op eth1 geen service luistert, dan kan een aanvaller daar helemaal niks mee. Als er wel een service op die poort draait, dan wil je die service blijkbaar gebruiken. Zo niet, draai die service dan niet op die poort zou ik zeggen ;)

Als je iptables wil gebruiken om die toegang te bepalen, dan is het vrij eenvoudig: laat in de INPUT chain voor eth1 alleen de poorten in kwestie door, en blokkeer de rest (op eth1).
En hoe regel ik zoiets zonder mezelf buiten te sluiten? :D
Fysieke toegang, of geen fouten maken :P
smeerbartje schreef op dinsdag 23 oktober 2012 @ 15:29:
code:
1
2
3
4
iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -j ACCEPT -p all -s 192.168.1.0/24 -i eth0
iptables -A OUTPUT -j ACCEPT -p all -d 192.168.1.0/24 -o eth0
Zoals CyBeR al aangaf, je localhost adres-check is niet correct. Ik zou van lo alles gewoon accepteren.

Je eth0 adres-restrictie zal waarschijnlijk ook niet werken; zo sturen DHCP-clients hun initiele request naar 0.0.0.0, wat volgensmij niet door je rule geaccepteerd wordt. Dus dan werkt je DHCP-server niet meer ;)

Verder vind ik het zelf een beetje onzin om OUTPUT te filteren, tenzij je de software op je router niet vertrouwt. Het kan wel, maar het brengt het nodige gedoe met zich mee. En met je huidige rules heeft het ook geen zin.
Hiermee zet ik dus alles open voor lo en eth0 (mijn interne netwerk). Op deze kunnen interne computers dus zonder gezeik overal en via alle poorten naar toe, right?
Alleen naar je router zelf.

Je kunt dat hele verhaal anders aanpakken:
  • Accepteer alle ESTABLISHED,RELATED in de INPUT van je eth1
  • Accepteer de relevante poorten in de INPUT van eth1
  • Weiger de rest (evt via een DROP policy, maar ik zou ook een expliciete REJECT rule gebruiken).
Als je bij je originele aanpak wil blijven zou ik gewoon alles op lo en eth0 accepteren.

Ik ben zelf trouwens fan van het iptables-save format voor het opslaan van rules. Die flusht ook alle chains (dus geen -F meer nodig), en maakt het makkelijk om alle policies expliciet op te nemen. Op mijn gateway gebruikte ik vroeger zoiets (iets opgeschoond/vereenvoudigd):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#! /sbin/iptables-restore


# Don't forget to:
#  * Set net.ipv4.conf.default.rp_filter to 1 (spoof protection)
#  * Set net.ipv4.conf.default.forwarding to 1 (IPv4 packet forwarding)
#  * Load ip_nat_ftp, ip_conntrack_ftp
#  * Invoke these rules from pre-up in /etc/network/interfaces


*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT


*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT


*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 192.168.0.0/16 -o wan0 -j MASQUERADE  # NAT

# Portforwards
#-A PREROUTING -i wan0 -p udp --dport 27960 -j DNAT --to 192.168.0.5 -m comment --comment "Quake III"
COMMIT


*filter
:OUTPUT ACCEPT [0:0]
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
# INPUT chain
-A INPUT -p icmp --fragment -j DROP  # Fragmented ICMP is almost always a bad sign, drop it
-A INPUT -m state --state INVALID -j DROP
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -i lo -j ACCEPT
-A INPUT -i lan0 -j ACCEPT

-A INPUT -i wan0 -p tcp --dport 22 -j ACCEPT
-A INPUT -i wan0 -p icmp --icmp-type echo-request -m length --length 0:96 -m hashlimit --hashlimit-mode srcip --hashlimit-name PING --hashlimit 2/s -j ACCEPT

-A INPUT -p tcp -j REJECT --reject-with tcp-reset


# FORWARD chain
-A FORWARD -p icmp --fragment -j DROP  # Fragmented ICMP is almost always a bad sign, drop it
-A FORWARD -m state --state INVALID -j DROP
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

-A FORWARD -i lan0 -j ACCEPT 
    
# Portforwards 
#-A FORWARD -i wan0 -m state --state NEW -p udp --dport 27960 -j ACCEPT -m comment --comment "Quake III"
COMMIT

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

De iptables tutorial voor al je vragen:
http://www.frozentux.net/...al/iptables-tutorial.html

Verder, zoals gezegd:
Policy op DROP zetten en de interne interfaces + loopback een "allow all" regel en voor de externe interfaces enkel de nodige services open zetten.

Om veelvuldige aanvallen te vermijden wil je misschien ook andere poorten gebruiken en die middels iptables forwarden naar de juiste poort. Ook de security van de individuele services heb je best op orde...
Iptables laat ook enkele truukjes toe die nuttig kunnen zijn:
- connection limiting (voor password attacks)
- secret door knock (even op een andere poort een pakket sturen die dan voor een bepaalde tijd een andere poort open zet)

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
Thanks allemaal voor jullie (zéér nuttige) reacties. Ik ga er morgen mee aan de slag. Heb tevens een handig tooltje gevonden om de configuratie te genereren. Wat hier uiteindelijk uitkomt zal ik hier eens posten.... benieuwd wat jullie hier van zeggen.

[ Voor 7% gewijzigd door smeerbartje op 28-10-2012 20:05 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik gebruik al sinds jaar en dag onderstaand script, tot op heden doet dat alles wat ik wil, ook voor passive ftp enzo :) 't zal misschien wel wat verouderd zijn ondertussen maarja, zo interessant is mijn server nu ook weer niet ;)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/bin/sh
#  
###########################################################################

set -x
DEBUG_LEVEL=INFO

EXTIF="eth0"
EXTIP=`ifconfig $EXTIF | awk '/inet addr/ { gsub(".*:", "", $2) ; print $2 }'`
EXTBROAD=`ifconfig $EXTIF | awk '/inet addr/ { gsub(".*:", "", $3) ; print $3 }'`
EXTGW=`/sbin/route -n | grep -A 4 UG | awk '{ print $2}'`

echo External IP: $EXTIP
echo External broadcast: $EXTBROAD
echo Default GW: $EXTGW
echo " --- "

INTIF="eth1"
INTIP=`ifconfig $INTIF | awk '/inet addr/ { gsub(".*:", "", $2) ; print $2 }'`
INT_MASK="`ifconfig $INTIF |grep Mask |cut -d: -f4`"
INTLAN="192.168.50.0/255.255.255.0"

echo Internal Interface: $INTIF
echo Internal IP: $INTIP
echo Internal LAN: $INTLAN
echo " --- "

LOIF="lo"
LOIP="127.0.0.1"

BROADCAST="255.255.255.255"

IPTABLES="`which 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

#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ipt_MASQUERADE
#/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
#/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc

###########################################################################

echo "echo 1 > /proc/sys/net/ipv4/ip_forward" && echo 1 > /proc/sys/net/ipv4/ip_forward
echo "echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter" && echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo "echo 1 > /proc/sys/net/ipv4/ip_dynaddr" && echo 1 > /proc/sys/net/ipv4/ip_dynaddr

###########################################################################

$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P OUTPUT DROP
$IPTABLES -t filter -P FORWARD DROP

$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT

$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT

$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F

$IPTABLES -t filter -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X


$IPTABLES -A INPUT -p ALL -i $INTIF -s $INTLAN -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LOIF -s $LOIP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LOIF -s $INTIP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LOIF -s $EXTIP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $INTIF -s 0.0.0.0 -d 255.255.255.255 -j ACCEPT

$IPTABLES -A INPUT -p ALL -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport http -j ACCEPT
$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport 110 -j ACCEPT
$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport 631 -j ACCEPT
$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport 25 -j ACCEPT
$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport 21 -j ACCEPT
$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport 65500:65534 -j ACCEPT
$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport 143 -j ACCEPT
$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport 993 -j ACCEPT
$IPTABLES -A INPUT -p TCP --syn -s 0/0 --dport 995 -j ACCEPT

$IPTABLES -A INPUT -p ICMP -s 0/0 --icmp-type echo-reply -j ACCEPT
$IPTABLES -A INPUT -p ICMP -s 0/0 --icmp-type echo-request -j ACCEPT
$IPTABLES -A INPUT -p ICMP -s 0/0 --icmp-type time-exceeded -j ACCEPT
$IPTABLES -A INPUT -i $EXTIF -d 224.0.0.0/8 -j DROP


$IPTABLES -A INPUT -d $EXTBROAD -j DROP 
$IPTABLES -A INPUT -d $BROADCAST -j DROP 

$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3


$IPTABLES -A FORWARD -i $INTIF -j ACCEPT

$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3


$IPTABLES -A OUTPUT -p ALL -s $LOIP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INTIP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $EXTIP -j ACCEPT

$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3

$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j SNAT --to-source $EXTIP

# Forward

$IPTABLES -t nat -A PREROUTING -p TCP -i $EXTIF -d $EXTIP --dport 60000 -j DNAT --to 192.168.50.27:60000
$IPTABLES -t nat -A PREROUTING -p UDP -i $EXTIF -d $EXTIP --dport 60000 -j DNAT --to 192.168.50.27:60000
$IPTABLES -t nat -A PREROUTING -p TCP -i $EXTIF -d $EXTIP --dport 50000 -j DNAT --to 192.168.50.11:50000
$IPTABLES -t nat -A PREROUTING -p UDP -i $EXTIF -d $EXTIP --dport 50000 -j DNAT --to 192.168.50.11:50000

$IPTABLES -A FORWARD -p TCP -i $EXTIF -d 192.168.50.27 --dport 60000 -j ACCEPT
$IPTABLES -A FORWARD -p UDP -i $EXTIF -d 192.168.50.27 --dport 60000 -j ACCEPT
$IPTABLES -A FORWARD -p TCP -i $EXTIF -d 192.168.50.11 --dport 50000 -j ACCEPT
$IPTABLES -A FORWARD -p UDP -i $EXTIF -d 192.168.50.11 --dport 50000 -j ACCEPT

Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
Ik heb nu het volgende, maar ik twijfel een beetje of het gaat werken. Ik heb mijn vragen er in het groen bijgezet.
# First drop INPUT and FORWARD
iptables -P INPUT -j DROP
# Of moet ik hier -i eth1 bij zetten??

iptables -P FORWARD -j DROP
# Dezelfde vraag: moet ik hier -i eth1 bij zetten??

# Now accept everything on lo and eth0 (local network)
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -i eth0 -p all -j ACCEPT -s 192.168.1.0/24
iptables -A OUTPUT -o lo -p all -j ACCEPT
iptables -A OUTPUT -o eth0 -p all -j ACCEPT -d 192.168.1.0/24
# Met die tweede input bereik ik toch dat de interne clients gewoon naar de DHCP server kunnen (draaiend op de firewall) en netjes een ip adres krijgen, toch?

# Allow previously established connections, interface eth1 is the internet interface
# hierover twijfel ik dus nog... is dit noodzakelijk?
iptables -A OUTPUT -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow port 80 (www) and 22 (SSH) connections to the firewall
iptables -A INPUT -p tcp -i eth1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -i eth1 --dport 80 -j ACCEPT

# Rules for NAT translation to internal network on eth0
iptables -A FORWARD -o eth1 -i eth0 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 02-10 22:42

CAPSLOCK2000

zie teletekst pagina 888

# Of moet ik hier -i eth1 bij zetten??
Nee, die policy geldt voor alle nics. Uit m'n hoofd denk ik dat er geen -j bij hoort maar dat heb ik niet gecontroleerd.
# Met die tweede input bereik ik toch dat de interne clients gewoon naar de DHCP server kunnen (draaiend op de firewall) en netjes een ip adres krijgen, toch?
Je accepteert alles van het interne netwerk, dus ook DHCP. (Stiekem trekt DHCP zich niks aan van je firewall, de meest populaire DHCP-server luistert op laag niveau zelf naar het netwerk en passeert zo de firewall. Altijd feest met DHCP & Firewalls)
# hierover twijfel ik dus nog... is dit noodzakelijk?
Dat ESTABLISHED/RELATED spul is nooit (?) noodzakelijk. Het is een optimalisatie waardoor je firewall minder werk hoeft te doen. Alleen het eerste pakketje van een verbinding krijgt de volledige behandeling, daarna mogen bijbehorende pakketjes zo door.

Aangezien er geen enkele regel voor OUTPUT meer komt (in dit script) heeft het hier geen enkele zin.
Het is overigens vrij gebruikelijk om OUTPUT niet te firewallen en helemaal vrij te laten. Als je nog aan het experimenteren bent zou ik het voor nu even weglaten en er pas mee beginnen als je de rest werkend hebt.

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
Nou, dankzij jullie hulp heb ik nu onderstaande in elkaar gedraaid. Na runnen lijkt het allemaal te werken. Heb ook even getest of de firewall daadwerkelijk ook iets doet door poort 80 NIET open te zetten. Inderdaad, Apache is dan niet van een externe locatie te bereiken.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/sh
echo "Clear old firewall rules..."
iptables --flush
iptables --flush FORWARD
iptables --flush INPUT
iptables --flush OUTPUT
iptables --table nat --flush
iptables --table nat --delete-chain
iptables --table mangle --flush
iptables --table mangle --delete-chain
iptables --delete-chain

echo "Drop all INPUT and FORWARD..."
iptables -P INPUT DROP
iptables -P FORWARD DROP

echo "Drop all IPv6 traffic..."
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP

echo "Accept everything on lo and eth0 (local network)..."
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A OUTPUT -o lo -p all -j ACCEPT
iptables -A INPUT -i eth0 -p all -j ACCEPT -s 192.168.1.0/24
iptables -A OUTPUT -o eth0 -p all -j ACCEPT -d 192.168.1.0/24

echo "IP Forwarding and Routing for gateway use..."
iptables -A FORWARD -o eth1 -i eth0 -s 192.168.1.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

echo "Enable Packet Forwarding..."
echo 1 > /proc/sys/net/ipv4/ip_forward

echo "Maintain established connections..."
iptables -A INPUT --in-interface eth1 --match conntrack --ctstate ESTABLISHED,RELATED --jump ACCEPT

echo "Logging rules...(prefix should be iptables:)"
#iptables -A INPUT -p tcp --dport 80 --syn -j LOG --log-prefix "iptables: "
#iptables -A INPUT -p tcp --dport 22 --syn -j LOG --log-prefix "iptables: "
#iptables -A INPUT -j LOG --log-level debug --log-prefix "iptables: ** Dropped ** "
iptables -A INPUT -j LOG --log-level debug --log-prefix "[IPTABLES DROP] :"

echo "Allow port 80 (www) and 22 (SSH) connections to the firewall..."
# start SSH anti brute force.
# Iptables tracks every new connection on port 22. When some one from the same IP
# connects 5 times within 600 seconds the IP will be automatically banned for 600 seconds
iptables -A INPUT -p tcp -i eth1 --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp -i eth1 --dport 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 5 --rttl --name SSH -j DROP
iptables -A INPUT -p tcp -i eth1 --dport 22 -j ACCEPT
# end SSH anti brute force
iptables -A INPUT -p tcp -i eth1 --dport 80 -j ACCEPT

#echo "Allow ping requests..."
#iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


Zoals gezegd lijkt alles te werken. Als ik een iptables -L uitvoer, dan krijg ik de volgende output:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  192.168.1.0/24       anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request state NEW,RELATED,ESTABLISHED

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  192.168.1.0/24       anywhere             ctstate NEW
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             192.168.1.0/24

Hoe moet ik dit nu lezen? als INPUT wordt standaard alles gedropped, echter ik zie ook staan dat "ALL" vanuit "anywhere" wordt "GEACCEPTEERD" voor destination "ANYWHERE". Ik doel dus op regel 3 van bovenstaande code. Wat betekent dit nu? En hebben jullie verder nog opmerkingen? Is mijn servertje (en de achterliggende clients) nu een beetje veilig allemaal?

[edit]
Heb een online testje gedaan.. ziet er volgens mij wel goed uit.

Afbeeldingslocatie: https://dl.dropbox.com/u/1757832/Screen%20Shot%202012-10-30%20at%2010.31.39%20PM.png

Afbeeldingslocatie: https://dl.dropbox.com/u/1757832/Screen%20Shot%202012-10-30%20at%2010.32.02%20PM.png

[ Voor 18% gewijzigd door smeerbartje op 01-11-2012 08:12 ]


Acties:
  • 0 Henk 'm!

  • DukeBox
  • Registratie: April 2000
  • Laatst online: 18:01

DukeBox

loves wheat smoothies

WHiZZi schreef op dinsdag 23 oktober 2012 @ 16:52:
enne, UPC doet nog geen IPv6, maar wellicht wel al handig om ook deze te firewallen ;). IPv4 firewallen is leuk en absoluut goed, maar vergeet IPv6 ook niet als je dat hebt/gaat gebruiken ;)
Sterker nog, tegenwoordig met al die isatap/teredo tunnels zetten veel mensen onbewust hun pc direct op internet.. dus oftewel tunnel firewallen op je client of tunnels blokkeren op je centrale firewall.
Beste oplossing is natuurlijk een tunnel opzetten op je router en die in je firewall beheren. Kunnen je clients native én veilig IPv6 communiceren.

Duct tape can't fix stupid, but it can muffle the sound.


Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
DukeBox schreef op dinsdag 30 oktober 2012 @ 21:46:
[...]

Sterker nog, tegenwoordig met al die isatap/teredo tunnels zetten veel mensen onbewust hun pc direct op internet.. dus oftewel tunnel firewallen op je client of tunnels blokkeren op je centrale firewall.
Beste oplossing is natuurlijk een tunnel opzetten op je router en die in je firewall beheren. Kunnen je clients native én veilig IPv6 communiceren.
Dit heb ik nu opgelost door alle IPv6 packets te droppen, voor zowle INPUT, OUTPUT als FORWARD. Zie script hierboven, regel 17.

Acties:
  • 0 Henk 'm!

  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
smeerbartje schreef op dinsdag 23 oktober 2012 @ 11:49:
  • Verkeer op poort 80 moet wel mogelijk zijn; Apache draait er immers op
  • SSH verkeer op 22 moet mogelijk zijn
Ik mis nog poort 443 voor https.

Zelf heb ik poort 22 aan de buitenkant dicht staan en luister ik alleen op 443 (en 80). De daemon sslh (http://www.linuxcertif.com/man/8/sslh/) splitst regulier https-verkeer en ssh-verkeer op poort 443 naar de respectievelijke services.

Twee voordelen:
  1. je hebt minder last van aanvallen op je ssh daemon
  2. je kunt vanuit een kantooromgeving (achter een proxy) met proxytunnel ssh'en naar je thuismachine

Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
Dank voor je suggesties... ik ben dus met deze set regels goed beveiligd denk je?
Hoe moet ik dit nu lezen? als INPUT wordt standaard alles gedropped, echter ik zie ook staan dat "ALL" vanuit "anywhere" wordt "GEACCEPTEERD" voor destination "ANYWHERE". Ik doel dus op regel 3 van bovenstaande code. Wat betekent dit nu? En hebben jullie verder nog opmerkingen? Is mijn servertje (en de achterliggende clients) nu een beetje veilig allemaal?
En weet je misschien hoe ik de output moet interpreteren?

Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
Iemand? Ik ben heel benieuwd wat die eerste "ACCEPT all -- anywhere anywhere" in het iptables -L overzicht nu precies inhoudt.

Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
Never mind; heb het al gevonden. Het bleek de input naar interface lo te zijn :). Stom stom stom. Voor de liefhebbers heb ik echter wel een mooi perl script gevonden dat realtime het IPTABLES "verkeer" laat zien. Zie screenshot:

Afbeeldingslocatie: https://dl.dropbox.com/u/1757832/realtimeIPtables.jpg

Acties:
  • 0 Henk 'm!

  • DukeBox
  • Registratie: April 2000
  • Laatst online: 18:01

DukeBox

loves wheat smoothies

smeerbartje schreef op dinsdag 30 oktober 2012 @ 22:18:
Dit heb ik nu opgelost door alle IPv6 packets te droppen, voor zowle INPUT, OUTPUT als FORWARD. Zie script hierboven, regel 17.
Dat is juist het hele punt.. je router/firewall ziet geen ipv6 omdat het getunneld is.

Duct tape can't fix stupid, but it can muffle the sound.


Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 02-10 22:42

CAPSLOCK2000

zie teletekst pagina 888

Met dukebox, die tunnels gaan zo door je firewall heen en het kan behoorlijk lastig zijn om ze tegen te houden aangezien een aantal van die protocollen juist zijn gemaakt om door NATs/firewalls heen te gaan.
Zelf voor IPv6 zorgen is de makkelijkste manier om dit soort problemen te voorkomen.

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 29-09 09:17
Uuuuh, kun je mij in de goede richting duwen? Waarop moet ik zoeken? Ik volg jullie niet helemaal.

Acties:
  • 0 Henk 'm!

  • DukeBox
  • Registratie: April 2000
  • Laatst online: 18:01

DukeBox

loves wheat smoothies

Makkelijkst is je even inlezen in IPv6 en dan met name tunneling over IPv4.

Duct tape can't fix stupid, but it can muffle the sound.


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

smeerbartje schreef op donderdag 01 november 2012 @ 20:30:
Iemand? Ik ben heel benieuwd wat die eerste "ACCEPT all -- anywhere anywhere" in het iptables -L overzicht nu precies inhoudt.
Zet nog even wat verbose vlagjes erbij:
code:
1
iptables -L -vvv

ASSUME makes an ASS out of U and ME

Pagina: 1