Ik heb hier fast Adsl van XS4all. Ik heb een Alcatel speed Touch modem die via Sip spoof methode het internet verzorgd.
Ik heb nu een ipchains firewall draaien en die werkt prima. Maar ik wil nu eindelijk wel eens over op iptables. Ik heb iptables altijd al lastig gevonden. Zeker in vergelijking met ipchains. Ik heb heel veel topics gelezen met mensen die problemen hadden met iptables i.c.m. Nat.
Ik heb hier de complete Netfilter documentatie van www.netfilter.org liggen en het boek Linux firewalls second edition. Beide documenten heb ik doorgelezen.
Aan de hand van de documentatie ben ik begonnen met de input en output regels.
Deze regels zijn getest en werken ook. Ik kan vanaf de linux machine met lynx websites bezoeken enz.
Zijn de icmp regels wel nodig? Ik heb begrepen de connection tracking dit ook afhandeld? Klopt dit kunnen deze regels eruit?
Ik heb expres zoveel regels. Zaken als multiport kunnen later altijd nog als het werkt.
Daarna ben ik verder gegaan met de forwarding regels en NAT.
Ik wil later met PREROUTING poort 80 doorsturen naar een machine in het interne lan. Dit ga ik pas doen als gewoon Nat vanuit het LAN werkt.
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A PREROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
Zijn de bovenste regels goed of moet dit helemaal anders.
Ik wil met de forward regels bereiken dat alleen expliciet de regels toegevoegd doorgelaten moeten worden.
Alle regels geven geen fouten behalve de laatste SNAT regel:
$IPT -t nat -A POSTROUTING -o eth1 -j SNAT --to $IPADDR
Dan krijg ik invalid argument SNAT.
Ik heb denk ik een beetje hulp nodig om verder te komen. Doe ik iets grandioos fout?
Ik heb nu een ipchains firewall draaien en die werkt prima. Maar ik wil nu eindelijk wel eens over op iptables. Ik heb iptables altijd al lastig gevonden. Zeker in vergelijking met ipchains. Ik heb heel veel topics gelezen met mensen die problemen hadden met iptables i.c.m. Nat.
Ik heb hier de complete Netfilter documentatie van www.netfilter.org liggen en het boek Linux firewalls second edition. Beide documenten heb ik doorgelezen.
Aan de hand van de documentatie ben ik begonnen met de input en output regels.
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
| #!/bin/sh
# The location of important programs
IPT=/sbin/iptables
DEPMOD=/sbin/depmod
INSMOD=/sbin/insmod
MODPROBE=/sbin/modprobe
# Symbolic constants for recurring names and addresses
INTERNET="eth1" # Internet connected interface
LOOPBACK_INTERFACE="lo" # The name of the Loopback interface
IPADDR="XXX.XXX.XXX.XXX" # Internet ip address
LOOPBACK="127.0.0.0/8" # reserved loopback address range
CLASS_A="10.0.0.0/8" # Class A private networks
CLASS_B="172.16.0.0/12" # Class B private networks
CLASS_C="192.168.0.0/16" # Class C private networks
CLASS_D_MULTICAST="224.0.0.0/4" # Class D multicast addresses
ClASS_E_RESERVED_NET="240.0.0.0/5" # Class E reserved addresses
BROADCAST_SRC="0.0.0.0" # Broadcast source address
BROADCAST_DEST="255.255.255.255" # Broadcast destination address
PRIVPORTS="0:1023" # Well-know, privileged port range
UNPRIVPORTS="1024:65535" # Unprivileged port range
CONNECTION_TRACKING="1" # Enable connection tracking
# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Disable source Routed Packets
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
# Disable ICMP Redirect Acceptance
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f
done
# Don't send redirect messages
for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo 0 > $f
done
# Log packets with impossible addresses
for f in /proc/sys/net/ipv4/conf/*/log_martians; do
echo 1 > $f
done
# Remove any existing rules from all chains
$IPT --flush
$IPT -t nat --flush
$IPT -t mangle --flush
# Set the default policy to DENY
$IPT --policy INPUT DROP
$IPT --policy OUTPUT DROP
$IPT --policy FORWARD DROP
$IPT -t nat --policy PREROUTING DROP
$IPT -t nat --policy OUTPUT DROP
$IPT -t nat --policy POSTROUTING DROP
$IPT -t mangle --policy PREROUTING DROP
$IPT -t mangle --policy OUTPUT DROP
# Unlimited traffice on the loopback interface
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# Stealth scans and TCP state Flags
# All of the bits are cleared
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST ar both set
$IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
# Using Connection State to Bypass Rule Checking
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Using the state module alone, INVALID will break protocols that use
# bi-directional connections or multiple connections or exchanges,
# unless an ALG is provided for the protocol.
$IPT -A INPUT -m state --state INVALID -j LOG \
--log-prefix "INVALID input: "
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A OUTPUT -m state --state INVALID -j LOG \
--log-prefix "INVALID output: "
$IPT -A OUTPUT -m state --state INVALID -j DROP
fi
# Source address spoofing and other bad addresses
# Refuse spoofed packets pretending to be from the
# external interfaces ip address
$IPT -A INPUT -i $INTERNET -s $IPADDR -j DROP
# Refuse packets claiming to be from a Class A private network
$IPT -A INPUT -i $INTERNET -s $CLASS_A -j DROP
# Refuse packets claiming to be from a Class B private network
$IPT -A INPUT -i $INTERNET -s $CLASS_B -j DROP
# Refuse packets claiming to be from a Class C private network
$IPT -A INPUT -i $INTERNET -s $CLASS_C -j DROP
# Refuse packets claiming to be from the loopback interface private network
$IPT -A INPUT -i $INTERNET -s $LOOPBACK -j DROP
# Refuse malformed broadcast packets
$IPT -A INPUT -i $INTERNET -s $BROADCAST_DEST -j LOG
$IPT -A INPUT -i $INTERNET -s $BROADCAST_DEST -j DROP
$IPT -A INPUT -i $INTERNET -d $BROADCAST_SRC -j LOG
$IPT -A INPUT -i $INTERNET -d $BROADCAST_SRC -j DROP
# Refuse limited broadcasts
$IPT -A INPUT -i $INTERNET -d $BROADCAST_DEST -j DROP
# Refuse Class D multicast addresses
# illegas as as source address
$IPT -A INPUT -i $INTERNET -s $CLASS_D_MULTICAST -j DROP
# Filter incomming AUTH requests to your server
$IPT -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 113 -j REJECT --reject-with tcp-reset
# Allowing the Lan to access the internal interface
LAN_INTERFACE="eth0"
LAN_ADDRESS="192.168.0.0/24"
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $LAN_INTERFACE \
-s $LAN_ADDRESS \
-m state --state NEW -j ACCEPT
fi
# Allowing DNS Lookups as a Client
# Caching Dns server
CACHING_NAMESERVER="194.109.104.104"
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $CACHING_NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
fi
# Allowing DNS Lookups as a Client
# Caching Dns server
# Tcp rules
CACHING_NAMESERVER="194.109.104.104"
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $CACHING_NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
# Primary Dns server
PRIMARY_NAMESERVER="194.109.6.66"
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $PRIMARY_NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
fi
# Secondary Dns server
SECONDARY_NAMESERVER="194.109.9.99"
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $SECONDARY_NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
fi
# Allowing clients access to remote SSH Servers
SSH_PORTS="1024:65535"
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $SSH_PORTS \
--dport 22 -m state --state NEW -j ACCEPT
fi
# Allowing remote client access to you Local SSH server
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $INTERNET -p tcp \
-s $IPADDR --sport $SSH_PORTS \
--dport 22 -m state --state NEW -j ACCEPT
fi
# Allowing outgoing client access to remote FTP servers
# Outgoing FTP requests over the Control Channel
# The data channel is done by connection tracking
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 21 -m state --state NEW -j ACCEPT
fi
# Port-mode FTP data channels
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport $UNPRIVPORTS -m state --state NEW -j ACCEPT
fi
# Accessing remote websites as a client
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 80 -m state --state NEW -j ACCEPT
fi
# Enabling outgoing traceroute requests
TRACEROUTE_SRC_PORTS="32769:65535"
TRACEROUTE_DEST_PORTS="33434:33523"
$IPT -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport $TRACEROUTE_SRC_PORTS \
--dport $TRACEROUTE_DEST_PORTS -j ACCEPT
# Allow access to the time server of Xs4all
#TIME_SERVER="ntp.xs4all.nl"
#if [ "$CONNECTION_TRACKING" = "1" ]; then
# $IPT -A OUTPUT -o $INTERNET -p udp \
# -s $IPADDR --sport $UNPRIVPORTS \
# -d $TIME_SERVER --dport 123 \
# -m state --state NEW -j ACCEPT
#fi
# Filtering ICMP control and status messages
# Fragmented ICMP Messages
$IPT -A INPUT -i $INTERNET --fragment -p icmp -j LOG \
--log-prefix "Fragmented ICMP: "
$IPT -A INPUT -i $INTERNET --fragment -p icmp -j DROP
# Source quench control (Type 4) messages
$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type source-quench -d $IPADDR -j ACCEPT
$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type source-quench -j ACCEPT
# Parameter problem status (Type 12) messages
$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type parameter-problem -d $IPADDR -j ACCEPT
$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type parameter-problem -j ACCEPT
# Destination unreachable error (Type 3) messages
$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type destination-unreachable -d $IPADDR -j ACCEPT
$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type fragmentation-needed -j ACCEPT
# Don't log dropped outgoning ICMP error messages
$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type destination-unreachable -j DROP
# Time exceeded status (Type 11) messages
$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type time-exceeded -d $IPADDR -j ACCEPT
$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type time-exceeded -d $IPADDR -j ACCEPT
# Outgoing ping to remote hosts
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type echo-request \
-m state --state NEW -j ACCEPT
fi
# Incoming pings from remote hosts
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A INPUT -i $INTERNET -p icmp \
--icmp-type echo-request \
-d $IPADDR -m state --state NEW -j ACCEPT
fi |
Deze regels zijn getest en werken ook. Ik kan vanaf de linux machine met lynx websites bezoeken enz.
Zijn de icmp regels wel nodig? Ik heb begrepen de connection tracking dit ook afhandeld? Klopt dit kunnen deze regels eruit?
Ik heb expres zoveel regels. Zaken als multiport kunnen later altijd nog als het werkt.
Daarna ben ik verder gegaan met de forwarding regels en NAT.
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
| ###############################
# the forwarding and NAT rules#
###############################
# Using connection state to bypass rule checking
if [ "$CONNECTION_TRACKING" = "1" ]; then
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A PREROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
# Using the state module alone, INVALID will break protocols that use
# bi-directional connections of multiple connections or exchanges,
# unless an ALG is provided for the protocol.
$IPT -A FORWARD -m state --state INVALID -j LOG \
--log-prefix "INVALID forward: "
$IPT -t nat -A POSTROUTING -m state --state INVALID -j LOG \
--log-prefix "INVALID POSTROUTING: "
$IPT -t nat -A POSTROUTING -m state --state INVALID -j DROP
$IPT -t nat -A PREROUTING -m state --state INVALID -j LOG \
--log-prefix "INVALID PREROUTING: "
$IPT -t nat -A PREROUTING -m state --state INVALID -j DROP
fi
# Allowing DNS lookups as a client
# Caching nameserver
$IPT -A FORWARD -o $INTERNET -p udp \
--sport $UNPRIVPORTS -d $CACHING_NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS -d $CACHING_NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
# Primary dns server
$IPT -A FORWARD -o $INTERNET -p udp \
--sport $UNPRIVPORTS -d $PRIMARY_NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
# Secondary dns server
$IPT -A FORWARD -o $INTERNET -p udp \
--sport $UNPRIVPORTS -d $SECONDARY_NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
# Allowing access to remote websites (tcp 80)
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport 80 \
-m state --state NEW -j ACCEPT
# Allowing access to remote news servers (tcp 119)
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport 119 \
-m state --state NEW -j ACCEPT
# Allowing access to remote ftp servers (tcp 21)
# Control channel
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport 21 \
-m state --state NEW -j ACCEPT
# Data channel
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport 20 \
-m state --state NEW -j ACCEPT
# Ftp passive port modus
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport $UNPRIVPORTS \
-m state --state NEW -j ACCEPT
# Allowing access to remote ssl websites (tcp 443)
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport 443 \
-m state --state NEW -j ACCEPT
# Allowing access to remote pop3 servers (tcp 110)
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport 110 \
-m state --state NEW -j ACCEPT
# Allowing access to remote smtp servers (tcp 25)
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport 25 \
-m state --state NEW -j ACCEPT
# Allowing access to remote ssh servers (tcp 22)
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport $UNPRIVPORTS \
-m state --state NEW -j ACCEPT
# Allow access to the time server of xs4all
#$IPT -A FORWARD -o $INTERNET -p udp \
# --sport $UNPRIVPORTS -d $TIME_SERVER --dport 123 \
# -m state --state NEW -j ACCEPT
# Allow access to the Nipo server (tcp 634)
NIPO_SERVER="193.173.106.23"
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport 634 \
-m state --state NEW -j ACCEPT
# Allow outgoing Auth requests
$IPT -A FORWARD -o $INTERNET -p tcp \
--sport $UNPRIVPORTS --dport 113 \
-m state --state NEW -j ACCEPT
# NAT the internal lan to the internet
$IPT -t nat -A POSTROUTING -o eth1 -j SNAT --to $IPADDR |
Ik wil later met PREROUTING poort 80 doorsturen naar een machine in het interne lan. Dit ga ik pas doen als gewoon Nat vanuit het LAN werkt.
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A PREROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
Zijn de bovenste regels goed of moet dit helemaal anders.
Ik wil met de forward regels bereiken dat alleen expliciet de regels toegevoegd doorgelaten moeten worden.
Alle regels geven geen fouten behalve de laatste SNAT regel:
$IPT -t nat -A POSTROUTING -o eth1 -j SNAT --to $IPADDR
Dan krijg ik invalid argument SNAT.
Ik heb denk ik een beetje hulp nodig om verder te komen. Doe ik iets grandioos fout?
[ Voor 8% gewijzigd door Verwijderd op 14-06-2004 15:00 . Reden: ip adres eruit gehaald. Vraag over icmp ]