Le 26/08/2018 à 08:13, T a écrit :
>
> Here are my notes:
And here are my comments.
> How to track ftp's high port with Fedora and iptables:
>
> Problem: iptables will not automatically track ftp's high ports
> (firewalld will).
Iptables does not track anything by itself. Netfilter's connection
tracking aka "conntrack" does. Iptables just uses the resulting state.
There are no such "FTP high ports", but FTP active and passive data
connections. FTP active data connections use port 20 which is obviously
not "high".
> Note: RHEL used
> ip_conntrack_ftp, and
> ip_nat_ftp
>
> These have been superseded by
> nf_conntrack_ftp
> nf_conntrack_tftp
> nf_nat_ftp
> nf_nat_tftp
nf_{conntrack|nat}_tftp modules are for the TFTP protocol, which is a
totally different protocol from FTP despite the close names. TFTP uses
UDP and a different control port.
ip_{conntrack|nat}_* are now aliases of nf_{conntrack|nat}_* modules, so
you can still use them if you want.
> 2) nf_conntrack_ftp is disabled by default. To enable it:
> # echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper
nf_conntrack_ftp is not disabled by default.
What has been disabled by default in recent kernels is the automatic
assignment of all conntrack helpers to connections.
Automatic assignment can also be enabled when the module is loaded with
the option nf_conntrack_helper=1.
But be aware that enabling automatic helper assignment is discouraged
(hence it was disabled by default). It is recommended to use explicit
assignment with the CT target instead.
On a client :
iptables -t raw -A OUTPUT -p tcp --dport 21 -j CT --helper ftp
On a server or router
iptables -t raw -A PREROUTING -p tcp --dport 21 -j CT --helper ftp
> 3) in /etc/modprobe.d/iptables.conf add
>
> nf_conntrack_ftp ports=21
Syntax error. You must prepend "options" to the line.
Port 21 is already the default, so you do not have to specify it.
> 4) restart iptables
> # systemctl restart iptables
>
> Note: you also have to reload your firewall rules after this too.
No you don't need to reload the ruleset, unless you changed it (e.g. you
added CT rules). Just loading helper modules and enabling automatic
helper assignment does not require to reload iptables rules.
> Sample passive and active ftp rules:
(...)
> Active:
>
> $tbls -A dsl-out -o $eth1 -p tcp -s $eth1_addr --sport $allports
> --dport ftp-data -m state --state ESTABLISHED -j ACCEPT
> $tbls -A dsl-in -i $eth1 -p tcp --sport ftp-data -d $eth1_addr
> --dport $unassgn -m state --state RELATED,ESTABLISHED -j ACCEPT
Can you explain why do specify different dynamic port ranges $allports
and $unassgn ?
> $tbls -A dsl-for -i $eth1 -p tcp --sport ftp-data -d
> $internal_net --dport $unassgn -m state --state RELATED,ESTABLISHED -j
> ACCEPT
The rule accepting packets in the other direction is missing.
> Passive:
>
> $tbls -A dsl-out -o $eth1 -p tcp -s $eth1_addr --sport $unassgn
> --dport ftp -m conntrack --ctstate NEW,ESTABLISHED -j
> ACCEPT
> $tbls -A dsl-in -i $eth1 -p tcp ! --syn --sport ftp -d $eth1_addr
> --dport $unassgn -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
> $tbls -A dsl-for -i $eth1 -p tcp ! --syn --sport ftp -d $internal_net
> --dport $unassgn -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
These rules allowing FTP control connections are not specific to passive
mode. They are also used in active mode.
The RELATED state should not be used in control connection rules. It
applies to data connections (replacing NEW), not control connections.
> $tbls -A dsl-out -o $eth1 -p tcp -s $eth1_addr -d $ANY_IP -m
> helper --helper ftp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
> $tbls -A dsl-in -i $eth1 -p tcp ! --syn -s $ANY_IP -d $eth1_addr -m
> helper --helper ftp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
> $tbls -A dsl-for -i $eth1 -p tcp ! --syn -s $ANY_IP -d $internal_net
> -m helper --helper ftp -m conntrack --ctstate RELATED,ESTABLISHED -j
> ACCEPT
On client side, the last two rules should not use the RELATED state (so
the helper match is useless).