Commit eb1d7c5f authored by Arturo Borrero Gonzalez's avatar Arturo Borrero Gonzalez
Browse files

New upstream version 1.8.5

parent 290749d4
#!/bin/bash #!/bin/bash
#
# iptables-apply -- a safer way to update iptables remotely # iptables-apply -- a safer way to update iptables remotely
# #
# Copyright © Martin F. Krafft <madduck@madduck.net> # Usage:
# iptables-apply [-hV] [-t timeout] [-w savefile] {[rulesfile]|-c [runcmd]}
#
# Versions:
# * 1.0 Copyright 2006 Martin F. Krafft <madduck@madduck.net>
# Original version
# * 1.1 Copyright 2010 GW <gw.2010@tnode.com or http://gw.tnode.com/>
# Added parameter -c (run command)
# Added parameter -w (save successfully applied rules to file)
# Major code cleanup
#
# Released under the terms of the Artistic Licence 2.0 # Released under the terms of the Artistic Licence 2.0
# #
set -eu set -eu
PROGNAME="${0##*/}"; PROGNAME="${0##*/}"
VERSION=1.0 VERSION=1.1
### Default settings
DEF_TIMEOUT=10
TIMEOUT=10 MODE=0 # apply rulesfile mode
# MODE=1 # run command mode
function blurb() case "$PROGNAME" in
{ (*6*)
cat <<-_eof SAVE=ip6tables-save
RESTORE=ip6tables-restore
DEF_RULESFILE="/etc/network/ip6tables.up.rules"
DEF_SAVEFILE="$DEF_RULESFILE"
DEF_RUNCMD="/etc/network/ip6tables.up.run"
;;
(*)
SAVE=iptables-save
RESTORE=iptables-restore
DEF_RULESFILE="/etc/network/iptables.up.rules"
DEF_SAVEFILE="$DEF_RULESFILE"
DEF_RUNCMD="/etc/network/iptables.up.run"
;;
esac
### Functions
function blurb() {
cat <<-__EOF__
$PROGNAME $VERSION -- a safer way to update iptables remotely $PROGNAME $VERSION -- a safer way to update iptables remotely
_eof __EOF__
} }
function copyright() function copyright() {
{ cat <<-__EOF__
cat <<-_eof $PROGNAME has been published under the terms of the Artistic Licence 2.0.
$PROGNAME is C Martin F. Krafft <madduck@madduck.net>.
The program has been published under the terms of the Artistic Licence 2.0 Original version - Copyright 2006 Martin F. Krafft <madduck@madduck.net>.
_eof Version 1.1 - Copyright 2010 GW <gw.2010@tnode.com or http://gw.tnode.com/>.
__EOF__
} }
function about() function about() {
{
blurb blurb
echo echo
copyright copyright
} }
function usage() function usage() {
{ blurb
cat <<-_eof echo
Usage: $PROGNAME [options] ruleset cat <<-__EOF__
Usage:
$PROGNAME [-hV] [-t timeout] [-w savefile] {[rulesfile]|-c [runcmd]}
The script will try to apply a new ruleset (as output by iptables-save/read The script will try to apply a new rulesfile (as output by iptables-save,
by iptables-restore) to iptables, then prompt the user whether the changes read by iptables-restore) or run a command to configure iptables and then
are okay. If the new ruleset cut the existing connection, the user will not prompt the user whether the changes are okay. If the new iptables rules cut
be able to answer affirmatively. In this case, the script rolls back to the the existing connection, the user will not be able to answer affirmatively.
previous ruleset. In this case, the script rolls back to the previous working iptables rules
after the timeout expires.
The following options may be specified, using standard conventions: Successfully applied rules can also be written to savefile and later used
to roll back to this state. This can be used to implement a store last good
configuration mechanism when experimenting with an iptables setup script:
$PROGNAME -w $DEF_SAVEFILE -c $DEF_RUNCMD
-t | --timeout Specify the timeout in seconds (default: $TIMEOUT) When called as ip6tables-apply, the script will use ip6tables-save/-restore
-V | --version Display version information and IPv6 default values instead. Default value for rulesfile is
-h | --help Display this help text '$DEF_RULESFILE'.
_eof
Options:
-t seconds, --timeout seconds
Specify the timeout in seconds (default: $DEF_TIMEOUT).
-w savefile, --write savefile
Specify the savefile where successfully applied rules will be written to
(default if empty string is given: $DEF_SAVEFILE).
-c runcmd, --command runcmd
Run command runcmd to configure iptables instead of applying a rulesfile
(default: $DEF_RUNCMD).
-h, --help
Display this help text.
-V, --version
Display version information.
__EOF__
}
function checkcommands() {
for cmd in "${COMMANDS[@]}"; do
if ! command -v "$cmd" >/dev/null; then
echo "Error: needed command not found: $cmd" >&2
exit 127
fi
done
}
function revertrules() {
echo -n "Reverting to old iptables rules... "
"$RESTORE" <"$TMPFILE"
echo "done."
} }
SHORTOPTS="t:Vh";
LONGOPTS="timeout:,version,help"; ### Parsing and checking parameters
TIMEOUT="$DEF_TIMEOUT"
SAVEFILE=""
SHORTOPTS="t:w:chV";
LONGOPTS="timeout:,write:,command,help,version";
OPTS=$(getopt -s bash -o "$SHORTOPTS" -l "$LONGOPTS" -n "$PROGNAME" -- "$@") || exit $? OPTS=$(getopt -s bash -o "$SHORTOPTS" -l "$LONGOPTS" -n "$PROGNAME" -- "$@") || exit $?
for opt in $OPTS; do for opt in $OPTS; do
case "$opt" in case "$opt" in
(-*) unset OPT_STATE;; (-*)
unset OPT_STATE
;;
(*) (*)
case "${OPT_STATE:-}" in case "${OPT_STATE:-}" in
(SET_TIMEOUT) (SET_TIMEOUT) eval TIMEOUT=$opt;;
eval TIMEOUT=$opt (SET_SAVEFILE)
case "$TIMEOUT" in eval SAVEFILE=$opt
([0-9]*) :;; [ -z "$SAVEFILE" ] && SAVEFILE="$DEF_SAVEFILE"
(*)
echo "E: non-numeric timeout value." >&2
exit 1
;;
esac
;; ;;
esac esac
;; ;;
esac esac
case "$opt" in case "$opt" in
(-t|--timeout) OPT_STATE="SET_TIMEOUT";;
(-w|--write) OPT_STATE="SET_SAVEFILE";;
(-c|--command) MODE=1;;
(-h|--help) usage >&2; exit 0;; (-h|--help) usage >&2; exit 0;;
(-V|--version) about >&2; exit 0;; (-V|--version) about >&2; exit 0;;
(-t|--timeout) OPT_STATE=SET_TIMEOUT;;
(--) break;; (--) break;;
esac esac
shift shift
done done
case "$PROGNAME" in # Validate parameters
(*6*) if [ "$TIMEOUT" -ge 0 ] 2>/dev/null; then
SAVE=ip6tables-save TIMEOUT=$(($TIMEOUT))
RESTORE=ip6tables-restore else
DEFAULT_FILE=/etc/network/ip6tables echo "Error: timeout must be a positive number" >&2
;;
(*)
SAVE=iptables-save
RESTORE=iptables-restore
DEFAULT_FILE=/etc/network/iptables
;;
esac
FILE="${1:-$DEFAULT_FILE}";
if [[ -z "$FILE" ]]; then
echo "E: missing file argument." >&2
exit 1 exit 1
fi fi
if [[ ! -r "$FILE" ]]; then if [ -n "$SAVEFILE" -a -e "$SAVEFILE" -a ! -w "$SAVEFILE" ]; then
echo "E: cannot read $FILE" >&2 echo "Error: savefile not writable: $SAVEFILE" >&2
exit 2 exit 8
fi fi
COMMANDS=(tempfile "$SAVE" "$RESTORE") case "$MODE" in
(1)
# Treat parameter as runcmd (run command mode)
RUNCMD="${1:-$DEF_RUNCMD}"
if [ ! -x "$RUNCMD" ]; then
echo "Error: runcmd not executable: $RUNCMD" >&2
exit 6
fi
for cmd in "${COMMANDS[@]}"; do # Needed commands
if ! command -v $cmd >/dev/null; then COMMANDS=(mktemp "$SAVE" "$RESTORE" "$RUNCMD")
echo "E: command not found: $cmd" >&2 checkcommands
exit 127 ;;
(*)
# Treat parameter as rulesfile (apply rulesfile mode)
RULESFILE="${1:-$DEF_RULESFILE}";
if [ ! -r "$RULESFILE" ]; then
echo "Error: rulesfile not readable: $RULESFILE" >&2
exit 2
fi fi
done
umask 0700 # Needed commands
COMMANDS=(mktemp "$SAVE" "$RESTORE")
checkcommands
;;
esac
TMPFILE=$(tempfile -p iptap) ### Begin work
# Store old iptables rules to temporary file
TMPFILE=`mktemp /tmp/$PROGNAME-XXXXXXXX`
trap "rm -f $TMPFILE" EXIT HUP INT QUIT ILL TRAP ABRT BUS \ trap "rm -f $TMPFILE" EXIT HUP INT QUIT ILL TRAP ABRT BUS \
FPE USR1 SEGV USR2 PIPE ALRM TERM FPE USR1 SEGV USR2 PIPE ALRM TERM
if ! "$SAVE" >"$TMPFILE"; then if ! "$SAVE" >"$TMPFILE"; then
# An error occured
if ! grep -q ipt /proc/modules 2>/dev/null; then if ! grep -q ipt /proc/modules 2>/dev/null; then
echo "E: iptables support lacking from the kernel." >&2 echo "Error: iptables support lacking from the kernel" >&2
exit 3 exit 3
else else
echo "E: unknown error saving current iptables ruleset." >&2 echo "Error: unknown error saving old iptables rules: $TMPFILE" >&2
exit 4 exit 4
fi fi
fi fi
# Legacy to stop the fail2ban daemon if present
[ -x /etc/init.d/fail2ban ] && /etc/init.d/fail2ban stop [ -x /etc/init.d/fail2ban ] && /etc/init.d/fail2ban stop
echo -n "Applying new ruleset... " # Configure iptables
if ! "$RESTORE" <"$FILE"; then case "$MODE" in
(1)
# Run command in background and kill it if it times out
echo -n "Running command '$RUNCMD'... "
"$RUNCMD" &
CMD_PID=$!
( sleep "$TIMEOUT"; kill "$CMD_PID" 2>/dev/null; exit 0 ) &
CMDTIMEOUT_PID=$!
if ! wait "$CMD_PID"; then
echo "failed."
echo "Error: unknown error running command: $RUNCMD" >&2
revertrules
exit 7
else
echo "done."
fi
;;
(*)
# Apply iptables rulesfile
echo -n "Applying new iptables rules from '$RULESFILE'... "
if ! "$RESTORE" <"$RULESFILE"; then
echo "failed." echo "failed."
echo "E: unknown error applying new iptables ruleset." >&2 echo "Error: unknown error applying new iptables rules: $RULESFILE" >&2
revertrules
exit 5 exit 5
else else
echo "done." echo "done."
fi fi
;;
esac
# Prompt user for confirmation
echo -n "Can you establish NEW connections to the machine? (y/N) " echo -n "Can you establish NEW connections to the machine? (y/N) "
read -n1 -t "${TIMEOUT:-15}" ret 2>&1 || : read -n1 -t "$TIMEOUT" ret 2>&1 || :
case "${ret:-}" in case "${ret:-}" in
(y*|Y*) (y*|Y*)
# Success
echo echo
if [ ! -z "$SAVEFILE" ]; then
# Write successfully applied rules to the savefile
echo "Writing successfully applied rules to '$SAVEFILE'..."
if ! "$SAVE" >"$SAVEFILE"; then
echo "Error: unknown error writing successfully applied rules: $SAVEFILE" >&2
exit 9
fi
fi
echo "... then my job is done. See you next time." echo "... then my job is done. See you next time."
;; ;;
(*) (*)
if [[ -z "${ret:-}" ]]; then # Failed
echo "apparently not..."
else
echo echo
if [ -z "${ret:-}" ]; then
echo "Timeout! Something happened (or did not). Better play it safe..."
else
echo "No affirmative response! Better play it safe..."
fi fi
echo "Timeout. Something happened (or did not). Better play it safe..." revertrules
echo -n "Reverting to old ruleset... "
"$RESTORE" <"$TMPFILE";
echo "done."
exit 255 exit 255
;; ;;
esac esac
# Legacy to start the fail2ban daemon again
[ -x /etc/init.d/fail2ban ] && /etc/init.d/fail2ban start [ -x /etc/init.d/fail2ban ] && /etc/init.d/fail2ban start
exit 0 exit 0
......
.\" Title: iptables-apply .\" Title: iptables-apply
.\" Author: Martin F. Krafft .\" Author: Martin F. Krafft, GW
.\" Date: Jun 04, 2006 .\" Date: May 10, 2010
.\" .\"
.TH IPTABLES\-APPLY 8 "" "@PACKAGE_STRING@" "@PACKAGE_STRING@" .TH IPTABLES\-APPLY 8 "" "@PACKAGE_STRING@" "@PACKAGE_STRING@"
.\" disable hyphenation .\" disable hyphenation
...@@ -8,23 +8,37 @@ ...@@ -8,23 +8,37 @@
.SH NAME .SH NAME
iptables-apply \- a safer way to update iptables remotely iptables-apply \- a safer way to update iptables remotely
.SH SYNOPSIS .SH SYNOPSIS
\fBiptables\-apply\fP [\-\fBhV\fP] [\fB-t\fP \fItimeout\fP] \fIruleset\-file\fP \fBiptables\-apply\fP [\-\fBhV\fP] [\fB-t\fP \fItimeout\fP] [\fB-w\fP \fIsavefile\fP] {[\fIrulesfile]|-c [runcmd]}\fP
.SH "DESCRIPTION" .SH "DESCRIPTION"
.PP .PP
iptables\-apply will try to apply a new ruleset (as output by iptables\-apply will try to apply a new rulesfile (as output by
iptables\-save/read by iptables\-restore) to iptables, then prompt the iptables-save, read by iptables-restore) or run a command to configure
user whether the changes are okay. If the new ruleset cut the existing iptables and then prompt the user whether the changes are okay. If the
connection, the user will not be able to answer affirmatively. In this new iptables rules cut the existing connection, the user will not be
case, the script rolls back to the previous ruleset after the timeout able to answer affirmatively. In this case, the script rolls back to
expired. The timeout can be set with \fB\-t\fP. the previous working iptables rules after the timeout expires.
.PP .PP
When called as \fBip6tables\-apply\fP, the script will use Successfully applied rules can also be written to savefile and later used
ip6tables\-save/\-restore instead. to roll back to this state. This can be used to implement a store last good
configuration mechanism when experimenting with an iptables setup script:
iptables-apply \-w /etc/network/iptables.up.rules \-c /etc/network/iptables.up.run
.PP
When called as ip6tables\-apply, the script will use
ip6tables\-save/\-restore and IPv6 default values instead. Default
value for rulesfile is '/etc/network/iptables.up.rules'.
.SH OPTIONS .SH OPTIONS
.TP .TP
\fB\-t\fP \fIseconds\fR, \fB\-\-timeout\fP \fIseconds\fR \fB\-t\fP \fIseconds\fR, \fB\-\-timeout\fP \fIseconds\fR
Sets the timeout after which the script will roll back to the previous Sets the timeout in seconds after which the script will roll back
ruleset. to the previous ruleset (default: 10).
.TP
\fB\-w\fP \fIsavefile\fR, \fB\-\-write\fP \fIsavefile\fR
Specify the savefile where successfully applied rules will be written to
(default if empty string is given: /etc/network/iptables.up.rules).
.TP
\fB\-c\fP \fIruncmd\fR, \fB\-\-command\fP \fIruncmd\fR
Run command runcmd to configure iptables instead of applying a rulesfile
(default: /etc/network/iptables.up.run).
.TP .TP
\fB\-h\fP, \fB\-\-help\fP \fB\-h\fP, \fB\-\-help\fP
Display usage information. Display usage information.
...@@ -36,9 +50,11 @@ Display version information. ...@@ -36,9 +50,11 @@ Display version information.
\fBiptables-restore\fP(8), \fBiptables-save\fP(8), \fBiptables\fR(8). \fBiptables-restore\fP(8), \fBiptables-save\fP(8), \fBiptables\fR(8).
.SH LEGALESE .SH LEGALESE
.PP .PP
iptables\-apply is copyright by Martin F. Krafft. Original iptables-apply - Copyright 2006 Martin F. Krafft <madduck@madduck.net>.
Version 1.1 - Copyright 2010 GW <gw.2010@tnode.com or http://gw.tnode.com/>.
.PP .PP
This manual page was written by Martin F. Krafft <madduck@madduck.net> This manual page was written by Martin F. Krafft <madduck@madduck.net> and
extended by GW <gw.2010@tnode.com or http://gw.tnode.com/>.
.PP .PP
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the Artistic License 2.0. under the terms of the Artistic License 2.0.
...@@ -87,7 +87,7 @@ from Rusty Russell. ...@@ -87,7 +87,7 @@ from Rusty Russell.
.br .br
Andras Kis-Szabo <kisza@sch.bme.hu> contributed ip6tables-restore. Andras Kis-Szabo <kisza@sch.bme.hu> contributed ip6tables-restore.
.SH SEE ALSO .SH SEE ALSO
\fBiptables\-save\fP(8), \fBiptables\fP(8) \fBiptables\-apply\fP(8),\fBiptables\-save\fP(8), \fBiptables\fP(8)
.PP .PP
The iptables-HOWTO, which details more iptables usage, the NAT-HOWTO, The iptables-HOWTO, which details more iptables usage, the NAT-HOWTO,
which details NAT, and the netfilter-hacking-HOWTO which details the which details NAT, and the netfilter-hacking-HOWTO which details the
......
This diff is collapsed.
...@@ -62,7 +62,7 @@ Rusty Russell <rusty@rustcorp.com.au> ...@@ -62,7 +62,7 @@ Rusty Russell <rusty@rustcorp.com.au>
.br .br
Andras Kis-Szabo <kisza@sch.bme.hu> contributed ip6tables-save. Andras Kis-Szabo <kisza@sch.bme.hu> contributed ip6tables-save.
.SH SEE ALSO .SH SEE ALSO
\fBiptables\-restore\fP(8), \fBiptables\fP(8) \fBiptables\-apply\fP(8),\fBiptables\-restore\fP(8), \fBiptables\fP(8)
.PP .PP
The iptables-HOWTO, which details more iptables usage, the NAT-HOWTO, The iptables-HOWTO, which details more iptables usage, the NAT-HOWTO,
which details NAT, and the netfilter-hacking-HOWTO which details the which details NAT, and the netfilter-hacking-HOWTO which details the
......
This diff is collapsed.
...@@ -64,6 +64,8 @@ iptables_main(int argc, char *argv[]) ...@@ -64,6 +64,8 @@ iptables_main(int argc, char *argv[])
iptc_free(handle); iptc_free(handle);
} }
xtables_fini();
if (!ret) { if (!ret) {
if (errno == EINVAL) { if (errno == EINVAL) {
fprintf(stderr, "iptables: %s. " fprintf(stderr, "iptables: %s. "
......
...@@ -245,13 +245,13 @@ add, delete, insert, replace and append commands). ...@@ -245,13 +245,13 @@ add, delete, insert, replace and append commands).
This option has no effect in iptables and iptables-restore. This option has no effect in iptables and iptables-restore.
If a rule using the \fB\-4\fP option is inserted with (and only with) If a rule using the \fB\-4\fP option is inserted with (and only with)
ip6tables-restore, it will be silently ignored. Any other uses will throw an ip6tables-restore, it will be silently ignored. Any other uses will throw an
error. This option allows to put both IPv4 and IPv6 rules in a single rule file error. This option allows IPv4 and IPv6 rules in a single rule file
for use with both iptables-restore and ip6tables-restore. for use with both iptables-restore and ip6tables-restore.
.TP .TP
\fB\-6\fP, \fB\-\-ipv6\fP \fB\-6\fP, \fB\-\-ipv6\fP
If a rule using the \fB\-6\fP option is inserted with (and only with) If a rule using the \fB\-6\fP option is inserted with (and only with)
iptables-restore, it will be silently ignored. Any other uses will throw an iptables-restore, it will be silently ignored. Any other uses will throw an
error. This option allows to put both IPv4 and IPv6 rules in a single rule file error. This option allows IPv4 and IPv6 rules in a single rule file
for use with both iptables-restore and ip6tables-restore. for use with both iptables-restore and ip6tables-restore.
This option has no effect in ip6tables and ip6tables-restore. This option has no effect in ip6tables and ip6tables-restore.
.TP .TP
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment