一般来说:

一般来说:

这是一个建议的 典型问题关于理解和调试Linux系统上的软件防火墙。

回应 EEAA 的答案和@Shog 的评论,我们需要一个合适的规范问答来关闭有关 iptables 的常见相对简单的问题。

调试 Linux 软件防火墙问题的结构化方法是什么?网络过滤器数据包过滤框架,通常称为用户空间接口iptables

有哪些常见的陷阱、反复出现的问题以及简单或稍微模糊的需要检查的事情,偶尔防火墙管理员可能会忽略或从中受益?

即使你使用如下工具联邦水务局防火墙D(又名firewall-cmd),岸墙或者类似地,您可能会受益于在没有这些工具提供的抽象层的情况下进行深入研究。

这个问题并不是关于如何构建防火墙的指南:检查产品文档为此,例如贡献食谱iptables 之旅和技巧或搜索标签 现有问题频繁并广受好评高分问答。

答案1

一般来说:

查看和修改防火墙配置需要管理员权限 ( root),在受限端口号范围内打开服务也是如此。这意味着您应该以 root 身份登录root或使用sudoroot 身份运行命令。我将尝试使用可选的 来标记此类命令[sudo]

内容:

  1. -I顺序问题或和之间的区别-A
  2. 显示当前防火墙配置
  3. 解释输出iptables -L -v -n
  4. 了解你的环境
  5. INPUT 和 FORWARD 链
  6. 内核模块

-I1. 顺序问题或与之间的区别-A

需要记住的是,防火墙规则是按照列出的顺序进行检查的。当触发允许或禁止数据包或连接的规则时,内核将停止处理链。

我认为 最常见的错误对于新手防火墙管理员来说,他们需要遵循正确的说明来打开新端口,例如下面的说明:

[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT

然后发现它不起作用。

原因是该-A选项添加了新规则,在所有现有规则之后 由于现有防火墙的最终规则通常是阻止所有未明确允许的流量,因此导致

...
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
8        0  0    ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080

或者在 iptables-save 中等效:

...
iptables -A INPUT  -j REJECT
iptables -A INPUT  -p tcp --dport 8080 -j ACCEPT

并且打开 TCP 端口 8080 的新规则永远不会被达到。(计数器顽固地保持在 0 个数据包和零字节就证明了这一点)。

通过插入规则,-I新规则将成为链中的第一个规则并发挥作用。

2.显示当前防火墙配置

我建议防火墙管理员查看 Linux 内核正在运行的实际配置,而不是尝试使用用户友好型工具诊断防火墙问题。通常,一旦您了解了潜在问题,您就可以通过这些工具轻松解决这些问题。

命令[sudo] iptables -L -v -n是你的朋友(尽管有些人更喜欢命令)。讨论配置时,使用该选项对行进行编号iptables-save通常很有用。参考规则 #X 会使讨论变得更容易一些。--line-numbers
笔记:NAT 规则包含在iptables-save输出中,但必须通过添加选项-t nat即单独列出[sudo] iptables -L -v -n -t nat --line-numbers

多次运行该命令并检查递增计数器可以成为查看新规则是否实际被触发的有用工具。

[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     784K   65M fail2ban-SSH  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
2    2789K  866M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3       15  1384 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain fail2ban-SSH (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       117.239.37.150       0.0.0.0/0           reject-with icmp-port-unreachable
2        4   412 REJECT     all  --  *      *       117.253.208.237      0.0.0.0/0           reject-with icmp-port-unreachable

或者,输出iptables-save提供了一个可以重新生成上述防火墙配置的脚本:

[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT

您觉得什么更容易理解是一个偏好问题。

3. 解释输出iptables -L -v -n

政策设置当没有明确规则匹配时链使用的默认操作。在INPUT设置为接受所有流量的链中。

INPUT 链中的第一条规则立即引起了人们的关注,它将发往 TCP 端口 22(tcp dpt:22)的所有流量(源 0.0.0.0/0 和目标 0.0.0.0/0)发送到自定义目标(fail2ban-SSH)。 顾名思义,此规则由 fail2ban(一种安全产品,除其他功能外,还会扫描系统日志文件以查找可能的滥用情况并阻止滥用者的 IP 地址)维护。

该规则将由类似于 iptables 命令行的命令创建,iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH或在 iptables-save as 的输出中找到-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH。通常,您会在文档中找到其中任一符号。

计数器表明该规则已匹配784'000个数据包和65兆字节的数据。

与第一条规则匹配的流量随后由链处理fail2ban-SSH,该链作为非标准链,列在 OUTPUT 链下方。

该链由两条规则组成,每条规则针对一个被阻止的滥用者(源 IP 地址 117.253.221.166 或 58.218.211.166)(带有reject-with icm-port-unreachable)。

 -A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
 -A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable

不是来自这些被阻止主机的 SSH 数据包既不被允许也不被禁止,并且现在自定义链已完成,将根据 INPUT 链中的第二条规则进行检查。

所有未发往端口 22 的数据包均通过了 INPUT 链中的第一个规则,并且还将在 INPUT 规则 #2 中进行评估。

INPUT 规则编号 2 表示这是一个状态防火墙,用于跟踪连接。这样做有一些优点,只需要根据完整规则集检查新连接的数据包,但一旦允许,属于已建立或相关连接的其他数据包将被接受而无需进一步检查。

输入规则 #2 匹配所有打开且相关的连接,并且匹配该规则的数据包不需要进一步评估。

笔记:状态防火墙配置中的规则变化只会影响新的连接,而不会影响已建立的连接。

相比之下,简单的数据包过滤器会根据完整规则集测试每个数据包,而不会跟踪连接状态。在这样的防火墙中,没有状态将会使用关键词。

INPUT 规则 #3 相当无趣,lo允许所有连接到环回(或 127.0.0.1)接口的流量。

INPUT 规则 4、5 和 6 用于通过授予对新连接的访问​​权限来打开 TCP 端口 22、80 和 443(SSH、HTTP 和 HTTPS 的默认端口)(INPUT 规则 2 已允许现有连接)。

在无状态防火墙中,这些规则将不带状态属性:

4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0

或者

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

最后一个 INPUT 规则 #7 是阻止 INPUT 规则 1-7 中未授予访问权限的所有流量的规则。一个相当常见的惯例:拒绝所有不允许的流量。理论上,可以通过将默认 POLICY 设置为 REJECT 来省略此规则。

始终调查整个链条。

4.了解你的环境

4.1。软件防火墙中的设置不会影响网络中其他地方维护的安全设置,即尽管使用iptables路由器上未修改的访问控制列表或网络中的其他防火墙打开网络服务仍可能会阻止流量......

4.2。当没有服务监听时,你将无法连接并获得连接被拒绝错误,无论防火墙设置如何。因此:

  • 确认服务正在监听(在正确的网络接口/ IP 地址上)并使用您期望的端口号,[sudo] netstat -plnut或者使用ss -tnlp
  • 如果您的服务尚未运行,请使用例如 netcat 模拟一个简单的监听器:[sudo] nc -l -p 123或者openssl s_server -accept 1234 [options] 如果您需要 TLS/SSL 监听器(检查man s_server选项)。
  • 在尝试从远程主机进行连接之前,请验证您可以从服务器本身(即telnet <IP of Server> 123echo "Hello" | nc <IP of Server> 123当测试 TLS/SSL 安全服务时)进行连接。openssl s_client -connect <IP of Server>:1234

4.3。了解服务使用的协议。如果你不充分了解,你就无法正确启用/禁用服务。例如:

  • 是使用 TCP 还是 UDP,或者两者兼而有之(与 DNS 一样)?
  • 该服务是否使用固定的默认端口(例如,Web 服务器的 TCP 端口 80)?
  • 或者是否选择一个可以变化的动态端口号(即使用 Portmap 注册的经典 NFS 之类的 RPC 服务)?
  • 臭名昭著的 FTP 甚至使用两个端口,当配置为使用被动模式时,既有固定端口号,也有动态端口号......
  • 中的服务、端口和协议描述/etc/services不一定与使用端口的实际服务相匹配。

4.4。内核数据包过滤器并不是唯一可能限制网络连接的东西:

  • SELinux 可能还会限制网络服务。getenforce将确认 SELinux 是否正在运行。
  • 尽管 TCP Wrappers 变得有些晦涩难懂,但它仍然是加强网络安全的强大工具。请查看控制ldd /path/to/service |grep libwrap文件/hosts.[allow|deny]

5.INPUTFORWARD连锁店

更透彻地解释链的概念这里简而言之:

INPUT链是您在发出 iptables 命令的主机上打开和/或关闭本地运行的服务的网络端口的地方。

FORWARD链是您应用规则来过滤内核转发到其他系统、实际系统以及 Docker 容器和虚拟客户服务器的流量的地方,当您的 Linux 机器充当网桥、路由器、虚拟机管理程序和/或执行网络地址转换和端口转发时。

一个常见的误解是,由于 docker 容器或 KVM 客户机在本地运行,因此适用的过滤规则应该在 INPUT 链中,但通常情况并非如此。

6. 内核模块

由于数据包过滤器在 Linux 内核中运行,因此它也可以编译为动态模块,实际上是多个模块。大多数发行版都包含 netfilter 作为模块,所需的 netfilter 模块将根据需要加载到内核中,但对于某些模块,防火墙管理员需要手动确保它们被加载。这主要涉及连接跟踪模块,例如nf_conntrack_ftp可以使用 加载的模块insmod

可以使用 显示当前加载到正在运行的内核的模块lsmod

确保模块在重启后持续加载的方法取决于 Linux 发行版。

答案2

Iptables/防火墙“介绍”

防火墙基本上是一种基于策略的网络过滤器。Linux 防火墙是围绕 Netfilter 构建的;Netfilter 是内核的网络数据包处理框架,由执行特定任务的几个内核模块组成:

  1. FILTER 模块(始终默认加载)主要允许我们根据一定的匹配条件接受或丢弃 IP 数据包。
  2. NAT模块集允许我们执行网络地址转换(SNAT,DNAT,MASQUERADE)。
  3. MANGLE 模块允许我们改变某些 IP 数据包字段(TOS、TTL)。

用户使用命令行中的 iptables 配置 Netfilter 框架以满足其防火墙需求。使用 iptables,我们可以定义规则,指示内核在 IP 数据包到达、通过或离开我们的 Linux 机器时如何处理它们。每个 Netfilter 主进程都由 iptables 术语中的 TABLE(FILTER、NAT、MANGLE)表示。它们在网络数据包流图上有几个特定的​​挂钩点,内核会调用它们来执行其任务。某些特定位置的 TABLE 调用序列通常称为内置 CHAINS,其名称为 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING。如果我们将 TABLE 与“进程类型”相关联,将 CHAIN 与网络数据包流图上调用这些进程实例的“位置”相关联,则很容易记住。

在此处输入图片描述

由于 IP 数据包是在网络接口上接收的,或由本地进程创建的,因此在最终交付或丢弃之前,Netfilter 引擎将按顺序测试并应用网络数据包流图中包含的规则。在由 TABLE@CHAIN 对标识的每个块中,用户可以添加一个或多个包含 IP 数据包匹配条件和相应操作过程的连续规则。有些操作(即 ACCEPT、DROP 等)可以由多个 TABLE 执行,而其他操作(即 SNAT、DNAT 等)则特定于 TABLE。

即,当 IP 数据包从网络接口到达时,它首先由 PREROUTING 链处理,调用 MANGLE 表用户定义规则(如果有)。如果没有与当前数据包匹配的规则,则应用相应的 MANGLE@PREROUTING 默认操作或“策略”。此时,如果数据包未被丢弃,则该过程将继续,现在调用 PREROUTING 链上的 NAT 表规则(参见图)等等。为了方便规则布局,用户还可以创建自己的自定义链,并根据需要从图的不同点“跳转”到这些链中。

在此处输入图片描述

虽然内置链可以具有用户定义的接受或丢弃数据包的策略,但用户定义的链始终具有不可改变的默认策略 RETURN 给调用者以继续该过程。

Iptables 命令

iptables 主命令使用所需的处理规则填充网络数据包流图。

通用 iptables 规则可以写成:

# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>

它可以读作:

Netfilter (kernel module) please <Add/Insert/Delete> this rule for <table> at <CHAIN> where packets matching <PKT_MATCHING_CRITERIA> have to be <ACTION>ed

<table>
  -t filter       (the filter table is assumed when omitted)
  -t nat
  -t mangle 

<Add/Insert/Delete>
  -A              (append rule at the end of the chain list)
  -I              (insert rule at the begining of the chain list)
  -D              (Delete rule)

<CHAIN>
  PREROUTING
  INPUT
  FORWARD
  OUTPUT
  POSTROUTING
  USER_DEFINED_CHAIN

<PKT_MATCHING_CRITERIA>
ISO Level-2 matching:
  -i [!] <if_name>    or --in-interface [!] <if_name>
          (OUTPUT and POSTROUTING chains cannot match on input  interfaces)
  -o [!] <if_name>    or --out-interface [!] <if_name>
          (INPUT  and PREROUTING  chains cannot match on output interfaces) 
    -mac-source [!] <xx-xx-xx-xx-xx-xx>
            (OUTPUT and POSTROUTING chains cannot match on input  interfaces)

ISO Level-3 matching:
  -s [!] <src_ip>     or --src [!] <src_ip>   or --source [!] <src_ip>
  -d [!] <dst_ip>     or --src [!] <dst_ip>   or --destination [!] <dst_ip>

ISO Level-4 matching:
  -p [!] <prot_name>    or --protocol [!] <prot_name>  (udp|tcp|icmp)

  Also available when ICMP protocol is defined
  --icmp-type [!] <icmp_type>

  Also available when UDP protocol is defined
  --source-port [!] <udp_src_port>      or --sport [!] <udp_src_port>
  --destination-port [!] <udp_dst_port> or --dport [!] <udp_dst_port>

  Also available when TCP protocol is defined
  --source-port [!] <tcp_src_port>      or --sport [!] <tcp_src_port>
  --destination-port [!] <tcp_dst_port> or --dport [!] <tcp_dst_port>
  --tcp-flags [!] <tcp_flags>   (SYN|ACK|FIN|RST|URG|PSH|ALL|NONE)
    --syn
  --tcp-option [!] <tcp_option#>

  --state [!] <state>
  -m <match> [options]

    note: [!] = negation operator

<ACTION>                (also called TARGET)
  -j ACCEPT             (process continues with rules of the next table in map)
  -j DROP               (discard current packet)
  -j REJECT             (discard current packet with ICMP notification)
      option:
      --reject-with <reject_type>
  -j USER_DEFINED_CHAIN   (start traversing USER_DEFINED_CHAIN rules)
  -j RETURN               (return from USER_DEFINED_CHAIN)
  -j LOG                  (log to syslog, then process next rule in table)
      options:
      --log-level <level>
      --log-prefix <prefix>
      --log-tcp-sequence
      --log-tcp-options
      --log-ip-options
      --log-uid

nat table specific
  -j SNAT             (rewrite the source IP address of the packet)
      option:
      --to <ip_address>
  -j SAME             (idem SNAT; used when more than one source address)
      options:
      --nodst 
      --to <a1-a2>
  -j MASQUERADE       (idem SNAT; used when the replace IP is dynamic)
  -j DNAT             (rewrite the destination IP address of the packet)
      option:
      --to <ip_address>
  -j REDIRECT         (rewrite dst IP to 127.0.0.1, PREROUTING and OUTPUT only)
      option:
      –-to-port <port#>

mangle table specific
  -j ROUTE            (explicitly route packets, valid at PREROUTING)
      options:
      --iface <iface_name>
      --ifindex <iface_idx>
  -j MARK             (set Netfilter mark values)
      options:
      --set-mark <value>
      --and-mark <value>
      --or-mark <value> 
  -j TOS              (set the IP header Type of Service field) 
      option:
      --set-tos <value>
  -j DSCP             (set the IP header Differentiated Services Field)
      options:
      --set-dscp <value>
      --set-dscp-class <class>
  -j TTL              (set the IP header Time To Live field)
      options:
      --ttl-set <value>
      --ttl-dec <value>
      --ttl-inc <value>

iptables辅助命令完成场景设置默认条件,列出规则,刷新规则等。

#iptables -t <table> -L             
       (Lists the <table> rules in all chains)
#iptables -t <table> -L <CHAIN>     
       (Lists the <table> rules in <CHAIN>)

#iptables -t <table> -N <CHAIN>     
       (Creates a user-defined <CHAIN> for holding <table> rules)
#iptables -t <table> -E <CHAIN> <NEWCHAIN>  
       (Renames <CHAIN> that holds <table> rules to <NEWCHAIN>)

#iptables -t <table> -X   
       (Deletes all user-defined chains created for holding <table> rules)
#iptables -t <table> -X <CHAIN>
       (Deletes user-defined <CHAIN> created for holding <table> rules)

#iptables -t <table> -P <CHAIN> <ACTION>     where <ACTION> = ACCEPT|DROP
       (Sets the default policy of <table> rules at <CHAIN> to <ACTION>)

#iptables -t <table> -F             
       (Flushes (deletes) all <table> rules in all chains)
#iptables -t <table> -F <CHAIN>
       (Flushes (deletes) all <table> rules in <CHAIN>)

#iptables -t <table> -R <CHAIN> <INDEX> <NEWRULE>
       (Replaces <table> rule at position <INDEX> in <CHAIN> with <NEWRULE>

Iptables 在运行时将命令加载到 Netfilter 引擎中,Netfilter 会立即执行已加载的规则和设置,但它们不是持久的。重启后,所有之前加载的 Netfilter 规则和设置都将丢失。因此,有一些 iptables 实用程序允许将当前活动的规则集保存到文件中,并在以后重新加载。

#iptables-save > fileName
      (Save the currently active Netfilter ruleset to fileName)

#iptables-restore < fileName
      (Restore Netfilter ruleset to the one saved in fileName)

Iptables 摘要

Netfilter 是一个极其灵活和强大的框架,但为此付出的代价是:Iptables 很复杂。从用户的角度来看,某些术语(如 TABLE、CHAIN、TARGET)与它们所代表的概念并不十分匹配,而且乍一看没有多大意义。这个话题很长,命令似乎有无穷无尽的参数列表。更糟糕的是,没有一本真正精通 Iptables 的书。它们大多分为两类:“食谱书”或“手册页书”。我认为这篇介绍可以让您大致了解 Netfilter/Iptables 的情况,以及必要的预先消化的手册页内容。如果您是 iptables 新手,阅读这​​些段落几次后,您就可以阅读 iptables 示例了。经过一些练习,您很快就会发现自己可以编写自己的规则。

防火墙

防火墙主要设计用于根据一组规则动态地允许或拒绝网络流量。此时,很容易理解为什么 Linux Netfilter/Iptables 框架非常适合构建防火墙。查看网络数据包流图,我们在 INPUT 和 FORWARD 链的 FILTER 表上发现两个特别有趣的点;我们可以在那里决定 IP 源地址、IP 协议 (UDP/TCP)、目标端口 (80、21、443 等) 等,是接受、拒绝还是直接丢弃某个 IP 数据包。这就是防火墙在 80% 的时间里所做的工作,即保护 Web 服务器免受未经授权的网络请求。另外 20% 的时间是操纵 (NAT、MANGLE) 网络数据包。

防火墙场景

有数百种不同的防火墙布局来满足不同的需求,但其中 3 种可以被视为最典型的防火墙场景。

  1. 简单的 Web 服务器,具有一个或多个连接到 Internet 的接口。策略包括允许受限入站访问、不受限制的出站访问的基本规则以及反欺骗规则。IP 转发已关闭。
  2. 此防火墙连接到互联网和受保护的内部区域。策略包括允许受限制的入站访问、不受限制的出站访问和反欺骗规则的基本规则。由于受保护区域使用私有 IP 地址,因此需要源 NAT。IP 转发已打开。
  3. 此防火墙连接到互联网、内部保护区和非军事区。策略包括允许受限入站访问、不受限制出站访问和反欺骗规则的基本规则。由于保护区和 DMZ 区域使用私有 IP 地址,因此需要源和目标 NAT。IP 转发已开启。 在此处输入图片描述

我写这篇文章是为了: http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html

答案3

不同协议的常见问题

DNS:DNS 默认使用端口 53 UDP,但无法在单个 UDP 数据报中容纳的消息将使用 TCP 传输(通常是区域传输等),这要求在运行名称服务器时也打开端口 53 TCP。

电子邮件:许多消费者 ISP 会阻止 SMTP 通信(或至少阻止默认端口 TCP 25),从而无法直接接收或发送电子邮件,其客户被迫使用 ISP 的 SMTP 中继来发送所有外发电子邮件,有时也使用 ISP 的 SMTP 中继来发送接收电子邮件。与 §1.1 相关。

FTP:FTP 是一个奇怪的协议,因为连接。第一个是控制连接,默认情况下,FTP 服务器将监听 TCP 端口 21。控制连接用于身份验证和发出命令。实际的文件传输和目录列表输出等内容将通过第二个 TCP 连接,即数据连接。在主动 FTP 中,数据连接将从 FTP 服务器的 TCP 端口 20 发起并连接到 FTP 客户端。主动 FTP 不适用于防火墙和 NAT 网关后面的用户,因此它已基本被废弃。大多数 FTP 服务器都支持被动 FTP。使用被动 FTP,FTP 服务器在第二个端口上打开一个用于数据连接的侦听器,然后 FTP 客户端可以连接到该端口。防火墙的问题是数据端口可以是 1024-65536 之间的任何可用的非特权端口。

在无状态防火墙中,通常通过限制 FTP 服务器可以分配的被动端口数量,然后明确打开这些端口来解决。即

iptables -A INPUT -p tcp --match multiport --dports 21000:21050 -j ACCEPT

在状态防火墙中,您不需要明确打开 DATA 端口,netfilter 辅助模块将识别分配的动态端口,并通过将 DATA 连接标记为RELATED匹配通用规则来为正确的客户端动态打开该端口:

  iptables -I INPUT -p tcp -m state ESTABLISHED,RELATED -j ACCEPT

这要求正确的内核模块例如,在 FTP 情况下,通过运行手动加载insmod nf_conntrack_ftp,使其在重启时持久依赖于分发。

笔记:当 FTP 与 SSL 一起使用时,FTP 连接跟踪模块将会失败,因为控制连接将被加密,并且 nf_conntrack_ftp 将无法再读取 PASV 响应。

NFS和类似RPC 服务:RPC 服务的问题在于,从设计上讲,它们不使用特定的固定端口。它们可以随机选择任何可用端口,然后将其注册到 RPC Portmap 守护程序。尝试连接的客户端将查询 Portmap 守护程序,然后直接连接到正确的端口。这解决了预留端口用尽的问题……

从防火墙的角度来看,需要打开 TCP/UDP 端口 111 以及 RPC 服务当前正在使用的实际端口。在防火墙中打开这种随机端口的问题通常通过限制 RPC 服务(例如 NFS 服务器)使用预定义的固定端口来解决。

相关内容