前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[译]使用iptables控制网络流量

[译]使用iptables控制网络流量

作者头像
杜逸先
发布2018-08-30 16:36:06
6.8K0
发布2018-08-30 16:36:06
举报

iptables是一个允许用户配置特定规则的应用程序,这些规则由将由内核netfilter框架强制执行。它充当数据包过滤器和防火墙,可根据端口,协议和其他标准检查和定向流量。本指南将重点介绍iptables规则集的配置和应用,并提供常用方法的示例。

默认情况下,iptables工具包含在您的Linode提供的发行版中。要使用iptables,您需要root(sudo)权限。

使用Linux iptables管理IPv4流量

iptables命令

iptables命令可以使用许多选项。如上所述,iptables设置控制网络流量的规则。您可以定义不同的表来处理这些规则,通过链(chains)和与数据包子集匹配的规则列表。该表包含各种内置的链,但您可以添加自己的链。

基本iptables参数和语法

在我们开始创建规则之前,让我们回顾一下iptables规则的语法。

例如,以下命令将规则添加到链的开头,该规则将中删除所有来自地址198.51.100.0的数据包:

代码语言:javascript
复制
iptables -I INPUT -s 198.51.100.0 -j DROP

上面的示例命令:

  1. 调用iptables程序
  2. 使用-I选项进行插入(insertion)。使用带有插入选项的规则会将其添加到链的开头,并将被率先应用。您还可以使用带-I选项的数字来指定链中的特定位置。
  3. -s参数以及IP地址(198.51.100.0)表示源(source)
  4. 最后,-j参数代表跳转。它指定规则的目标以及如果数据包匹配将执行的操作。

参数

描述

-p, --protocol

协议,如TCP,UDP等。

-s, --source

可以是地址,网络名称,主机名等。

-d, --destination

地址,主机名,网络名称等

-j, --jump

指定规则的目标; 即如果数据包匹配该怎么办。

-g, --goto chain

指定过程将在用户指定的链中继续处理。

-i, --in-interface

命名接收数据包的接口。

-o, --out-interface

发送数据包的接口名称。

-f, --fragment

该规则仅适用于分段数据包的第二个和后续片段。

-c, --set-counters

使管理员能够以一条规则初始化数据包和字节计数器。

默认表

表由内置链组成,也可能包含用户定义的链。内置表将取决于内核配置和已安装的模块。

默认表如下:

  • Filter - 这是默认表。它的内置链是:
    • Input(输入):转到本地套接字的数据包
    • Forward(转发):通过服务器路由的数据包
    • Output(输出):本地生成的数据包

  • Nat - 当数据包创建新连接时,使用此表。它的内置链是:
    • Prerouting(前置路由):在数据包进入时指定数据包
    • Output(输出):在路由发生之前本地生成的数据包
    • Postrouting(后置路由):在出路时改变数据包

  • Mangle - 用于特殊的数据包更改。它的链是:
    • Prerouting(前置路由):传入的数据包
    • Postrouting(后置路由):传出的数据包
    • Output(输出):被更改的本地生成的数据包
    • Input(输入):直接进入服务器的数据包
    • Forward(转发):通过服务器路由的数据包

  • Raw - 主要用于配置连接跟踪的例外。内置链是:
    • Postrouting(前置路由):通过网络接口到达的数据包
    • Output(输出):本地产生的过程

  • Security - 用于强制访问控制(MAC)规则。在过滤表之后,接下来访问安全表。内置链是:
    • Input(输入):进入服务器的数据包
    • Output(输出):本地生成的数据包
    • Forward(转发):通过服务器的数据包

基本iptables选项

iptables命令可以使用许多选项:

选项

描述

-A --append

将一个或多个规则添加到所选链的末尾。

-C --check

检查与所选链中的规范匹配的规则。

-D --delete

从所选链中删除一个或多个规则。

-F --flush

逐个删除所有规则。

-I --insert

将一个或多个规则作为给定的规则编号插入所选链中。

-L --list

显示所选链中的规则。

-n --numeric

以数字格式显示IP地址或主机名和邮政编号。

-N --new-chain <name>

创建一个新的用户定义链。

-v --verbose

与list选项一起使用时提供更多信息。

-X --delete-chain <name>

删除用户定义的链。

插入,替换或删除iptables规则

iptables规则是自上而下强制执行的,因此规则集中的第一个规则应用于链中的流量,然后是第二个,第三个等等。这意味着用iptables -A或者ip6tables -A不一定会添加规则到带有的规则集中。相反,必须插入规则ptables -Iip6tables -I

插入(Insert)

插入的规则需要按照链中的其他规则以正确的顺序放置。要获取iptables规则的数字列表:

代码语言:javascript
复制
sudo iptables -L -nv --line-numbers

例如,假设您要将规则插入到本指南中提供的基本规则集中,该规则将通过TCP协议接受到端口8080的传入连接。我们将根据网络流量规则将其作为规则7添加到INPUT链中:

代码语言:javascript
复制
sudo iptables -I INPUT 7 -p tcp --dport 8080 -m state --state NEW -j ACCEPT

如果现在再次运行sudo iptables -L -nv,您将在输出中看到新规则。

替换(Replace)

替换规则类似于插入,但是使用iptables -R。例如,假设您希望将拒绝条目的记录减少到每分钟3次,而原始规则集中的记录减少到5。LOG规则在INPUT链中排名第九:

代码语言:javascript
复制
sudo iptables -R INPUT 9 -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7

删除(Delete)

使用规则编号也可以删除规则。例如,要删除我们刚为端口8080插入的规则:

代码语言:javascript
复制
sudo iptables -D INPUT 7

警告编辑规则不会自动保存它们。有关分发的具体说明,请参阅有关部署规则集的部分。

查看您当前的iptables规则

IPv4:

代码语言:javascript
复制
sudo iptables -L -nv

IPv6:

代码语言:javascript
复制
sudo ip6tables -L -nv

在大多数发行版中,iptables没有IPv4和IPv6的默认规则。因此,在新创建的Linode上,您可能会看到下面显示的内容 - 三个没有任何防火墙规则的空链。这意味着允许所有传入,转发和传出流量。将入站和转发流量限制为仅限于必要的流量非常重要。

代码语言:javascript
复制
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

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

配置iptables

iptables可以通过多种方式进行配置和使用。以下部分将概述如何按端口和IP配置规则,以及如何将地址列入黑名单(阻止)或白名单(允许)。

按端口阻止流量

您可以使用端口阻止特定接口上的所有流量。例如:

代码语言:javascript
复制
iptables -A INPUT -j DROP -p tcp --destination-port 110 -i eth0

让我们来看看这个命令的每个部分是做什么的:

  • -A 将规则添加或附加到链的末尾。
  • INPUT 将规则添加到表中。
  • DROP 表示丢弃数据包。
  • -p tcp 表示该规则只会丢弃TCP数据包。
  • --destination-port 110 过滤针对端口110的数据包。
  • -i eth0表示此规则仅影响到达eth0接口的数据包。

重要的是要了解iptables 识别网络接口上的别名。因此,如果您有多个虚拟IP接口,则必须指定目标地址以过滤流量。下面提供了一个示例命令:

代码语言:javascript
复制
iptables -A INPUT -j DROP -p tcp --destination-port 110 -i eth0 -d 198.51.100.0

您也可以使用-D--delete删除规则。例如,这些命令是等效的:

代码语言:javascript
复制
iptables --delete INPUT -j DROP -p tcp --destination-port 110 -i eth0 -d 198.51.100.0
iptables -D INPUT -j DROP -p tcp --destination-port 110 -i eth0 -d 198.51.100.0

从一个IP中删除流量

要从特定IP地址中删除所有传入流量,请使用带有以下选项的iptables命令:

代码语言:javascript
复制
iptables -I INPUT -s 198.51.100.0 -j DROP

要删除这些规则,请使用--delete-D选项:

代码语言:javascript
复制
iptables --delete INPUT -s 198.51.100.0 -j DROP
iptables -D INPUT -s 198.51.100.0 -j DROP

按端口号阻止或允许流量以创建iptables防火墙

创建防火墙的一种方法是阻止系统的所有流量,然后允许某些端口上的流量。下面是一个示例序列,用于说明该过程:

代码语言:javascript
复制
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -m comment --comment "Allow loopback connections" -j ACCEPT
iptables -A INPUT -p icmp -m comment --comment "Allow Ping to work as expected" -j ACCEPT
iptables -A INPUT -p tcp -m multiport --destination-ports 22,25,53,80,443,465,5222,5269,5280,8999:9003 -j ACCEPT
iptables -A INPUT -p udp -m multiport --destination-ports 53 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP

让我们分解上面的例子。前两个命令向INPUT链添加或附加规则,以允许在特定端口上进行访问。在-p tcp-p udp选项指定UDP或TCP数据包类型。该-m multiport功能根据源端口或目标端口匹配数据包,并且可以接受最多15个端口的指定。还接受多端口范围,例如8999:9003,只是15个数字中的两个,但相匹配的端口有8999900090019002,和9003。下一个命令允许与现有连接关联的所有传入和传出数据包,以便它们不会被防火墙无意中阻止。最后两个命令使用该-P选项来描述默认策略对于这些链条。其结果是,通过处理所有的数据包INPUT,并FORWARD会在默认情况下被丢弃。

请注意,上述规则仅控制传入数据包,不限制传出连接。

按地址划分的白名单/黑名单流量

您可以使用iptables阻止所有流量,然后只允许来自某些IP地址的流量。这些防火墙规则限制对网络层特定资源的访问。下面是一个示例序列的命令:

代码语言:javascript
复制
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -m comment --comment "Allow loopback connections" -j ACCEPT
iptables -A INPUT -p icmp -m comment --comment "Allow Ping to work as expected" -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -s 198.51.100.0 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP

在第一个命令中,-s 192.168.1.0/24语句指定允许192.168.1地址空间上的所有源IP。您可以使用CIDR(无类别域间路由)表示法或单个IP地址指定IP地址范围,如第二个命令中所示。第三个命令允许与现有连接关联的所有传入和传出数据包。最后两个命令为所有INPUTFORWARD链设置默认策略,丢弃所有数据包。

使用ip6tables管理IPv6流量

使用IPv6时,请记住iptables命令是不兼容的。相反,有一个ip6tables命令。附加,检查等选项是相同的。ip6tables使用的表是rawsecuritymanglefilter。协议,源等参数是相同的。语法与IPv4基本相同。示例语法如下:

代码语言:javascript
复制
ip6tables [-t table] -N chain

要查看为IPv6配置的规则,请使用以下命令:

代码语言:javascript
复制
ip6tables -L

配置IPv6规则

ip6tables通过使用端口,黑名单的特定地址,协议等来工作。主要区别在于ip6tables可以使用带有-mmatch选项的扩展数据包匹配模块,后跟模块名称。以下是一些扩展模块:

  • addrtype - 根据数据包的地址类型匹配数据包。一些地址类型是:
    • 本地
    • 单播
    • 广播
    • 组播

  • ah - 匹配IPsec数据包的认证头中的参数。
  • cluster - 您可以在没有负载平衡器的情况下部署网关和后端负载共享群集。
  • comment - 允许您向任何规则添加注释。
  • connbytes - 匹配连接传输的字节数或数据包数,或每个数据包的平均字节数。

这不是一个完整或全面的列表。您可以使用以下man页面查看扩展模块的完整列表:

代码语言:javascript
复制
man ip6tables

以下是ip6tables中使用的示例规则:

代码语言:javascript
复制
# limit the number of parallel HTTP requests to 16 for the link local network
ip6tables -A INPUT -p tcp --syn --dport 80 -s fe80::/64 -m connlimit --connlimit-above 16 --connlimit-mask 64 -j REJECT
ip6tables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

此规则细分如下:

  • 第一行是注释。
  • -A 是追加。
  • INPUT 是将规则添加到表中。
  • -p 用于协议,即TCP。
  • --syn 仅匹配SYN位设置且清除ACK,RST和FIN位的TCP数据包。
  • --dport 是目标端口,即80。
  • -s 是源,它是本地地址范围fe80 :: / 64。
  • -m 是为了匹配。
  • connlimit 是扩展数据包模块名称,它是连接限制。
  • --connlimit-above 16 表示如果连接数超过16,则仅使用前16个。
  • --connlimit-mask 64 表示组主机使用的前缀长度为64。
  • -j 是跳转,它告诉目标规则如果数据包匹配该怎么办。
  • REJECT 表示数据包被丢弃。

非静态IPv6分配的必需规则

代码语言:javascript
复制
# Below are the rules which are required for your IPv6 address to be properly allocated
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type redirect -m hl --hl-eq 255 -j ACCEPT

基本iptables IPv4和IPv6的规则集

合适的防火墙规则取决于正在运行的服务。下面是iptables规则集,用于在运行Web服务器时保护您的Linode。

警告这些规则仅作为示例给出。真正的生产Web服务器可能需要更多或更少的配置,并且这些规则不适用于数据库,Minecraft或V**服务器。Iptables规则总是可以在以后修改或重置,但这些基本规则集可用作演示。

IPv4

/tmp/V4

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

*filter # Allow all loopback (lo0) traffic and reject traffic # to localhost that does not originate from lo0. -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT # Allow ping. -A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT # Allow SSH connections. -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT # Allow HTTP and HTTPS connections from anywhere # (the normal ports for web servers). -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT # Allow inbound traffic from established connections. # This includes ICMP error returns. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Log what was incoming but denied (optional but useful). -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7 # Reject all other inbound. -A INPUT -j REJECT # Log any traffic that was sent to you # for forwarding (optional but useful). -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7 # Reject all traffic forwarding. -A FORWARD -j REJECT COMMIT

可选:如果您计划使用Linode LongviewLinode的NodeBalancers,请在允许HTTP和HTTPS连接的部分之后添加相应的规则:

代码语言:javascript
复制
# Allow incoming Longview connections from longview.linode.com
-A INPUT -s 96.126.119.66 -m state --state NEW -j ACCEPT

# Allow incoming NodeBalancer connections
-A INPUT -s 192.168.255.0/24 -m state --state NEW -j ACCEPT

IPv6的=

如果您希望使用IPv6补充Web服务器的IPv4规则,则此规则集将允许HTTP/S访问和所有ICMP功能。

/tmp/V6

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

*filter # Allow all loopback (lo0) traffic and reject traffic # to localhost that does not originate from lo0. -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -s ::1/128 -j REJECT # Allow ICMP -A INPUT -p icmpv6 -j ACCEPT # Allow HTTP and HTTPS connections from anywhere # (the normal ports for web servers). -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT # Allow inbound traffic from established connections. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Log what was incoming but denied (optional but useful). -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7 # Reject all other inbound. -A INPUT -j REJECT # Log any traffic that was sent to you # for forwarding (optional but useful). -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7 # Reject all traffic forwarding. -A FORWARD -j REJECT COMMIT

注意APT命令尝试将镜像域解析为IPv6 作为apt-get update的结果。如果您选择完全禁用和拒绝IPv6,这将减慢Debian和Ubuntu的更新过程,因为APT在继续之前等待每个分辨率超时。 为了解决这个问题,取消对该行precedence ::ffff:0:0/96 100/etc/gai.conf

部署您的iptables规则集

部署iptables规则集的过程因您使用的Linux发行版而异:

Debian / Ubuntu

UFW是Ubuntu附带的iptables控制器,但它也可以在Debian的存储库中使用。如果您更喜欢使用UFW而不是iptables,请参阅我们的指南:如何使用UFW配置防火墙

  1. 创建文件/tmp/v4/tmp/v6。将上述规则集粘贴到各自的文件中。
  2. 立即使用以下命令导入规则集: sudo iptables-restore < /tmp/v4 sudo ip6tables-restore < /tmp/v6
  3. 要在引导时自动应用iptables规则,请参阅有关配置iptables-persistent的部分

CentOS / Fedora

CentOS 7或Fedora 20及以上版本

在这些发行版中,FirewallD用于实现防火墙规则,而不是使用iptables命令。如果您更喜欢在iptables上使用它,请参阅我们的指南:CentOS上的FirewallD简介

  1. 如果您更喜欢使用iptables,必须首先停止并禁用FirewallD。 sudo systemctl stop firewalld.service && sudo systemctl disable firewalld.service
  2. 安装iptables-services并启用iptables和ip6tables: sudo yum install iptables-services sudo systemctl enable iptables && sudo systemctl enable ip6tables sudo systemctl start iptables && sudo systemctl start ip6tables
  3. 创建文件/tmp/v4/tmp/v6。将上面规则集粘贴到各自的文件中。
  4. 立即使用以下命令导入规则集: sudo iptables-restore < /tmp/v4 sudo ip6tables-restore < /tmp/v6
  5. 保存每个规则集: sudo service iptables save sudo service ip6tables save
  6. 删除临时规则文件: sudo rm /tmp/{v4,v6}

CentOS 6

  1. 创建文件/tmp/v4/tmp/v6。将上面规则集粘贴到各自的文件中。
  2. 从临时文件导入规则: sudo iptables-restore < /tmp/v4 sudo ip6tables-restore < /tmp/v6
  3. 保存规则: sudo service iptables save sudo service ip6tables save 注意防火墙规则保存到/etc/sysconfig/iptables/etc/sysconfig/ip6tables
  4. 删除临时规则文件: sudo rm /tmp/{v4,v6}

Arch Linux

  1. 创建文件/etc/iptables/iptables.rules/etc/iptables/ip6tables.rules。将上面规则集粘贴到各自的文件中。
  2. 立即使用以下命令导入规则集: sudo iptables-restore < /etc/iptables/iptables.rules sudo ip6tables-restore < /etc/iptables/ip6tables.rules
  3. 默认情况下,在Arch中不运行iptables。启用并启动systemd单元: sudo systemctl start iptables && sudo systemctl start ip6tables sudo systemctl enable iptables && sudo systemctl enable ip6tables 有关在Arch中使用iptables的更多信息,请参阅其iptables的 Wiki条目和简单的状态防火墙

验证iptables规则集

使用v选项详细输出选项检查Linode的防火墙规则:

代码语言:javascript
复制
sudo iptables -vL
sudo ip6tables -vL

IPv4规则的输出应显示:

代码语言:javascript
复制
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    0     0 REJECT     all  --  !lo    any     loopback/8           anywhere             reject-with icmp-port-unreachable
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp destination-unreachable
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp echo-request
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp time-exceeded
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh state NEW
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http state NEW
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:https state NEW
    0     0 ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    0     0 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables_INPUT_denied: "
    0     0 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables_FORWARD_denied: "
    0     0 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

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

IPv6规则的输出如下所示:

代码语言:javascript
复制
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all      lo     any     anywhere             anywhere
    0     0 REJECT     all      !lo    any     localhost            anywhere             reject-with icmp6-port-unreachable
    0     0 ACCEPT     ipv6-icmp    any    any     anywhere             anywhere
    0     0 ACCEPT     tcp      any    any     anywhere             anywhere             tcp dpt:http state NEW
    0     0 ACCEPT     tcp      any    any     anywhere             anywhere             tcp dpt:https state NEW
    0     0 ACCEPT     all      any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    0     0 LOG        all      any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "ip6tables_INPUT_denied: "
    0     0 REJECT     all      any    any     anywhere             anywhere             reject-with icmp6-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 LOG        all      any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "ip6tables_FORWARD_denied: "
    0     0 REJECT     all      any    any     anywhere             anywhere             reject-with icmp6-port-unreachable

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

您的防火墙规则现已到位并保护您的Linode。请记住,如果您安装其他需要网络访问的软件包,则可能需要稍后编辑这些规则。

iptables-persistent简介

Ubuntu和Debian有一个名为iptables-persistent的软件包,可以在启动时轻松重新应用防火墙规则。安装后,您可以将所有规则保存在两个文件中(一个用于IPv4,一个用于IPv6)。如果您已经配置并应用了iptables规则,iptables-persistent将自动检测它们并允许您将它们添加到相应的配置文件中。

安装iptables-persistent

在Debian或Ubuntu上使用以下命令检查是否iptables-persistent已安装:

代码语言:javascript
复制
dpkg -l iptables-persistent

如果dpkg返回没有匹配的包,则需要安装iptables-persistent包:

代码语言:javascript
复制
apt-get install iptables-persistent

在安装过程中,系统会提示您两次。第一个提示是询问您是否要保存当前的IPv4规则。

第二个提示是保存为IPv6配置的规则。

安装完成后,您应该看到iptables的子目录。再次运行ls /etc/iptables命令以验证输出类似于以下内容:

代码语言:javascript
复制
rules.v4  rules.v6

使用iptables-persistent

要查看服务器上已配置的规则:

代码语言:javascript
复制
iptables -L

您应该看到类似的输出:

代码语言:javascript
复制
Chain INPUT (policy ACCEPT)
target      prot opt source         destination
DROP        all  --  198.51.100.0    anywhere

Chain FORWARD (policy ACCEPT)
target      prot opt source         destination

CHAIN OUTPUT (policy ACCEPT)
target      prot opt source         destination

上述规则允许任何人访问所有内容。如果您的输出类似于此,则需要设置防止未经授权访问的规则。

iptables-persistent规则

使用rules.v4rules.v6文件添加,删除或编辑服务器规则。可以使用文本编辑器编辑这些文件,以充当代理,NAT或防火墙。配置取决于服务器的要求以及所需的功能。以下是来自rules.v4rules.v6文件的文件摘录:

/etc/iptables/rules.v4

1 2 3 4 5 6

# Generated by iptables-save v1.4.14 on Wed Apr 2 13:24:27 2014 *security :INPUT ACCEPT [18483:1240117] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [17288:2887358] COMMIT

/etc/iptables/rules.v6

1 2 3 4 5 6 7

# Generated by ip6tables-save v1.4.14 on Wed Apr 2 13:24:27 2014 *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [27:2576] :POSTROUTING ACCEPT [27:2576] COMMIT

虽然已经在这些文件中配置了一些规则,但是可以随时编辑任一文件。更改表规则的语法与“ 配置iptables和配置IPv6规则”一节中的相同。

通过重启保存iptables-persistent规则

默认情况下,iptables-persistent规则仅在重新启动时保存IPv4。因此,如果同时运行IPv4和IPv6,则需要手动编辑rules.v4rules.v6文件。在较旧的系统上,iptables-save用于将更改写入rules文件。现在这iptables-persistent是一个选项,不要使用iptables-save > /etc/iptables/rules.v4iptables-save > /etc/iptables/rules.v6命令,因为任何IPv6更改都将被IPv4规则覆盖。

要强制执行iptables规则并确保它们在重新启动运行后仍然存在,dpkg-reconfigure并在出现提示时响应“ 是”。(如果您以后编辑过保存的规则,请使用相同的命令再次保存它们。)

代码语言:javascript
复制
dpkg-reconfigure iptables-persistent

要在系统重新引导后验证规则是否已应用并可用,请使用以下命令:

代码语言:javascript
复制
iptables -L
ip6tables -L

网络锁定

当您应用网络规则时,尤其是IPv4和IPv6以及多个接口时,很容易将自己锁定。如果您应用规则但无法访问您的服务器,您可以通过Linode管理器中的Lish获得访问权限。以下步骤将指导您使用Linode的图形界面来访问您的服务器:

  1. 连接到您的Linode管理器。
  2. 单击“远程访问”选项卡。
  3. 在标题为“控制台访问”的部分下,单击Launch Lish Console链接。
  4. 使用root或sudo用户名和密码登录。
  5. 删除导致连接问题的所有规则
  6. 退出Lish窗口。
  7. 尝试通过常规SSH会话登录。

此Lish控制台的功能与常规SSH终端会话类似。

故障排除:netfilter-persistent在重新启动时不会恢复。

如果您已从早期版本升级到Debian 8,您可能会看到在使用Linode内核时netfilter-persistent在启动期间无法启动的情况。控制台输出将显示类似于:

代码语言:javascript
复制
[FAILED] Failed to start Load Kernel Modules.
See 'systemctl status systemd-modules-load.service' for details.
[DEPEND] Dependency failed for netfilter persistent configuration

您还可以使用journalctl -xn以查看systemd无法加载loop模块:

代码语言:javascript
复制
systemd-modules-load[3452]: Failed to lookup alias 'loop': Function not implemented

为了解决这个问题,注释掉该行loop/etc/modules

代码语言:javascript
复制
sed -i 's/loop/#loop/g' /etc/modules

然后重启netfilter-persistent:

代码语言:javascript
复制
systemctl restart netfilter-persistent

它应该运行正常。确认:

代码语言:javascript
复制
systemctl status netfilter-persistent

在Debian 8的新部署中不会发生此问题,因为该loop行不存在于/etc/modules

更多信息

有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用Linux iptables管理IPv4流量
    • iptables命令
      • 基本iptables参数和语法
        • 默认表
          • 基本iptables选项
            • 插入,替换或删除iptables规则
              • 插入(Insert)
                • 查看您当前的iptables规则
                • 配置iptables
                  • 按端口阻止流量
                    • 从一个IP中删除流量
                      • 按端口号阻止或允许流量以创建iptables防火墙
                        • 按地址划分的白名单/黑名单流量
                        • 使用ip6tables管理IPv6流量
                          • 配置IPv6规则
                            • 非静态IPv6分配的必需规则
                            • 基本iptables IPv4和IPv6的规则集
                            • 部署您的iptables规则集
                              • Debian / Ubuntu
                                • CentOS / Fedora
                                  • Arch Linux
                                    • 验证iptables规则集
                                    • iptables-persistent简介
                                      • 安装iptables-persistent
                                        • 使用iptables-persistent
                                          • iptables-persistent规则
                                            • 通过重启保存iptables-persistent规则
                                            • 网络锁定
                                            • 故障排除:netfilter-persistent在重新启动时不会恢复。
                                            • 更多信息
                                            领券
                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档