HS16-17 revision master
authorHansjürg Wenger <wgh1@bfh.ch>
Thu, 8 Dec 2016 21:33:01 +0000 (22:33 +0100)
committerHansjürg Wenger <wgh1@bfh.ch>
Thu, 8 Dec 2016 21:33:01 +0000 (22:33 +0100)
14 files changed:
loganalyzer/config.php [new file with mode: 0644]
logrotate/clog [new file with mode: 0644]
logrotate/rlog [new file with mode: 0644]
rsyslog/from-remote.conf [new file with mode: 0644]
rsyslog/to-remote.conf [new file with mode: 0644]
sf-host-fw-pscan/iptables-host-stateful-ps-rules.v4 [new file with mode: 0644]
sf-host-fw/ip6tables-host-stateful-rules.v6 [new file with mode: 0644]
sf-host-fw/iptables-host-stateful-v1-rules.v4 [new file with mode: 0644]
sf-host-fw/iptables-host-stateful-v2-rules.v4 [new file with mode: 0644]
sf-net-fw-tproxy/iptables-tproxy-rules.v4 [new file with mode: 0644]
sf-net-fw-tproxy/squid.conf [new file with mode: 0644]
sf-net-fw/ip6tables-net-stateful-rules.v6 [new file with mode: 0644]
sf-net-fw/iptables-net-stateful-rules.v4 [new file with mode: 0644]
sl-host-fw/iptables-host-stateless-rules.v4 [new file with mode: 0644]

diff --git a/loganalyzer/config.php b/loganalyzer/config.php
new file mode 100644 (file)
index 0000000..5eec112
--- /dev/null
@@ -0,0 +1,220 @@
+<?php
+/*
+       *********************************************************************
+       * LogAnalyzer - http://loganalyzer.adiscon.com
+       * -----------------------------------------------------------------
+       * Main Configuration File
+       *
+       * -> Configuration need variables for the Database connection
+       *
+       * Copyright (C) 2008-2010 Adiscon GmbH.
+       *
+       * This file is part of LogAnalyzer.
+       *
+       * LogAnalyzer 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.
+       *
+       * LogAnalyzer 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 LogAnalyzer. If not, see <http://www.gnu.org/licenses/>.
+       *
+       * A copy of the GPL can be found in the file "COPYING" in this
+       * distribution.
+       * 
+       * Adiscon LogAnalyzer is also available under a commercial license.
+       * For details, contact info@adiscon.com or visit
+       * http://loganalyzer.adiscon.com/commercial
+       *********************************************************************
+*/
+
+// --- Avoid directly accessing this file! 
+if ( !defined('IN_PHPLOGCON') )
+{
+       die('Hacking attempt');
+       exit;
+}
+// --- 
+
+// --- UserDB options
+/*     If UserDB is enabled, all options will and have to be configured in the database. 
+*      All Options below the UserDB options here will not be used, unless a setting
+*      is missing in the database. 
+*/
+$CFG['UserDBEnabled'] = false;
+$CFG['UserDBServer'] = 'localhost';
+$CFG['UserDBPort'] = 3306;
+$CFG['UserDBName'] = 'loganalyzer'; 
+$CFG['UserDBPref'] = 'logcon_'; 
+$CFG['UserDBUser'] = 'root';
+$CFG['UserDBPass'] = '';
+$CFG['UserDBLoginRequired'] = false;
+$CFG['UserDBAuthMode'] = 0;    // USERDB_AUTH_INTERNAL means LogAnalyzer Internal Auth
+                                                                                               // USERDB_AUTH_LDAP means Auth via LDAP Server
+
+// LDAP Auth options
+$CFG['LDAPServer'] = '127.0.0.1';                                      // LDAP server hostname or IP
+$CFG['LDAPPort'] = 389;                                                                // LDAP port, 389 or 636 for SSL
+$CFG['LDAPBaseDN'] = 'CN=Users,DC=domain,DC=local';    // Base DN for LDAP Search, this is a typical ActiveDirectory sample
+$CFG['LDAPSearchFilter'] = '(objectClass=user)';       // Basic Search filter
+$CFG['LDAPUidAttribute'] = 'sAMAccountName';           // The LDAP attribute used in the search to find the user, example: uid, cn or sAMAccountName (Active Directory)
+                                                                                                       // DN of the privileged user for the search
+$CFG['LDAPBindDN'] = 'CN=Searchuser,CN=Users,DC=domain,DC=local'; // "Searchuser" = the privilegied user used to query LDAP Directory
+$CFG['LDAPBindPassword'] = 'Password';                         // Password of the privilegied user
+// --- 
+
+// --- Misc Options
+$CFG['MiscShowDebugMsg'] = 0;                          // if enabled, you will get additional output on certain places
+$CFG['MiscDebugToSyslog'] = 0;                         // if enabled, debug messages from LogAnalyzer will be send to syslog on linux, and into the EventLog on Windows
+$CFG['MiscShowDebugGridCounter'] = 0;          // Only for debugging purposes, will add a counter column into the grid!
+$CFG["MiscShowPageRenderStats"] = 1;           // If enabled, you will see Pagerender Settings
+$CFG['MiscEnableGzipCompression'] = 1;         // If enabled, LogAnalyzer will use gzip compression for output, we recommend
+                                                                                       // to have this option enabled, it will highly reduce bandwith usage. 
+$CFG['MiscMaxExecutionTime'] = 30;                     // LogAnalyzer will try to overwrite the default script timeout with this value during runtime!
+                                                                                       // This can of course only work if LogAnalyzer is allowed to changed the script timeout. 
+$CFG['DebugUserLogin'] = 0;                                    // if enabled, you will see additional informations on failed logins
+// --- 
+
+// --- Default Frontend Options 
+$CFG['PrependTitle'] = "NSLAB N048";                                   // If set, this text will be prepended withint the title tag
+$CFG['ViewUseTodayYesterday'] = 1;                     // If enabled, the date from today and yesterday is displayed as "today" and "yesterday"
+$CFG['ViewMessageCharacterLimit'] = 80;                // Default character limit for the message gets trunscated! 0 means NO trunscation.
+$CFG['ViewStringCharacterLimit'] = 30;         // Default character limit for all other string type fields before they get trunscated! 0 means NO trunscation.
+$CFG['ViewEntriesPerPage'] = 50;                       // Default number of syslog entries shown per page
+$CFG['ViewEnableDetailPopups'] = 1;                    // If enabled, you will see additional Details for each syslog message on mouse over. 
+$CFG['ViewDefaultTheme'] = "default";          // This sets the default theme the user is going to see when he opens LogAnalyzer the first time. 
+                                                                                       // Currently only "default" and "dark" are available. 
+$CFG['ViewDefaultLanguage'] = "en";                    // Sets the default display language
+$CFG['ViewEnableAutoReloadSeconds'] = 0;       // If "ViewEnableAutoReloadSeconds" is set to anything higher the 0 (which means disabled), this means auto reload is enabled by default. 
+
+$CFG['SearchCustomButtonCaption'] = "I'd like to feel sad";    // Default caption for the custom fast search button
+$CFG['SearchCustomButtonSearch'] = "error";                                    // Default search string for the custom search button
+
+$CFG['EnableContextLinks'] = 1;                                // if enabled, context links within the messages will automatically be created and added. Set this to 0 to disable all context links. 
+$CFG['EnableIPAddressResolve'] = 1;                    // If enabled, IP Addresses inline messages are automatically resolved and the result is added in brackets {} behind the IP Address
+$CFG['SuppressDuplicatedMessages'] = 0;                // If enabled, duplicated messages will be suppressed in the main display. 
+$CFG['TreatNotFoundFiltersAsTrue'] = 0;                // If you filter / search for messages, and the fields you are filtering for is not found, the filter result is treaten as TRUE! 
+$CFG['PopupMenuTimeout'] = 3000;                       // This variable defines the default timeout value for popup menus in milliseconds. (those menus which popup when you click on the value of a field.
+$CFG['PhplogconLogoUrl'] = "";                         // Put an Url to a custom toplogo you want to use.
+$CFG['InlineOnlineSearchIcons'] = 1;           // Show online search icons
+$CFG['UseProxyServerForRemoteQueries'] = "";// If empty no proxy server will be used. If set to a proxy server url like 127.0.0.1:8080, LogAnalyzer will use this server for url queries like the updatecheck. 
+//$CFG['HeaderDefaultEncoding'] = ENC_ISO_8859_1;      // Set default character encoding
+$CFG['HeaderDefaultEncoding'] = ENC_UTF8;      // Set default character encoding
+$CFG['DefaultFont'] = "Arial";                         // Sets the default Font to be used in Loganalyzer
+$CFG['DefaultFontSize'] = "100";                       // Sets the percentage font size, default is 100 (Percent). Can be changed up to 200 and down to 50 with good results.  
+// ---
+
+// --- Custom HTML Code 
+$CFG['InjectHtmlHeader'] = "";                         // Use this variable to inject custom html into the html <head> area!
+$CFG['InjectBodyHeader'] = "";                         // Use this variable to inject custom html into the begin of the <body> area!
+$CFG['InjectBodyFooter'] = "";                         // Use this variable to inject custom html into the end of the <body> area!
+// ---
+
+// --- Define which fields you want to see 
+//$CFG['ShowMessage'] = true;                                  // If enabled, the Message column will be appended to the columns list.
+//Eventlog based fields: $CFG['Columns'] = array ( SYSLOG_DATE, SYSLOG_HOST, SYSLOG_EVENT_LOGTYPE, SYSLOG_EVENT_SOURCE, /*SYSLOG_EVENT_CATEGORY, */SYSLOG_EVENT_ID, SYSLOG_MESSAGE );
+//$CFG['Columns'] = array ( SYSLOG_DATE, SYSLOG_FACILITY, SYSLOG_SEVERITY, SYSLOG_HOST, SYSLOG_SYSLOGTAG, SYSLOG_MESSAGETYPE, SYSLOG_MESSAGE );
+$CFG['DefaultViewsID'] = "";
+// ---
+
+// --- Predefined Searches! 
+$CFG['Search'][] = array ( "DisplayName" => "Syslog Warnings and Errors", "SearchQuery" => "filter=severity%3A0%2C1%2C2%2C3%2C4&search=Search" );
+$CFG['Search'][] = array ( "DisplayName" => "Syslog Errors", "SearchQuery" => "filter=severity%3A0%2C1%2C2%2C3&search=Search" );
+$CFG['Search'][] = array ( "DisplayName" => "All messages from the last hour", "SearchQuery" => "filter=datelastx%3A1&search=Search" );
+$CFG['Search'][] = array ( "DisplayName" => "All messages from last 12 hours", "SearchQuery" => "filter=datelastx%3A2&search=Search" );
+$CFG['Search'][] = array ( "DisplayName" => "All messages from last 24 hours", "SearchQuery" => "filter=datelastx%3A3&search=Search" );
+$CFG['Search'][] = array ( "DisplayName" => "All messages from last 7 days", "SearchQuery" => "filter=datelastx%3A4&search=Search" );
+$CFG['Search'][] = array ( "DisplayName" => "All messages from last 31 days", "SearchQuery" => "filter=datelastx%3A5&search=Search" );
+// $CFG['Search'][] = array ( "DisplayName" => "", "SearchQuery" => "" );
+// ---
+
+// --- Predefined Charts!
+$CFG['Charts'][] = array ( "DisplayName" => "Top Hosts", "chart_type" => CHART_BARS_HORIZONTAL, "chart_width" => 400, "chart_field" => SYSLOG_HOST, "maxrecords" => 10, "showpercent" => 0, "chart_enabled" => 1 );
+$CFG['Charts'][] = array ( "DisplayName" => "SyslogTags", "chart_type" => CHART_CAKE, "chart_width" => 400, "chart_field" => SYSLOG_SYSLOGTAG, "maxrecords" => 10, "showpercent" => 0, "chart_enabled" => 1 );
+$CFG['Charts'][] = array ( "DisplayName" => "Severity Occurences", "chart_type" => CHART_BARS_VERTICAL, "chart_width" => 400, "chart_field" => SYSLOG_SEVERITY, "maxrecords" => 10, "showpercent" => 1, "chart_enabled" => 1 );
+$CFG['Charts'][] = array ( "DisplayName" => "Usage by Day", "chart_type" => CHART_CAKE, "chart_width" => 400, "chart_field" => SYSLOG_DATE, "maxrecords" => 10, "showpercent" => 1, "chart_enabled" => 1 );
+// ---
+
+// --- Configure allowed directories for File base logstream sources
+$CFG['DiskAllowed'][] = "/var/log/"; 
+// ---
+
+// --- Source Options
+/* Example for DiskType Source:
+       $CFG['Sources']['Source1']['ID'] = "Source1";
+       $CFG['Sources']['Source1']['Name'] = "Syslog Disk File";
+       $CFG['Sources']['Source1']['Description'] = "More details you want to see about this source";
+       $CFG['Sources']['Source1']['SourceType'] = SOURCE_DISK;
+       $CFG['Sources']['Source1']['LogLineType'] = "syslog";
+       $CFG['Sources']['Source1']['MsgParserList'] = "";
+       $CFG['Sources']['Source1']['MsgNormalize'] = 0;
+       $CFG['Sources']['Source1']['DiskFile'] = "/var/log/syslog";
+       $CFG['Sources']['Source1']['ViewID'] = "SYSLOG";
+
+       $CFG['Sources']['Source2']['ID'] = "Source5";
+       $CFG['Sources']['Source2']['Name'] = "WinSyslog DB";
+       $CFG['Sources']['Source1']['Description'] = "";
+       $CFG['Sources']['Source2']['SourceType'] = SOURCE_DB;
+       $CFG['Sources']['Source1']['MsgParserList'] = "";
+       $CFG['Sources']['Source2']['DBTableType'] = "winsyslog";
+       $CFG['Sources']['Source2']['DBType'] = DB_MYSQL;
+       $CFG['Sources']['Source2']['DBServer'] = "localhost";
+       $CFG['Sources']['Source2']['DBName'] = "loganalyzer";
+       $CFG['Sources']['Source2']['DBUser'] = "root";
+       $CFG['Sources']['Source2']['DBPassword'] = "";
+       $CFG['Sources']['Source2']['DBTableName'] = "systemevents";
+       $CFG['Sources']['Source2']['ViewID'] = "SYSLOG";
+*/
+
+$CFG['DefaultSourceID'] = 'Source1';
+
+$CFG['Sources']['Source1']['ID'] = 'Source1';
+$CFG['Sources']['Source1']['Name'] = 'All Syslogs';
+$CFG['Sources']['Source1']['ViewID'] = 'SYSLOG';
+$CFG['Sources']['Source1']['SourceType'] = SOURCE_DISK;
+$CFG['Sources']['Source1']['LogLineType'] = 'syslog23';
+$CFG['Sources']['Source1']['DiskFile'] = '/var/log/clog/all.log';
+
+$CFG['Sources']['Source2']['ID'] = 'Source2';
+$CFG['Sources']['Source2']['Name'] = 'All Secure Logs';
+$CFG['Sources']['Source2']['ViewID'] = 'SYSLOG';
+$CFG['Sources']['Source2']['SourceType'] = SOURCE_DISK;
+$CFG['Sources']['Source2']['LogLineType'] = 'syslog23';
+$CFG['Sources']['Source2']['DiskFile'] = '/var/log/clog/secure';
+
+$CFG['Sources']['Source3']['ID'] = 'Source3';
+$CFG['Sources']['Source3']['Name'] = 'All SSHD Logs';
+$CFG['Sources']['Source3']['ViewID'] = 'SYSLOG';
+$CFG['Sources']['Source3']['SourceType'] = SOURCE_DISK;
+$CFG['Sources']['Source3']['LogLineType'] = 'syslog23';
+$CFG['Sources']['Source3']['DiskFile'] = '/var/log/clog/sshd.log';
+
+$CFG['Sources']['Source4']['ID'] = 'Source4';
+$CFG['Sources']['Source4']['Name'] = 'All Boot Logs';
+$CFG['Sources']['Source4']['ViewID'] = 'SYSLOG';
+$CFG['Sources']['Source4']['SourceType'] = SOURCE_DISK;
+$CFG['Sources']['Source4']['LogLineType'] = 'syslog23';
+$CFG['Sources']['Source4']['DiskFile'] = '/var/log/clog/boot.log';
+
+$CFG['Sources']['Source5']['ID'] = 'Source5';
+$CFG['Sources']['Source5']['Name'] = 'All Logs off system "router"';
+$CFG['Sources']['Source5']['ViewID'] = 'SYSLOG';
+$CFG['Sources']['Source5']['SourceType'] = SOURCE_DISK;
+$CFG['Sources']['Source5']['LogLineType'] = 'syslog23';
+$CFG['Sources']['Source5']['DiskFile'] = '/var/log/rlog/router/all.log';
+
+$CFG['Sources']['Source6']['ID'] = 'Source6';
+$CFG['Sources']['Source6']['Name'] = 'Local Webserver Access Log';
+$CFG['Sources']['Source6']['ViewID'] = 'SYSLOG';
+$CFG['Sources']['Source6']['SourceType'] = SOURCE_DISK;
+$CFG['Sources']['Source6']['LogLineType'] = 'misc';
+$CFG['Sources']['Source6']['DiskFile'] = '/var/log/httpd/access_log';
+
+// --- 
+
+?>
diff --git a/logrotate/clog b/logrotate/clog
new file mode 100644 (file)
index 0000000..5714e81
--- /dev/null
@@ -0,0 +1,40 @@
+#
+# logrotate config for combined logs on centralized log server
+#
+# copy this file to /etc/logrotate.d on CentOS/RHEL system
+# (tested on CentOs/RHEL 7.x)
+#
+# (c) BFH, WGH1 2016
+#
+
+# combined log files
+/var/log/clog/secure
+/var/log/clog/maillog
+/var/log/clog/messages
+/var/log/clog/cron
+/var/log/clog/spooler
+/var/log/clog/boot.log
+/var/log/clog/sshd.log
+/var/log/clog/switch.log
+{
+    size 10M
+    sharedscripts
+    postrotate
+        reload rsyslog >/dev/null 2>&1 || true
+    endscript
+    missingok
+    compress
+    rotate 9
+}
+# all combined logs
+/var/log/clog/all.log
+{
+    size 20M
+    sharedscripts
+    postrotate
+        reload rsyslog >/dev/null 2>&1 || true
+    endscript
+    missingok
+    compress
+    rotate 9
+}
diff --git a/logrotate/rlog b/logrotate/rlog
new file mode 100644 (file)
index 0000000..4c196a3
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# logrotate config for per host logs on centralized log server
+#
+# copy this file to /etc/logrotate.d on CentOS/RHEL system
+# (tested on CentOs/RHEL 7.x)
+#
+# (c) BFH, WGH1 2016
+#
+
+# per host log files
+/var/log/rlog/*/secure
+/var/log/rlog/*/maillog
+/var/log/rlog/*/messages
+/var/log/rlog/*/cron
+/var/log/rlog/*/spooler
+/var/log/rlog/*/boot.log
+/var/log/rlog/*/sshd.log
+/var/log/rlog/*/switch.log
+/var/log/rlog/*/all.log
+{
+    size 10M
+    sharedscripts
+    postrotate
+        reload rsyslog >/dev/null 2>&1 || true
+    endscript
+    missingok
+    compress
+    rotate 9
+}
diff --git a/rsyslog/from-remote.conf b/rsyslog/from-remote.conf
new file mode 100644 (file)
index 0000000..0093bc7
--- /dev/null
@@ -0,0 +1,77 @@
+#
+# rsyslog config: centralized log server
+#
+# copy this file to /etc/rsyslog.d on CentOS/RHEL
+# systems and restart rsyslog (tested on CentOs/RHEL 7.x)
+#
+# (c) BFH, WGH1 2016
+#
+
+# syslog reception
+
+# enable syslog reception on udp and/or tcp port 514
+
+# provides UDP syslog reception
+$ModLoad imudp
+$UDPServerRun 514
+
+# provides TCP syslog reception
+#$ModLoad imtcp
+#$InputTCPServerRun 514
+
+# enable syslog reliable event logging protocol (RELP)
+# provides RELP syslog reception
+$ModLoad imrelp
+$InputRELPServerRun 2514
+
+# log templates
+
+# log-per-host templates
+$template RAUTH,"/var/log/rlog/%HOSTNAME%/secure"
+$template RMAIL,"/var/log/rlog/%HOSTNAME%/maillog"
+$template RMESS,"/var/log/rlog/%HOSTNAME%/messages"
+$template RCRON,"/var/log/rlog/%HOSTNAME%/cron"
+$template RSPOOL,"/var/log/rlog/%HOSTNAME%/spooler"
+$template RBOOT,"/var/log/rlog/%HOSTNAME%/boot.log"
+$template RSSHD,"/var/log/rlog/%HOSTNAME%/sshd.log"
+$template RNET,"/var/log/rlog/%HOSTNAME%/switch.log"
+$template RALL,"/var/log/rlog/%HOSTNAME%/all.log"
+
+# combined-log templates
+$template CRAUTH,"/var/log/clog/secure"
+$template CRMAIL,"/var/log/clog/maillog"
+$template CRMESS,"/var/log/clog/messages"
+$template CRCRON,"/var/log/clog/cron"
+$template CRSPOOL,"/var/log/clog/spooler"
+$template CRBOOT,"/var/log/clog/boot.log"
+$template CRSSHD,"/var/log/clog/sshd.log"
+$template CRNET,"/var/log/clog/switch.log"
+$template ALL,"/var/log/clog/all.log"
+
+# log targets (combined and per host)
+
+*.*    ?ALL;RSYSLOG_SyslogProtocol23Format
+*.*    ?RALL;RSYSLOG_SyslogProtocol23Format
+*.info;mail.none;authpriv.none;cron.none;local6.none   ?RMESS
+*.info;mail.none;authpriv.none;cron.none;local6.none   ?CRMESS
+
+auth,authpriv.*                                        ?RAUTH
+auth,authpriv.*                                        ?CRAUTH;RSYSLOG_SyslogProtocol23Format
+
+mail.*                                         ?RMAIL
+mail.*                                         ?CRMAIL;RSYSLOG_SyslogProtocol23Format
+
+cron.*                                         ?RCRON
+cron.*                                         ?CRCRON;RSYSLOG_SyslogProtocol23Format
+
+uucp,news.crit                                 ?RSPOOL
+uucp,news.crit                                 ?CRSPOOL;RSYSLOG_SyslogProtocol23Format
+
+local6.*                                       ?RNET
+local6.*                                       ?CRNET;RSYSLOG_SyslogProtocol23Format
+
+local7.*                                       ?RBOOT
+local7.*                                       ?CRBOOT;RSYSLOG_SyslogProtocol23Format
+
+:programname, contains, "sshd"                 ?RSSHD
+:programname, contains, "sshd"                 ?CRSSHD;RSYSLOG_SyslogProtocol23Format
diff --git a/rsyslog/to-remote.conf b/rsyslog/to-remote.conf
new file mode 100644 (file)
index 0000000..5f3d101
--- /dev/null
@@ -0,0 +1,22 @@
+#
+# rsyslog config: send syslogs to log server
+#
+# copy this file to /etc/rsyslog.d on CentOS/RHEL
+# systems and restart rsyslog (tested on CentOs/RHEL 7.x)
+#
+# (c) BFH, WGH1 2016
+#
+
+# send syslogs to loghost using UDP
+#*.*   @147.87.86.227  
+
+# send syslogs to loghost using TCP
+#*.*   @@147.87.86.227 
+
+# enable syslog reliable event logging protocol (RELP)
+# send syslogs to loghost using RELP
+# see http://www.rsyslog.com/doc/relp.html
+#
+$ModLoad omrelp
+*.*     :omrelp:147.87.86.227:2514
+
diff --git a/sf-host-fw-pscan/iptables-host-stateful-ps-rules.v4 b/sf-host-fw-pscan/iptables-host-stateful-ps-rules.v4
new file mode 100644 (file)
index 0000000..24b2e98
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# iptables host firewall example (stateful)
+#
+# iptables-save format
+# restore using iptables-restore < rules.v4
+#
+# (c) BFH, WGH1 2016
+#
+*filter
+:INPUT ACCEPT [0:0]
+:FORWARD ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+:PSCAN - [0:0]
+-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "accept incomming RELATED and ESTABLISHED connections"
+-A INPUT -m conntrack --ctstate NEW -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT -m comment --comment "accept new local traffic"
+-A INPUT -p tcp -m conntrack --ctstate NEW,INVALID -m multiport --dports 21,23,25,80,443,587,993,995 -m comment --comment "sniff on unused tcp .." -j PSCAN
+-A INPUT -p udp -m conntrack --ctstate NEW,INVALID -m multiport --dports 53,67,69,111,123,161 -m comment --comment ".. and udp WKS ports to detect port scans" -j PSCAN
+-A INPUT -p udp -m udp --dport 68 -j ACCEPT -m comment --comment "DHCP configuration: bootps -> bootpc"
+-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --sport 1024:65535 --dport 22 -j ACCEPT -m comment --comment "accept incomming ssh connections"
+-A INPUT -j REJECT --reject-with icmp-host-prohibited -m comment --comment "RFC-friendly reject any other incomming connection"
+-A PSCAN -m recent --set --name PSCAN --rsource -m comment --comment "set/write match to recent table PSCAN (see /proc/net/xt_recent/PSCAN)"
+-A PSCAN -m recent --update --seconds 60 --hitcount 5 --rttl --name PSCAN --rsource -m limit --limit 5/min -m comment --comment "log unwanted packets when more then 5 per minute arrive, limit the number of log entries" -j LOG --log-prefix "ipt_pscan:"
+-A PSCAN -m recent --update --seconds 60 --hitcount 5 --rttl --name PSCAN --rsource -m comment --comment "and drop them" -j DROP
+COMMIT
diff --git a/sf-host-fw/ip6tables-host-stateful-rules.v6 b/sf-host-fw/ip6tables-host-stateful-rules.v6
new file mode 100644 (file)
index 0000000..fa56c0b
--- /dev/null
@@ -0,0 +1,18 @@
+#
+# ip6tables host firewall example (stateful)
+#
+# ip6tables-save format
+# restore using ip6tables-restore < rules.v6
+#
+# (c) BFH, WGH1 2016
+#
+*filter
+:INPUT ACCEPT [0:0]
+:FORWARD ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+-A INPUT -p icmpv6 -j ACCEPT -m comment --comment "could be more sophisticated see https://www.cert.org/downloads/IPv6/ip6tables_rules.txt"
+-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "accept incomming RELATED and ESTABLISHED connections"
+-A INPUT -m conntrack --ctstate NEW -i lo -j ACCEPT -m comment --comment "accept new local traffic"
+-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --sport 1024:65535 --dport 22 -j ACCEPT -m comment --comment "accept incomming ssh connections"
+-A INPUT -j REJECT --reject-with adm-prohibited -m comment --comment "RFC-friendly reject any other incomming connection"
+COMMIT
diff --git a/sf-host-fw/iptables-host-stateful-v1-rules.v4 b/sf-host-fw/iptables-host-stateful-v1-rules.v4
new file mode 100644 (file)
index 0000000..836e80e
--- /dev/null
@@ -0,0 +1,31 @@
+#
+# iptables host firewall example (stateful)
+#
+# iptables-save format
+# restore using iptables-restore < rules.v4
+#
+# (c) BFH, WGH1 2016
+#
+*filter
+:INPUT DROP [0:0]
+:FORWARD DROP [0:0]
+:OUTPUT DROP [0:0]
+-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "accept incomming RELATED and ESTABLISHED connections"
+-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "accept outgoing RELATED and ESTABLISHED connections"
+# accept local traffic
+-A INPUT -m conntrack --ctstate NEW -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT -m comment --comment "accept new local traffic"
+-A OUTPUT -m conntrack --ctstate NEW -s 127.0.0.0/8 -d 127.0.0.0/8 -o lo -j ACCEPT -m comment --comment "accept new local traffic"
+# allow configuration using bootp/dhcp
+-A INPUT -p udp -m udp --sport 67 --dport 68 -j ACCEPT -m comment --comment "DHCP: bootps -> bootpc"
+-A OUTPUT -p udp -m udp --sport 68 --dport 67 -j ACCEPT -m comment --comment "DHCP: bootpc -> bootps"
+# allow outgoing ping
+-A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "accept outgoing ping"
+# allow incomming ssh
+-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --sport 1024:65535 --dport 22 -j ACCEPT -m comment --comment "accept incomming ssh connections"
+# allow DNS queries over udp and tcp
+-A OUTPUT -p udp -m udp -m conntrack --ctstate NEW --sport 1024:65535 --dport 53 -j ACCEPT -m comment --comment "accept DNS-queries over udp"
+-A OUTPUT -p tcp --dport 53 -m conntrack --ctstate NEW -m tcp --sport 1024:65535 -j ACCEPT -m comment --comment "accept DNS-queries over tcp"
+# allow outgoing ftp, ssh, smtp, http, pop3, imap, https, submission, imaps, pop3s
+-A OUTPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 22,25,80,110,143,443,587,993,995 -m tcp --sport 1024:65535 -j ACCEPT -m comment --comment "accept outgoing ssh, smtp, http, pop3, imap, https, submission, imaps, pop3s"
+-A OUTPUT -p tcp -m conntrack --ctstate NEW --dport 21 -m tcp --sport 1024:65535 -j ACCEPT -m comment --comment "accept outgoing ftp, to support RELATED module nf_conntrack_ftp must be present i.e. modprobe nf_conntrack_ftp"
+COMMIT
diff --git a/sf-host-fw/iptables-host-stateful-v2-rules.v4 b/sf-host-fw/iptables-host-stateful-v2-rules.v4
new file mode 100644 (file)
index 0000000..d34589c
--- /dev/null
@@ -0,0 +1,18 @@
+#
+# iptables host firewall example (stateful)
+#
+# iptables-save format
+# restore using iptables-restore < rules.v4
+#
+# (c) BFH, WGH1 2016
+#
+*filter
+:INPUT ACCEPT [0:0]
+:FORWARD ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "accept incomming RELATED and ESTABLISHED connections"
+-A INPUT -m conntrack --ctstate NEW -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT -m comment --comment "accept new local traffic"
+-A INPUT -p udp -m udp --dport 68 -j ACCEPT -m comment --comment "DHCP configuration: bootps -> bootpc"
+-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --sport 1024:65535 --dport 22 -j ACCEPT -m comment --comment "accept incomming ssh connections"
+-A INPUT -j REJECT --reject-with icmp-host-prohibited -m comment --comment "RFC-friendly reject any other incomming connection"
+COMMIT
diff --git a/sf-net-fw-tproxy/iptables-tproxy-rules.v4 b/sf-net-fw-tproxy/iptables-tproxy-rules.v4
new file mode 100644 (file)
index 0000000..1eb0184
--- /dev/null
@@ -0,0 +1,64 @@
+#
+# iptables network firewall example (stateful, with transparent http proxy on router)
+# for net n048.nslab.ch 147.87.86.224/27
+#
+# iptables-save format (with comments)
+# restore using "iptables-restore < rules.v4"
+#
+# this variant uses a combination of iptables (to mark packets) and
+# iproute2 rules and tables to route them in dependence of their mark
+# this variant is fully transparent for the client and the proxy
+# contacted webservers get the ip of the originating client (from the proxy)
+#
+# be aware that you have to setup policy routing to
+# redirect http traffic to the local "squid" proxy 
+# according to http://wiki.squid-cache.org/Features/Tproxy4
+#
+# this commands worked for my setup:
+# ip -f inet rule add fwmark 1 lookup 100
+# ip -f inet route add local default dev lo table 100
+# echo 1 > /proc/sys/net/ipv4/ip_forward
+# echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
+# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
+# echo 0 > /proc/sys/net/ipv4/conf/int/rp_filter
+#
+# (c) BFH, WGH1 2016
+#
+*mangle
+:PREROUTING ACCEPT [0:0]
+:INPUT ACCEPT [0:0]
+:FORWARD ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+:POSTROUTING ACCEPT [0:0]
+:DIVERT - [0:0]
+-A PREROUTING -p tcp -m socket -m comment --comment "jump to DIVERT if packet is from local socket" -j DIVERT
+-A PREROUTING -s 147.87.86.224/27 -p tcp -m tcp --dport 80 -m comment --comment "redirect matching packets to local squid port using fwmark 1 and policy routing" -j TPROXY --on-port 3129 --on-ip 0.0.0.0 --tproxy-mark 0x1/0x1
+-A DIVERT -m comment --comment "remove fwmark 1 and .." -j MARK --set-xmark 0x1/0xffffffff
+-A DIVERT -m comment --comment ".. accept packet" -j ACCEPT
+COMMIT
+# reset nat table in case of remains from previous excercises
+*nat
+:PREROUTING ACCEPT [0:0]
+:INPUT ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+:POSTROUTING ACCEPT [0:0]
+COMMIT
+*filter
+:INPUT ACCEPT [0:0]
+:FORWARD ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+-A INPUT -i lo -m comment --comment "allow local loopback traffic" -j ACCEPT
+-A INPUT -p icmp -m comment --comment "allow any incomming ICMP packet" -j ACCEPT
+-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment "allow ESTABLISHED and RELATED connections first (better performance)" -j ACCEPT
+-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 22 -m conntrack --ctstate NEW -m comment --comment "allow incomming SSH access" -j ACCEPT
+-A INPUT -s 147.87.86.224/27 -p tcp -m tcp --sport 1024:65535 -m multiport --dports 80,3128,3129 -m conntrack --ctstate NEW -m comment --comment "allow incomming access to Squid proxy" -j ACCEPT
+-A INPUT -m comment --comment "reject any other packet and send back ICMP admin prohibited" -j REJECT --reject-with icmp-admin-prohibited
+-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment "allow ESTABLISHED and RELATED connections first (better performance)" -j ACCEPT
+-A FORWARD -s 147.87.86.224/27 -m conntrack --ctstate NEW -m comment --comment "allow NEW outgoing connections from our net" -j ACCEPT
+-A FORWARD -d 147.87.86.224/27 -p tcp -m tcp --sport 1024:65535 --dport 22 -m conntrack --ctstate NEW -m comment --comment "allow incomming SSH connections to our net" -j ACCEPT
+-A FORWARD -d 147.87.86.226 -p tcp -m tcp --sport 1024:65535 --dport 53 -m conntrack --ctstate NEW -m comment --comment "allow incomming DNS queries over tcp to our nameserver" -j ACCEPT
+-A FORWARD -d 147.87.86.226 -p udp -m udp --sport 1024:65535 --dport 53 -m conntrack --ctstate NEW -m comment --comment "allow incomming DNS queries over udp to our nameserver" -j ACCEPT
+-A FORWARD -d 147.87.86.227 -p tcp -m tcp --sport 1024:65535 -m multiport --dports 25,587,993,995 -m conntrack --ctstate NEW -m comment --comment "allow incomming mail connections to our mailserver" -j ACCEPT
+-A FORWARD -d 147.87.86.227 -p tcp -m tcp --sport 1024:65535 -m multiport --dports 80,443 -m conntrack --ctstate NEW -m comment --comment "allow incomming Web connections to our webserver" -j ACCEPT
+-A FORWARD -m comment --comment "reject any other packet and send back ICMP admin prohibited" -j REJECT --reject-with icmp-admin-prohibited
+COMMIT
diff --git a/sf-net-fw-tproxy/squid.conf b/sf-net-fw-tproxy/squid.conf
new file mode 100644 (file)
index 0000000..d3add13
--- /dev/null
@@ -0,0 +1,93 @@
+#
+# modified squid.conf for for net n048.nslab.ch 147.87.86.224/27
+#
+# this squid.conf allows access to port 3128 (for configured browsers)
+# and port 3129 (transparent/tproxy) from IPv4 network of group n048
+#
+# (c) BFH, WGH1 2016
+#
+
+#
+# Recommended minimum configuration:
+#
+
+# Example rule allowing access from your local networks.
+# Adapt to list your (internal) IP networks from where browsing
+# should be allowed
+#acl localnet src 10.0.0.0/8   # RFC1918 possible internal network
+#acl localnet src 172.16.0.0/12        # RFC1918 possible internal network
+#acl localnet src 192.168.0.0/16       # RFC1918 possible internal network
+#acl localnet src fc00::/7       # RFC 4193 local private network range
+#acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
+
+# local network (n048)
+acl localnet src 147.87.86.224/27 
+
+acl SSL_ports port 443
+acl Safe_ports port 80         # http
+acl Safe_ports port 21         # ftp
+acl Safe_ports port 443                # https
+acl Safe_ports port 70         # gopher
+acl Safe_ports port 210                # wais
+acl Safe_ports port 1025-65535 # unregistered ports
+acl Safe_ports port 280                # http-mgmt
+acl Safe_ports port 488                # gss-http
+acl Safe_ports port 591                # filemaker
+acl Safe_ports port 777                # multiling http
+acl CONNECT method CONNECT
+
+#
+# Recommended minimum Access Permission configuration:
+#
+# Deny requests to certain unsafe ports
+http_access deny !Safe_ports
+
+# Deny CONNECT to other than secure SSL ports
+http_access deny CONNECT !SSL_ports
+
+# Only allow cachemgr access from localhost
+http_access allow localhost manager
+http_access deny manager
+
+# We strongly recommend the following be uncommented to protect innocent
+# web applications running on the proxy server who think the only
+# one who can access services on "localhost" is a local user
+#http_access deny to_localhost
+
+#
+# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
+#
+
+# Example rule allowing access from your local networks.
+# Adapt localnet in the ACL section to list your (internal) IP networks
+# from where browsing should be allowed
+http_access allow localnet
+http_access allow localhost
+
+# And finally deny all other access to this proxy
+http_access deny all
+
+# Squid normally listens to port 3128
+http_port 3128
+# Also listen (transparent/tproxy) on port 3129
+http_port 3129 tproxy
+
+# Uncomment and adjust the following to add a disk cache directory.
+#cache_dir ufs /var/spool/squid 100 16 256
+
+# Leave coredumps in the first cache dir
+coredump_dir /var/spool/squid
+
+#
+# Add any of your own refresh_pattern entries above these.
+#
+refresh_pattern ^ftp:          1440    20%     10080
+refresh_pattern ^gopher:       1440    0%      1440
+refresh_pattern -i (/cgi-bin/|\?) 0    0%      0
+refresh_pattern .              0       20%     4320
+
+#
+# URL rewrite using squidGuard
+# uncomment if squidGuard is configured
+#
+#url_rewrite_program /usr/bin/squidGuard
diff --git a/sf-net-fw/ip6tables-net-stateful-rules.v6 b/sf-net-fw/ip6tables-net-stateful-rules.v6
new file mode 100644 (file)
index 0000000..3ae5d80
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# ip6tables network firewall example (stateful)
+# for net n048.nslab.ch 2001:620:500:ffb0::/64
+#
+# ip6tables-save format (with comments)
+# restore using "ip6tables-restore < rules.v6"
+#
+# (c) BFH, WGH1 2016
+# 
+*filter
+:INPUT ACCEPT [0:0]
+:FORWARD ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+-A INPUT -i lo -m comment --comment "allow local loopback traffic" -j ACCEPT 
+-A INPUT -p icmpv6 -m comment --comment "allow any incomming ICMPv6, could be more sophisticated, see https://www.cert.org/downloads/IPv6/ip6tables_rules.txt" -j ACCEPT 
+-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment "allow ESTABLISHED and RELATED connections first (better performance)" -j ACCEPT 
+-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 22 -m conntrack --ctstate NEW -m comment --comment "allow incomming SSH access" -j ACCEPT 
+-A INPUT -m comment --comment "reject any other packet and send back ICMP admin prohibited" -j REJECT --reject-with adm-prohibited
+-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment "allow ESTABLISHED and RELATED connections first (better performance)" -j ACCEPT 
+-A FORWARD -s 2001:620:500:ffb0::/64 -m conntrack --ctstate NEW -m comment --comment "allow NEW outgoing connections from our net" -j ACCEPT 
+-A FORWARD -d 2001:620:500:ffb0::/64 -p tcp -m tcp --sport 1024:65535 --dport 22 -m conntrack --ctstate NEW -m comment --comment "allow incomming SSH connections to our net" -j ACCEPT 
+-A FORWARD -d 2001:620:500:ffb0::20 -p tcp -m tcp --sport 1024:65535 --dport 53 -m conntrack --ctstate NEW -m comment --comment "allow incomming DNS queries over tcp to our nameserver" -j ACCEPT 
+-A FORWARD -d 2001:620:500:ffb0::20 -p udp -m udp --sport 1024:65535 --dport 53 -m conntrack --ctstate NEW -m comment --comment "allow incomming DNS queries over udp to our nameserver" -j ACCEPT 
+-A FORWARD -d 2001:620:500:ffb0::30 -p tcp -m tcp --sport 1024:65535 -m multiport --dports 25,587,993,995 -m conntrack --ctstate NEW -m comment --comment "allow incomming mail connections to our mailserver" -j ACCEPT 
+-A FORWARD -d 2001:620:500:ffb0::30 -p tcp -m tcp --sport 1024:65535 -m multiport --dports 80,443 -m conntrack --ctstate NEW -m comment --comment "allow incomming Web connections to our webserver" -j ACCEPT 
+-A FORWARD -m comment --comment "reject any other packet and send back ICMP admin prohibited" -j REJECT --reject-with adm-prohibited
+COMMIT
diff --git a/sf-net-fw/iptables-net-stateful-rules.v4 b/sf-net-fw/iptables-net-stateful-rules.v4
new file mode 100644 (file)
index 0000000..f8f80a5
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# iptables network firewall example (stateful)
+# for net n048.nslab.ch 147.87.86.224/27
+#
+# iptables-save format (with comments)
+# restore using "iptables-restore < rules.v4"
+#
+# (c) BFH, WGH1 2016
+# 
+*filter
+:INPUT ACCEPT [0:0]
+:FORWARD ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+-A INPUT -i lo -m comment --comment "allow local loopback traffic" -j ACCEPT 
+-A INPUT -p icmp -m comment --comment "allow any incomming ICMP packet" -j ACCEPT 
+-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment "allow ESTABLISHED and RELATED connections first (better performance)" -j ACCEPT 
+-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 22 -m conntrack --ctstate NEW -m comment --comment "allow incomming SSH access" -j ACCEPT 
+-A INPUT -m comment --comment "reject any other packet and send back ICMP admin prohibited" -j REJECT --reject-with icmp-admin-prohibited 
+-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment "allow ESTABLISHED and RELATED connections first (better performance)" -j ACCEPT 
+-A FORWARD -s 147.87.86.224/27 -m conntrack --ctstate NEW -m comment --comment "allow NEW outgoing connections from our net" -j ACCEPT 
+-A FORWARD -d 147.87.86.224/27 -p tcp -m tcp --sport 1024:65535 --dport 22 -m conntrack --ctstate NEW -m comment --comment "allow incomming SSH connections to our net" -j ACCEPT 
+-A FORWARD -d 147.87.86.226 -p tcp -m tcp --sport 1024:65535 --dport 53 -m conntrack --ctstate NEW -m comment --comment "allow incomming DNS queries over tcp to our nameserver" -j ACCEPT 
+-A FORWARD -d 147.87.86.226 -p udp -m udp --sport 1024:65535 --dport 53 -m conntrack --ctstate NEW -m comment --comment "allow incomming DNS queries over udp to our nameserver" -j ACCEPT 
+-A FORWARD -d 147.87.86.227 -p tcp -m tcp --sport 1024:65535 -m multiport --dports 25,587,993,995 -m conntrack --ctstate NEW -m comment --comment "allow incomming mail connections to our mailserver" -j ACCEPT 
+-A FORWARD -d 147.87.86.227 -p tcp -m tcp --sport 1024:65535 -m multiport --dports 80,443 -m conntrack --ctstate NEW -m comment --comment "allow incomming Web connections to our webserver" -j ACCEPT 
+-A FORWARD -m comment --comment "reject any other packet and send back ICMP admin prohibited" -j REJECT --reject-with icmp-admin-prohibited 
+COMMIT
diff --git a/sl-host-fw/iptables-host-stateless-rules.v4 b/sl-host-fw/iptables-host-stateless-rules.v4
new file mode 100644 (file)
index 0000000..e0a8e08
--- /dev/null
@@ -0,0 +1,42 @@
+#
+# iptables host firewall example (stateless) 
+#
+# iptables-save format 
+# restore using iptables-restore < rules.v4
+#
+# (c) BFH, WGH1 2016
+#
+*filter
+:INPUT DROP [0:0]
+:FORWARD DROP [0:0]
+:OUTPUT DROP [0:0]
+# accept local traffic
+-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
+-A OUTPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -o lo -j ACCEPT
+# allow configuration using bootp/dhcp
+-A INPUT -p udp -m udp --sport 67 --dport 68 -j ACCEPT
+-A OUTPUT -p udp -m udp --sport 68 --dport 67 -j ACCEPT
+# allow outgoing ping
+-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
+-A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
+# allow incomming ssh
+-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 22 -j ACCEPT
+-A OUTPUT -p tcp -m tcp --sport 22 --dport 1024:65535 ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
+# allow DNS queries over udp and tcp
+-A INPUT -p udp -m udp --sport 53 --dport 1024:65535 -j ACCEPT
+-A OUTPUT -p udp -m udp --sport 1024:65535 --dport 53 -j ACCEPT
+-A INPUT -p tcp --sport 53 -m tcp --dport 1024:65535 ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
+-A OUTPUT -p tcp --dport 53 -m tcp --sport 1024:65535 -j ACCEPT
+# allow outgoing ssh, smtp, http, pop3, imap https, submission, imaps, pop3s
+-A INPUT -p tcp -m multiport --sports 22,25,80,110,143,443,587,993,995 -m tcp --dport 1024:65535 ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
+-A OUTPUT -p tcp -m multiport --dports 22,25,80,110,143,443,587,993,995 -m tcp --sport 1024:65535 -j ACCEPT
+# ftp command session
+-A INPUT -p tcp -m tcp --sport 21 -m tcp --dport 1024:65535 ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
+-A OUTPUT -p tcp -m tcp --dport 21 -m tcp --sport 1024:65535 -j ACCEPT
+# ftp data session (active mode)
+-A INPUT -p tcp -m tcp --sport 20 -m tcp --dport 1024:65535 -j ACCEPT
+-A OUTPUT -p tcp -m tcp --dport 20 -m tcp --sport 1024:65535 ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
+# ftp data session (passive mode)
+-A INPUT -p tcp -m tcp --dport 1024:65535 ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
+-A OUTPUT -p tcp -m tcp --sport 1024:65535 -j ACCEPT
+COMMIT