1 | #!/bin/sh
|
---|
2 | #
|
---|
3 | # rc.firewall - Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables
|
---|
4 | #
|
---|
5 | # Copyright (C) 2001 Oskar Andreasson <blueflux@koffein.net>
|
---|
6 | #
|
---|
7 | # This program is free software; you can redistribute it and/or modify
|
---|
8 | # it under the terms of the GNU General Public License as published by
|
---|
9 | # the Free Software Foundation; version 2 of the License.
|
---|
10 | #
|
---|
11 | # This program is distributed in the hope that it will be useful,
|
---|
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
14 | # GNU General Public License for more details.
|
---|
15 | #
|
---|
16 | # You should have received a copy of the GNU General Public License
|
---|
17 | # along with this program or from the site that you downloaded it
|
---|
18 | # from; if not, write to the Free Software Foundation, Inc., 59 Temple
|
---|
19 | # Place, Suite 330, Boston, MA 02111-1307 USA
|
---|
20 | #
|
---|
21 |
|
---|
22 | ###########################################################################
|
---|
23 | #
|
---|
24 | # 1. Configuration options.
|
---|
25 | #
|
---|
26 |
|
---|
27 | ###########################################################################
|
---|
28 | #
|
---|
29 | # Local Area Network configuration.
|
---|
30 | #
|
---|
31 | # your LAN's IP range and localhost IP. /24 means to only use the first 24
|
---|
32 | # bits of the 32 bit IP adress. the same as netmask 255.255.255.0
|
---|
33 | #
|
---|
34 |
|
---|
35 | LAN_IP="192.168.0.2"
|
---|
36 | LAN_IP_RANGE="192.168.0.0/16"
|
---|
37 | LAN_BCAST_ADRESS="192.168.255.255"
|
---|
38 | LAN_IFACE="eth1"
|
---|
39 |
|
---|
40 | ###########################################################################
|
---|
41 | #
|
---|
42 | # Localhost Configuration.
|
---|
43 | #
|
---|
44 |
|
---|
45 | LO_IFACE="lo"
|
---|
46 | LO_IP="127.0.0.1"
|
---|
47 |
|
---|
48 | ###########################################################################
|
---|
49 | #
|
---|
50 | # Internet Configuration.
|
---|
51 | #
|
---|
52 |
|
---|
53 | INET_IP="194.236.50.155"
|
---|
54 | INET_IFACE="eth0"
|
---|
55 |
|
---|
56 | ###########################################################################
|
---|
57 | #
|
---|
58 | # IPTables Configuration.
|
---|
59 | #
|
---|
60 |
|
---|
61 | IPTABLES="/usr/sbin/iptables"
|
---|
62 |
|
---|
63 | ###########################################################################
|
---|
64 | #
|
---|
65 | # 2. Module loading.
|
---|
66 | #
|
---|
67 |
|
---|
68 | #
|
---|
69 | # Needed to initially load modules
|
---|
70 | #
|
---|
71 | /sbin/depmod -a
|
---|
72 |
|
---|
73 | #
|
---|
74 | # Adds some iptables targets like LOG, REJECT and MASQUARADE.
|
---|
75 | #
|
---|
76 | /sbin/modprobe ip_conntrack
|
---|
77 | /sbin/modprobe ip_tables
|
---|
78 | /sbin/modprobe iptable_filter
|
---|
79 | /sbin/modprobe iptable_mangle
|
---|
80 | /sbin/modprobe iptable_nat
|
---|
81 | /sbin/modprobe ipt_LOG
|
---|
82 | #/sbin/modprobe ipt_REJECT
|
---|
83 | #/sbin/modprobe ipt_MASQUERADE
|
---|
84 |
|
---|
85 | #
|
---|
86 | # Support for owner matching
|
---|
87 | #
|
---|
88 | #/sbin/modprobe ipt_owner
|
---|
89 |
|
---|
90 | #
|
---|
91 | # Support for connection tracking of FTP and IRC.
|
---|
92 | #
|
---|
93 | #/sbin/modprobe ip_conntrack_ftp
|
---|
94 | #/sbin/modprobe ip_conntrack_irc
|
---|
95 |
|
---|
96 |
|
---|
97 | ###########################################################################
|
---|
98 | #
|
---|
99 | # 3. /proc set up.
|
---|
100 | #
|
---|
101 | # Enable ip_forward if you have two or more networks, including the
|
---|
102 | # Internet, that needs forwarding of packets through this box. This is
|
---|
103 | # critical since it is turned off as default in Linux.
|
---|
104 | #
|
---|
105 |
|
---|
106 | echo "1" > /proc/sys/net/ipv4/ip_forward
|
---|
107 |
|
---|
108 | #
|
---|
109 | # Dynamic IP users:
|
---|
110 | #
|
---|
111 | #echo "1" > /proc/sys/net/ipv4/ip_dynaddr
|
---|
112 |
|
---|
113 | ###########################################################################
|
---|
114 | #
|
---|
115 | # 4. IPTables rules set up.
|
---|
116 | #
|
---|
117 | # Set default policies for the INPUT, FORWARD and OUTPUT chains.
|
---|
118 | #
|
---|
119 |
|
---|
120 | $IPTABLES -P INPUT DROP
|
---|
121 | $IPTABLES -P OUTPUT DROP
|
---|
122 | $IPTABLES -P FORWARD DROP
|
---|
123 |
|
---|
124 | #
|
---|
125 | # bad_tcp_packets chain
|
---|
126 | #
|
---|
127 | # Take care of bad TCP packets that we don't want.
|
---|
128 | #
|
---|
129 |
|
---|
130 | $IPTABLES -N bad_tcp_packets
|
---|
131 | $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \
|
---|
132 | --log-prefix "New not syn:"
|
---|
133 | $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
|
---|
134 |
|
---|
135 | #
|
---|
136 | # Do some checks for obviously spoofed IP's
|
---|
137 | #
|
---|
138 |
|
---|
139 | $IPTABLES -A bad_tcp_packets -i $INET_IFACE -s 192.168.0.0/16 -j DROP
|
---|
140 | $IPTABLES -A bad_tcp_packets -i $INET_IFACE -s 10.0.0.0/8 -j DROP
|
---|
141 | $IPTABLES -A bad_tcp_packets -i $INET_IFACE -s 172.16.0.0/12 -j DROP
|
---|
142 |
|
---|
143 | #
|
---|
144 | # Enable simple IP Forwarding and Network Address Translation
|
---|
145 | #
|
---|
146 |
|
---|
147 | $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
|
---|
148 |
|
---|
149 | #
|
---|
150 | # Bad TCP packets we don't want
|
---|
151 | #
|
---|
152 |
|
---|
153 | $IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
|
---|
154 |
|
---|
155 | #
|
---|
156 | # Accept the packets we actually want to forward
|
---|
157 | #
|
---|
158 |
|
---|
159 | $IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
|
---|
160 | $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
|
---|
161 | $IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \
|
---|
162 | --log-level DEBUG --log-prefix "IPT FORWARD packet died: "
|
---|
163 |
|
---|
164 | #
|
---|
165 | # Create separate chains for ICMP, TCP and UDP to traverse
|
---|
166 | #
|
---|
167 |
|
---|
168 | $IPTABLES -N icmp_packets
|
---|
169 | $IPTABLES -N tcp_packets
|
---|
170 | $IPTABLES -N udpincoming_packets
|
---|
171 |
|
---|
172 | #
|
---|
173 | # The allowed chain for TCP connections
|
---|
174 | #
|
---|
175 |
|
---|
176 | $IPTABLES -N allowed
|
---|
177 | $IPTABLES -A allowed -p TCP --syn -j ACCEPT
|
---|
178 | $IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
|
---|
179 | $IPTABLES -A allowed -p TCP -j DROP
|
---|
180 |
|
---|
181 | #
|
---|
182 | # ICMP rules
|
---|
183 | #
|
---|
184 |
|
---|
185 | # Changed rules totally
|
---|
186 | $IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
|
---|
187 | $IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
|
---|
188 |
|
---|
189 | #
|
---|
190 | # TCP rules
|
---|
191 | #
|
---|
192 |
|
---|
193 | $IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
|
---|
194 | $IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
|
---|
195 | $IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
|
---|
196 | $IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed
|
---|
197 |
|
---|
198 | #
|
---|
199 | # UDP ports
|
---|
200 | #
|
---|
201 |
|
---|
202 | # nondocumented commenting out of these rules
|
---|
203 | #$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 53 -j ACCEPT
|
---|
204 | #$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 123 -j ACCEPT
|
---|
205 | $IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 2074 -j ACCEPT
|
---|
206 | $IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 4000 -j ACCEPT
|
---|
207 |
|
---|
208 | ##########################
|
---|
209 | # INPUT chain
|
---|
210 | #
|
---|
211 | # Bad TCP packets we don't want.
|
---|
212 | #
|
---|
213 |
|
---|
214 | $IPTABLES -A INPUT -p tcp -j bad_tcp_packets
|
---|
215 |
|
---|
216 | #
|
---|
217 | # Rules for incoming packets from the internet.
|
---|
218 | #
|
---|
219 |
|
---|
220 | $IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
|
---|
221 | $IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
|
---|
222 | $IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udpincoming_packets
|
---|
223 |
|
---|
224 | #
|
---|
225 | # Rules for special networks not part of the Internet
|
---|
226 | #
|
---|
227 |
|
---|
228 | $IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST_ADRESS -j ACCEPT
|
---|
229 | $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
|
---|
230 | $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
|
---|
231 | $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
|
---|
232 | $IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
|
---|
233 | $IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED \
|
---|
234 | -j ACCEPT
|
---|
235 | $IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
|
---|
236 | --log-level DEBUG --log-prefix "IPT INPUT packet died: "
|
---|
237 |
|
---|
238 | ###############################
|
---|
239 | # OUTPUT chain
|
---|
240 | #
|
---|
241 | #
|
---|
242 | # Bad TCP packets we don't want.
|
---|
243 | #
|
---|
244 |
|
---|
245 | $IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
|
---|
246 |
|
---|
247 | #
|
---|
248 | # Special OUTPUT rules to decide which IP's to allow.
|
---|
249 | #
|
---|
250 |
|
---|
251 | $IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
|
---|
252 | $IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
|
---|
253 | $IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
|
---|
254 |
|
---|
255 | #
|
---|
256 | # Log weird packets that don't match the above.
|
---|
257 | #
|
---|
258 |
|
---|
259 | $IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
|
---|
260 | --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
|
---|