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

2018-08-30 16:36:06 浏览数 (1)

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 Longview或Linode的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

更多信息

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

  • 安全基础知识
  • 使用Linode Shell(Lish)
  • iptables:基本Web服务器的Linux防火墙规则
  • 带有iptables的Linux防火墙
bashbash 指令ipv6tcp/ip网络安全bashbash 指令ipv6tcp/ip网络安全

0 人点赞