调试 iptables 和常见的防火墙陷阱?

HBr*_*ijn 23 linux firewall iptables ufw firewalld

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

为了回应 EEAA 的回答@Shog 的评论,我们需要一个合适的规范问答来结束关于 iptables 的常见的相对简单的问题。

什么是调试 Linux 软件防火墙问题的结构化方法,netfilter包过滤框架,通常被用户界面接口iptables引用?

有哪些常见的陷阱、反复出现的问题和简单或更模糊的事情,以检查偶尔的防火墙管理员可能会忽略或以其他方式从了解中受益?

即使您使用诸如UFWFirewallD(又名firewall-cmd)、Shorewall或类似的工具,您也可以从没有这些工具提供的抽象层的情况下查看引擎盖中受益。

这个问题不是用于构建防火墙的方法:检查产品文档,例如为iptables Trips & Tricks贡献食谱或搜索标记的 问题以获取现有的常见且备受推崇的高分问答环节。

HBr*_*ijn 21

一般来说:

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

内容:

  1. 为了事项或者差-I-A
  2. 显示当前防火墙配置
  3. 解释输出 iptables -L -v -n
  4. 了解你的环境
  5. INPUT 和 FORWARD 链
  6. 内核模块

1.订购事宜或者差-I-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
Run Code Online (Sandbox Code Playgroud)

或等效于 iptables-save:

...
iptables -A INPUT  -j REJECT
iptables -A INPUT  -p tcp --dport 8080 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

并且永远不会到达打开 TCP 端口 8080 的新规则。(正如计数器顽固地保持在 0 个数据包和 0 个字节所证明的那样)。

通过插入带有-I新规则的规则,该规则将成为链中的第一个规则并且将起作用。

2. 显示当前防火墙配置

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

命令[sudo] iptables -L -v -n是你的朋友(尽管有些人iptables-save更喜欢)。通常在讨论配置时,使用该--line-numbers选项以及编号线很有用。参考规则#X 使讨论它们更容易一些。
注意: 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
Run Code Online (Sandbox Code Playgroud)

或者,输出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
Run Code Online (Sandbox Code Playgroud)

你会发现什么更容易理解,这是一个偏好问题。

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

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

INPUT 链中的第一条规则立即是一个有趣的规则,它将所有流量(源 0.0.0.0/0 和目标 0.0.0.0/0)发送到 TCP 端口 22 ( tcp dpt:22) SSH 的默认端口到自定义目标 ( fail2ban-SSH) . 顾名思义,此规则由fail2ban(一种安全产品,其中包括扫描系统日志文件以查找可能的滥用并阻止滥用者的IP 地址)维护。

该规则将由类似于iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSHiptables-save as 的输出的 iptables 命令行创建或在 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
Run Code Online (Sandbox Code Playgroud)

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

所有不是发往端口 22 的数据包都通过了 INPUT 链中的第一条规则,并且也将在 INPUT 规则 #2 中进行评估。

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

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

注意:状态防火墙配置中的规则更改只会影响新连接,不会影响已建立的连接。

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

INPUT 规则#3 很无聊,所有连接到环回(lo或 127.0.0.1)接口的流量都是允许的。

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

在无状态防火墙中,这些规则将在没有状态属性的情况下出现:

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
Run Code Online (Sandbox Code Playgroud)

或者

-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
Run Code Online (Sandbox Code Playgroud)

最后的 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 一样)?
  • 该服务是否使用固定的默认端口(例如,网络服务器的 TCP 端口 80)?
  • 或者,是否选择了一个可以变化的动态端口号(即 RPC 服务,如向 Portmap 注册的经典 NFS)?
  • 臭名昭著的 FTP 甚至使用两个端口,当配置为使用被动模式时,一个固定端口号和一个动态端口号......
  • 中的服务、端口和协议描述/etc/services不一定与使用端口的实际服务匹配。

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

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

5.INPUTFORWARD链条

链的概念在这里有更彻底的解释但它的简短之处在于:

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

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

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

6. 内核模块

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

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

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

  • 当寻找增量数据包/字节计数器时。一个有用的工具是在差分模式下使用手表。所以像这样:`watch --difference -n 1 iptables -L FORWARD -v -n`。让该工具定期运行命令并突出显示更改会使其变得更加容易。 (2认同)
  • 我刚刚看到你的懒散评论。这是一个很好的答案,不确定我可以补充多少。您可能需要提及使用 [TRACE](http://serverfault.com/a/126079/984) 功能。 (2认同)

Pat*_*Pat 12

iptables/防火墙“介绍”

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

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

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

在此处输入图片说明

由于 IP 数据包是在网络接口上接收到的,或者由本地进程创建,直到它最终被传送或丢弃,Netfilter 引擎将依次测试和应用网络数据包流图中包含的规则。在由 TABLE@CHAIN 对标识的每个块上,用户可以添加一个或多个这些连续规则,其中包含 IP 数据包匹配标准和相应的操作过程。有些操作(即 ACCEPT、DROP 等)可以由多个 TABLE 和其他特定于 TABLE 的操作(即 SNAT、DNAT 等)执行。

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

在此处输入图片说明

虽然内置链可以有用户定义的 ACCEPT 或 DROP 数据包策略,但用户定义的链总是有一个不可更改的默认策略 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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. 具有一个或多个连接到 Internet 的接口的简单 Web 服务器。策略包括允许受限入站访问、无限制出站访问和反欺骗规则的基本规则。IP 转发已关闭。
  2. 此防火墙连接到 Internet 和受保护的内部区域。策略包括允许受限入站访问、无限制出站访问和反欺骗规则的基本规则。由于保护区使用私有 IP 地址,因此需要源 NAT。IP 转发已开启。
  3. 该防火墙连接到 Internet、内部保护区和非军事区。策略包括允许受限入站访问、无限制出站访问和反欺骗规则的基本规则。由于受保护区域和 DMZ 区域使用私有 IP 地址,因此它们需要源和目标 NAT。IP 转发已开启。 在此处输入图片说明

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


HBr*_*ijn 7

不同协议的常见问题

DNS: DNS 默认使用端口 53 UDP,但不适合单个 UDP 数据报的消息将使用 TCP 传输(通常是区域传输等),需要在运行名称服务器时打开端口 53 TCP .

电子邮件:许多消费者 ISP 阻止 SMTP 流量(或至少是默认端口 TCP 25),使其无法直接接收或发送电子邮件,并且他们的客户被迫使用 ISP 的 SMTP 中继来处理所有外发电子邮件,有时也用于传入电子邮件. 与 §1.1 相关。

FTP:就使用两个连接而言,FTP 是一种奇怪的协议。第一个是控制连接,默认情况下,FTP 服务器将侦听 TCP 端口 21。控制连接用于认证和发布命令。实际的文件传输和诸如目录列表输出之类的事情通过第二个 TCP 连接,即 DATA 连接. 在活动 FTP 中,数据连接将从 FTP 服务器从 TCP 端口 20 启动并连接到 FTP 客户端。主动 FTP 对防火墙和 NAT 网关后面的用户的工作不太好,因此它大多已被废弃。大多数 FTP 服务器都支持被动 FTP。使用被动 FTP,FTP 服务器在第二个端口上为 DATA 连接打开一个侦听器,然后 FTP 客户端可以连接到该侦听器。防火墙的问题是 DATA 端口可以是 1024-65536 之间的任何可用的非特权端口。

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

iptables -A INPUT -p tcp --match multiport --dports 21000:21050 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

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

  iptables -I INPUT -p tcp -m state ESTABLISHED,RELATED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

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

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

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

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