我的带有 TLS 的 FTPS iptables 可以正常使用吗?

我的带有 TLS 的 FTPS iptables 可以正常使用吗?

我尝试在 Google 上搜索,为我的 FTPS(proftpd)获取一个 iptables,并与我现在使用的 iptables killswitch 配合使用(请参阅https://www.reddit.com/r/linuxquestions/comments/57mga5/is_my_iptables_killswitch_working_have_some_p/)。

我使用端口 10210 作为 FTPS,使用 60100-60119 作为被动端口,此流量不通过 VPN。我想出了这个(它们位于最后一行上方):

# Allow traffic via TLS FTPS
iptables -A INPUT -p tcp -m tcp --dport 10210 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# It seems to be working without the line under
#iptables -A INPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --sport 10210:60119 --dport 60100:60119 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
iptables -A OUTPUT -p tcp -m tcp --dport 10210 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# It seems to be working without the line under
#iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 10210:60119 --dport 10210:60119 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

它似乎有效,但是由于我是 iptables 新手,我想知道我做错了什么(我可能做错了;),不确定端口范围,也许是打开了?)

编辑 我遇到了连接问题,所以我改用了这个,效果更好

-A INPUT -p tcp -m tcp --dport 10210 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 10210 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 60100:60119 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 10210 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 10210 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 60100:60119 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 60100:60119 -j ACCEPT

我稍后会读完http://ipset.netfilter.org/iptables-extensions.man.html,请尝试使用这个,而不是上面的端口范围

iptables -A INPUT -p tcp --dport 60100:60119 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 60100:60119 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 60100:60119 -m conntrack --ctstate NEW,ESTABLISHED,RELATED-j ACCEPT

并且删除-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT,并且我想知道我是否实际上也应该删除-m conntrack --ctstate NEW,ESTABLISHED10210,因为它是 FTPS 的传入端口?

答案1

输出部分仅用于连接,即发起从服务器发起的连接不会影响从客户端发起的连接。通常输出未过滤,除非你有特殊要求来阻止某些传出内容。

输入是您应该过滤的部分。

已确立的有关的部分用于连接,该连接已经启动并且应该继续工作(即像握手后的 TCP),并且通常匹配度高于其他规则。

我们可以将FTP连接分为三种类型:

  1. 主动 FTP(普通)
  2. 被动 FTP(普通)
  3. 带有 SSL 的 FTP(任何加密)

如果是主动 FTP,您需要在客户端打开传入 TCP 21 和出站 TCP 20 源端口以及随机目标,这种连接类型很少使用,即一个连接由客户端发起,另一个连接由服务器发起。由于最后一个原因 - 它实际上从不起作用。

如果是被动 FTP,情况会更糟,被动 FTP 使用 TCP 21 端口来执行命令,使用随机 TCP 端口来传输任何连接的数据传输,该端口将在服务器的 FTP 响应中指定,因此,防火墙必须“监听”FTP 流量,这需要对数据包进行更深入的检查,然后动态打开端口 - 这是正常情况。在这种情况下,使用 FTP 连接跟踪助手/内核模块,这可以解决问题 - 您只需打开 TCP 端口 21。

对于 SSL 来说,情况就更加疯狂了,因为有关随机端口的数据也是加密的,防火墙无法猜测要打开哪个端口,在这种情况下,有些人在 FTP 服务器配置中指定随机端口的数量,并在防火墙上打开所有这些端口。

通常过滤表的规则顺序通常如下所示:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp -m multiport --dports 22,80,443 -j ACCEPT
-A INPUT -i eth1 -p tcp -m conntrack --ctstate NEW -m tcp -m multiport --dports 22,53,80,1234 -j ACCEPT
-A INPUT -i eth1 -p udp -m conntrack --ctstate NEW -m udp -m multiport --dports 53,67,123 -j ACCEPT
COMMIT

对于 SSL,您可以在某处添加以下规则

-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp -m multiport --dports 21,15000:15050 -j ACCEPT

相关内容