Package: firehol Version: 3.1.1+ds-1 Severity: important Tags: patch upstream
Dear Maintainer, In recent Firehol (3.x), a family of options like FIREHOL_DROP_ORPHAN_TCP_ACK were added, intended to avoid log noise for end-of-session packets where the connection tracker has already closed them (on the assumption that they would hit a log/reject or log/invalid). These rules are inserted at the top of the INPUT/OUTPUT/FORWARD chains, and thus apply before any user-specified action. In particular, this means that even a 'policy accept' does not override these rules, since the jump to a policy chain is later in I/O/F than the fixed rules. On a current Stretch system (kernel 4.9.2-2) the NFSv3 client is not able to function, and packets are counted against the DROP ACK/ACK INVALID/NEW rule. These rules should be handled after user policy, both addressing the above issue and also the more systematic situation that 'policy accept' should be equivalent to not running the firewall at all [but possibly restricted to a single interface] Disabling the option does allow NFS to work, however this is a global change affecting other interfaces and traffic flows, should not be a requirement, is clearly not an intended piece of behaviour, and is not at all an obvious place to look. A pull request to correct this behaviour has been raised at: https://github.com/firehol/firehol/pull/197 Thanks, Dominic -- System Information: Debian Release: 9.0 APT prefers testing APT policy: (500, 'testing') Architecture: amd64 (x86_64) Kernel: Linux 4.9.0-1-amd64 (SMP w/4 CPU cores) Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) Versions of packages firehol depends on: ii firehol-common 3.1.1+ds-1 ii lsb-base 9.20161125 Versions of packages firehol recommends: ii fireqos 3.1.1+ds-1 Versions of packages firehol suggests: pn firehol-doc <none> pn firehol-tools <none> pn ulogd2 <none> -- Configuration Files: /etc/default/firehol changed [not included] /etc/firehol/firehol.conf changed [not included] -- no debconf information
diff -rupN firehol-3.1.1+ds/.idea/encodings.xml firehol-3.1.1+ds-patched/.idea/encodings.xml --- firehol-3.1.1+ds/.idea/encodings.xml 1970-01-01 01:00:00.000000000 +0100 +++ firehol-3.1.1+ds-patched/.idea/encodings.xml 2017-02-02 09:19:47.090975787 +0000 @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Encoding"> + <file url="PROJECT" charset="UTF-8" /> + </component> +</project> \ No newline at end of file diff -rupN firehol-3.1.1+ds/.idea/firehol-3.1.1+ds.iml firehol-3.1.1+ds-patched/.idea/firehol-3.1.1+ds.iml --- firehol-3.1.1+ds/.idea/firehol-3.1.1+ds.iml 1970-01-01 01:00:00.000000000 +0100 +++ firehol-3.1.1+ds-patched/.idea/firehol-3.1.1+ds.iml 2017-02-02 09:24:08.859903795 +0000 @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="WEB_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="module-library"> + <library name="PHP Runtime" type="php"> + <CLASSES> + <root url="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/standard" /> + </CLASSES> + <SOURCES> + <root url="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/standard" /> + </SOURCES> + </library> + </orderEntry> + </component> +</module> \ No newline at end of file diff -rupN firehol-3.1.1+ds/.idea/modules.xml firehol-3.1.1+ds-patched/.idea/modules.xml --- firehol-3.1.1+ds/.idea/modules.xml 1970-01-01 01:00:00.000000000 +0100 +++ firehol-3.1.1+ds-patched/.idea/modules.xml 2017-02-02 09:19:47.102975651 +0000 @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/firehol-3.1.1+ds.iml" filepath="$PROJECT_DIR$/.idea/firehol-3.1.1+ds.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff -rupN firehol-3.1.1+ds/.idea/workspace.xml firehol-3.1.1+ds-patched/.idea/workspace.xml --- firehol-3.1.1+ds/.idea/workspace.xml 2017-02-02 10:39:29.142322306 +0000 +++ firehol-3.1.1+ds-patched/.idea/workspace.xml 2017-02-02 10:13:07.988728744 +0000 @@ -18,8 +18,8 @@ <file leaf-file-name="firehol" pinned="false" current-in-tab="true"> <entry file="file://$PROJECT_DIR$/sbin/firehol"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-12462"> - <caret line="11935" column="4" lean-forward="false" selection-start-line="11935" selection-start-column="4" selection-end-line="11935" selection-end-column="4" /> + <state relative-caret-position="-12752"> + <caret line="11984" column="4" lean-forward="false" selection-start-line="11984" selection-start-column="4" selection-end-line="11984" selection-end-column="4" /> <folding /> </state> </provider> @@ -263,12 +263,12 @@ <option name="number" value="Default" /> <option name="presentableId" value="Default" /> <updated>1486027187049</updated> - <workItem from="1486027188312" duration="3676000" /> + <workItem from="1486027188312" duration="3116000" /> </task> <servers /> </component> <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="3676000" /> + <option name="totallyTimeSpent" value="3116000" /> </component> <component name="ToolWindowManager"> <frame x="3954" y="42" width="3726" height="2118" extended-state="6" /> @@ -306,8 +306,8 @@ <component name="editorHistoryManager"> <entry file="file://$PROJECT_DIR$/sbin/firehol"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-12462"> - <caret line="11935" column="4" lean-forward="false" selection-start-line="11935" selection-start-column="4" selection-end-line="11935" selection-end-column="4" /> + <state relative-caret-position="-12752"> + <caret line="11984" column="4" lean-forward="false" selection-start-line="11984" selection-start-column="4" selection-end-line="11984" selection-end-column="4" /> <folding /> </state> </provider> diff -rupN firehol-3.1.1+ds/sbin/firehol firehol-3.1.1+ds-patched/sbin/firehol --- firehol-3.1.1+ds/sbin/firehol 2017-02-02 10:30:35.100620537 +0000 +++ firehol-3.1.1+ds-patched/sbin/firehol 2017-02-02 12:02:26.057692425 +0000 @@ -6346,6 +6346,7 @@ close_interface() { # make sure we have a policy test -z "${work_policy}" && work_policy="${DEFAULT_INTERFACE_POLICY}" local inlog=() outlog=() + local drop_noise=1 case "${work_policy}" in return|RETURN) set_work_function "Nothing to be done for policy RETURN of interface '${work_name}'" @@ -6354,6 +6355,7 @@ close_interface() { ;; accept|ACCEPT) + drop_noise=0 ;; *) @@ -6361,6 +6363,17 @@ close_interface() { outlog=(loglimit "OUT-${work_name}") ;; esac + + if [ $drop_noise -eq 1 ]; then + if running_ipv4; then + firewall_filtering_policy_common_late iptables "in_${work_name}" + firewall_filtering_policy_common_late iptables "out_${work_name}" + fi + if running_ipv6; then + firewall_filtering_policy_common_late ip6tables "in_${work_name}" + firewall_filtering_policy_common_late ip6tables "out_${work_name}" + fi + fi set_work_function "Applying default policy of ${work_policy} on interface '${work_name}'" @@ -6471,6 +6484,21 @@ close_master() { ip6tables -A FORWARD -m conntrack --ctstate RELATED -p icmpv6 -j ACCEPT fi + + # Insert session cleanup rules here, after user rules are processed + if [ ${ENABLE_IPV4} -eq 1 ] + then + firewall_filtering_policy_common_late iptables INPUT + firewall_filtering_policy_common_late iptables OUTPUT + firewall_filtering_policy_common_late iptables FORWARD + fi + if [ ${ENABLE_IPV6} -eq 1 ] + then + firewall_filtering_policy_common_late ip6tables INPUT + firewall_filtering_policy_common_late ip6tables OUTPUT + firewall_filtering_policy_common_late ip6tables FORWARD + fi + set_work_function "Accepting TCP-RESET at the end of the firewall." rule chain "OUTPUT" state RELATED proto tcp custom '--tcp-flags ALL ACK,RST' action ACCEPT || return 1 rule chain "FORWARD" state RELATED proto tcp custom '--tcp-flags ALL ACK,RST' action ACCEPT || return 1 @@ -11933,15 +11961,36 @@ firewall_filtering_policy_common() { # ${iptables_cmd} -t filter -A OUTPUT -m conntrack --ctstate RELATED -j ACCEPT # ${iptables_cmd} -t filter -A FORWARD -m conntrack --ctstate RELATED -j ACCEPT + if [ ! -z ${FIREHOL_GLOBAL_RPFILTER} ] + then + ${iptables_cmd} -t raw -A PREROUTING -m rpfilter ${FIREHOL_GLOBAL_RPFILTER} -j DROP + fi +} + + +# this will be run when the first iptables command get executed in pre-process mode. +# so that its commands are prepended to the other iptables commands of the firewall + +firewall_filtering_policy_common_late() { + local iptables_cmd="${1}" + local iptables_chain="${2}" + + local oldns="${FIREHOL_NS_CURR}" + + if [ "${iptables_cmd}" == "iptables" ] + then + FIREHOL_NS_CURR="ipv4" + else + FIREHOL_NS_CURR="ipv6" + fi + if [ "${FIREHOL_DROP_ORPHAN_TCP_ACK_FIN}" = "1" ] then set_work_function "Silently droping TCP ACK+FIN packets (option: FIREHOL_DROP_ORPHAN_TCP_ACK_FIN)" # Silently drop orphan TCP/ACK FIN packets # before droping INVALID below, otherwise these will be logged as INVALID too - ${iptables_cmd} -t filter -A INPUT -p tcp --tcp-flags ACK,FIN ACK,FIN -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A OUTPUT -p tcp --tcp-flags ACK,FIN ACK,FIN -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A FORWARD -p tcp --tcp-flags ACK,FIN ACK,FIN -m conntrack --ctstate NEW,INVALID -j DROP + ${iptables_cmd} -t filter -A ${iptables_chain} -p tcp --tcp-flags ACK,FIN ACK,FIN -m conntrack --ctstate NEW,INVALID -j DROP fi if [ "${FIREHOL_DROP_ORPHAN_TCP_ACK_RST}" = "1" ] @@ -11950,9 +11999,8 @@ firewall_filtering_policy_common() { # Silently drop orphan TCP/ACK RST packets # before droping INVALID below, otherwise these will be logged as INVALID too - ${iptables_cmd} -t filter -A INPUT -p tcp --tcp-flags ACK,RST ACK,RST -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A OUTPUT -p tcp --tcp-flags ACK,RST ACK,RST -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A FORWARD -p tcp --tcp-flags ACK,RST ACK,RST -m conntrack --ctstate NEW,INVALID -j DROP + ${iptables_cmd} -t filter -A ${iptables_chain} -p tcp --tcp-flags ACK,RST ACK,RST -m conntrack --ctstate NEW,INVALID -j DROP + fi if [ "${FIREHOL_DROP_ORPHAN_TCP_ACK}" = "1" ] @@ -11961,9 +12009,7 @@ firewall_filtering_policy_common() { # Silently drop orphan TCP/ACK packets # before droping INVALID below, otherwise these will be logged as INVALID too - ${iptables_cmd} -t filter -A INPUT -p tcp --tcp-flags ACK ACK -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A OUTPUT -p tcp --tcp-flags ACK ACK -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A FORWARD -p tcp --tcp-flags ACK ACK -m conntrack --ctstate NEW,INVALID -j DROP + ${iptables_cmd} -t filter -A ${iptables_chain} -p tcp --tcp-flags ACK ACK -m conntrack --ctstate NEW,INVALID -j DROP fi if [ "${FIREHOL_DROP_ORPHAN_TCP_RST}" = "1" ] @@ -11972,9 +12018,7 @@ firewall_filtering_policy_common() { # Silently drop orphan TCP/RST packets # before droping INVALID below, otherwise these will be logged as INVALID too - ${iptables_cmd} -t filter -A INPUT -p tcp --tcp-flags RST RST -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A OUTPUT -p tcp --tcp-flags RST RST -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A FORWARD -p tcp --tcp-flags RST RST -m conntrack --ctstate NEW,INVALID -j DROP + ${iptables_cmd} -t filter -A ${iptables_chain} -p tcp --tcp-flags RST RST -m conntrack --ctstate NEW,INVALID -j DROP fi if [ "${iptables_cmd}" = "iptables" -a "${FIREHOL_DROP_ORPHAN_IPV4_ICMP_TYPE3}" = "1" ] @@ -11983,9 +12027,7 @@ firewall_filtering_policy_common() { # Silently drop orphan ICMP/TYPE3 packets # before droping INVALID below, otherwise these will be logged as INVALID too - ${iptables_cmd} -t filter -A INPUT -p icmp --icmp-type destination-unreachable -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A OUTPUT -p icmp --icmp-type destination-unreachable -m conntrack --ctstate NEW,INVALID -j DROP - ${iptables_cmd} -t filter -A FORWARD -p icmp --icmp-type destination-unreachable -m conntrack --ctstate NEW,INVALID -j DROP + ${iptables_cmd} -t filter -A ${iptables_chain} -p icmp --icmp-type destination-unreachable -m conntrack --ctstate NEW,INVALID -j DROP fi # Drop all invalid packets. @@ -11996,20 +12038,13 @@ firewall_filtering_policy_common() { if [ ${FIREHOL_LOG_DROP_INVALID} -eq 1 ] then - rule table filter chain INPUT state INVALID action DROP loglimit "BLOCKED INVALID IN" - rule table filter chain OUTPUT state INVALID action DROP loglimit "BLOCKED INVALID OUT" - rule table filter chain FORWARD state INVALID action DROP loglimit "BLOCKED INVALID PASS" + rule table filter chain ${iptables_chain} state INVALID action DROP loglimit "BLOCKED INVALID" else - ${iptables_cmd} -t filter -A INPUT -m conntrack --ctstate INVALID -j DROP - ${iptables_cmd} -t filter -A OUTPUT -m conntrack --ctstate INVALID -j DROP - ${iptables_cmd} -t filter -A FORWARD -m conntrack --ctstate INVALID -j DROP + ${iptables_cmd} -t filter -A ${iptables_chain} -m conntrack --ctstate INVALID -j DROP fi fi - if [ ! -z ${FIREHOL_GLOBAL_RPFILTER} ] - then - ${iptables_cmd} -t raw -A PREROUTING -m rpfilter ${FIREHOL_GLOBAL_RPFILTER} -j DROP - fi + FIREHOL_NS_CURR="${oldns}" } firewall_filtering_policy() {