30 Mar 2008 uruk 20080330
1. | ||
2. | ||
3. | ||
4. | ||
5. | ||
6. | ||
7. | ||
8. | ||
9. | ||
10. | ||
11. | ||
12. | ||
13. | ||
14. |
uruk - wrapper for Linux iptables, for managing firewall rules
# cp /usr/share/doc/uruk/examples/rc \ /etc/uruk/rc # vi /etc/uruk/rc # /etc/init.d/uruk start
First, create an rc file. See uruk-rc(5) for info on how to do this. Once this file is created and installed (this script looks in /etc/uruk/rc by default), you're ready to run uruk. You might want to test your rc file by running uruk in debug mode, see uruk-rc(5).
Vanilla iptables
After editing rc, load your rules like this. First flush your current rules:
# iptables -FThen enable your rc rules
# uruk. Inspect the rules by doing:
# iptables -L. If you want to make these changes survive a reboot, use the init script as shipped with this package. If you'd rather write your own init script, the iptables-restore(8) and iptables-save(8) commands from the iptables package might be helpful.
Using the Uruk init script
Assumed is the Uruk init script is installed as explained in the README file.
Optionally, install /etc/default/uruk (or /etc/sysconfig/uruk) and
tweak it. An example file is in /usr/share/doc/uruk/examples/default (You might like to enable
support for IPv6 rules, or for uruk-save.) Now activate uruk by doing:
# /etc/init.d/uruk startNow your pre-uruk iptables rules (if any) are saved as the "inactive" ruleset. While executing /etc/init.d/uruk start, your box is open during a short while. If you don't like this, read below about uruk-save.
When rebooting, everything will be fine: /etc/init.d/uruk stores state in /var/lib/uruk/iptables, using iptables-save(8), which comes with Linux iptables.
Using Debian ifupdown
In case you have just one network interface which should get protected, you
could use interfaces(5) from the Debian ifupdown package instead of the
init script. Suppose you'd like to protect ppp0, and would like not to
interfere with traffic on eth0: your other network interface.
First write an rc file. Be sure it features
interfaces_unprotect="lo eth0"Then run:
# mkdir -p /var/lib/uruk/iptables # iptables -F # iptables-save -c > /var/lib/uruk/iptables/down # uruk # iptables-save -c > /var/lib/uruk/iptables/upAdd
pre-up iptables-restore < /var/lib/uruk/iptables/up post-down iptables-restore < /var/lib/uruk/iptables/downto your interfaces stanza, in your /etc/network/interfaces .
Similar tricks might be possible on GNU/Linux systems from other distributions. The author is interested.
Using the Uruk init script
Do
# vi /etc/uruk/rc # /etc/init.d/uruk force-reloadWhile executing /etc/init.d/uruk force-reload, your box is open during a short while. If you don't like this, read below about uruk-save.
1 | rc is sourced as a shell script
| |
2 | Traffic on $interfaces_unprotect (just lo per default)
is trusted:
$iptables -A INPUT -i $iface -j ACCEPT | |
3 | $rc_a is sourced as a shell script, or, in case $rc_a is a directory, all
files matching $rc_a/*.rc are sourced as shell scripts
| |
4 | ESTABLISHED and RELATED packets are ACCEPT-ed:
$iptables -A INPUT -m state --state ESTABLISHED,RELATED \ -j ACCEPT | |
5 | $rc_b is sourced
| |
6 | $interfaces gets protected against spoofing: we don't allow anyone to
spoof non-routeable addresses. We block outgoing packets that don't have
our address as source: they are either spoofed or something is
misconfigured (NAT disabled, for instance). We want to be nice and don't
send out garbage.
$iptables -A INPUT -i $iface --source $no_route_ip \ -j DROPWe drop all incoming packets which don't have us as destination: $iptables -A OUTPUT -o $iface --source ! "$ip" \ -j DROPAnd we always allow outgoing connections: $iptables -A OUTPUT -m state --state NEW -o $iface \ -j ACCEPT | |
7 | $rc_c is sourced
| |
8 | Allow traffic to offered services, from trusted sources:
$iptables -A INPUT -m state --state NEW \ -i $iface --protocol $proto --source "$source" \ --destination "$ip" --destination-port "$port" \ -j ACCEPT | |
9 | $rc_d is sourced
| |
10 | Don't answer broadcast and multicast packets:
$iptables -A INPUT -i $iface --destination "$bcast" \ -j DROP | |
11 | $rc_f is sourced
| |
12 | Explicitly allow a subset of the ICMP types. (We disallow all other
traffic later.)
$iptables -A INPUT --protocol icmp --icmp-type $type \ -j ACCEPT | |
13 | $rc_g is sourced
| |
14 | Log packets (which make it till here)
$iptables -A INPUT -j LOG --log-level debug \ --log-prefix 'iptables: ' | |
15 | $rc_h is sourced
| |
16 | Reject all other packets
$iptables -A INPUT -j REJECT | |
17 | $rc_i is sourced
|
The init script will use uruk-save only if asked to do so in /etc/default/uruk (or /etc/sysconfig/uruk). If this file features
enable_uruk_save=true enable_uruk_save_warning=falseuruk-save is used whenever appropriate. The enable_uruk_save_warning variable controls whether a warning should get displayed whenever uruk-save is called. See uruk-save(8) for more details.
It rejects packets with source nor destination for one of our IPs.
Packets belonging to locally initiated sessions are allowed: we match state; the local host can act as a client for any remote service.
By default, uruk drops all ICMP packets (except those for interfaces in $interfaces_unprotect) with type other than
• | address-mask-reply
| |
• | address-mask-request
| |
• | destination-unreachable (this is a catch-all for a lot of types)
| |
• | echo-request
| |
• | echo-reply
| |
• | parameter-problem (catch-all for ip-header-bad and required-option-missing)
| |
• | timestamp-reply
| |
• | timestamp-request
| |
• | ttl-zero-during-transit
| |
• | ttl-zero-during-reassembly
|
By default, the FORWARD chain is left untouched, so has policy ACCEPT. (This won't do much harm, since packet forwarding is disabled by default in the Linux kernel. However, if you don't mind being paranoid, you might want to add a
iptables --policy FORWARD REJECTto your $rc_a uruk hook. See uruk-rc(5).)
By default, uruk logs all UDP and TCP packets which are blocked by the user defined policies. Loglevel is debug, logprefix is "iptables:". See also the notes on loglevel in uruk-rc(5).
Blocked TCP packets are answered with a tcp-reset.
• | "URUK_CONFIG" Full pathname of rc file; /etc/uruk/rc by default.
| |
• | "URUK_IPTABLES" Full pathname of iptables executable.
/sbin/iptables by default. Overrides iptables.
| |
• | "URUK_IP6TABLES" Full pathname of ip6tables executable, for experimental
IPv6 support. Overrides ip6tables.
| |
• | "URUK_INTERFACES_UNPROTECT" Default list of unprotected interfaces.
Overrides interfaces_unprotect. The default default is lo.
|
iptables(8), iptables-save(8), iptables-restore(8), http://www.netfilter.org/
interfaces(5), http://packages.debian.org/ifupdown.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.