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
上面的示例命令:
- 调用
iptables
程序 - 使用
-I
选项进行插入(insertion)。使用带有插入选项的规则会将其添加到链的开头,并将被率先应用。您还可以使用带-I
选项的数字来指定链中的特定位置。 -s
参数以及IP地址(198.51.100.0)表示源(source)。- 最后,
-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 -I
或ip6tables -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个数字中的两个,但相匹配的端口有8999
,9000
,9001
,9002
,和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地址范围,如第二个命令中所示。第三个命令允许与现有连接关联的所有传入和传出数据包。最后两个命令为所有INPUT
和FORWARD
链设置默认策略,丢弃所有数据包。
使用ip6tables管理IPv6流量
使用IPv6时,请记住iptables
命令是不兼容的。相反,有一个ip6tables
命令。附加,检查等选项是相同的。ip6tables使用的表是raw,security,mangle和filter。协议,源等参数是相同的。语法与IPv4基本相同。示例语法如下:
代码语言:javascript复制
ip6tables [-t table] -N chain
要查看为IPv6配置的规则,请使用以下命令:
代码语言:javascript复制
ip6tables -L
配置IPv6规则
ip6tables通过使用端口,黑名单的特定地址,协议等来工作。主要区别在于ip6tables可以使用带有-m
或match
选项的扩展数据包匹配模块,后跟模块名称。以下是一些扩展模块:
- 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配置防火墙。
- 创建文件
/tmp/v4
和/tmp/v6
。将上述规则集粘贴到各自的文件中。 - 立即使用以下命令导入规则集:
sudo iptables-restore < /tmp/v4 sudo ip6tables-restore < /tmp/v6
- 要在引导时自动应用iptables规则,请参阅有关配置iptables-persistent的部分。
CentOS / Fedora
CentOS 7或Fedora 20及以上版本
在这些发行版中,FirewallD用于实现防火墙规则,而不是使用iptables命令。如果您更喜欢在iptables上使用它,请参阅我们的指南:CentOS上的FirewallD简介。
- 如果您更喜欢使用iptables,必须首先停止并禁用FirewallD。
sudo systemctl stop firewalld.service && sudo systemctl disable firewalld.service
- 安装
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
- 创建文件
/tmp/v4
和/tmp/v6
。将上面的规则集粘贴到各自的文件中。 - 立即使用以下命令导入规则集:
sudo iptables-restore < /tmp/v4 sudo ip6tables-restore < /tmp/v6
- 保存每个规则集:
sudo service iptables save sudo service ip6tables save
- 删除临时规则文件:
sudo rm /tmp/{v4,v6}
CentOS 6
- 创建文件
/tmp/v4
和/tmp/v6
。将上面的规则集粘贴到各自的文件中。 - 从临时文件导入规则:
sudo iptables-restore < /tmp/v4 sudo ip6tables-restore < /tmp/v6
- 保存规则:
sudo service iptables save sudo service ip6tables save
注意防火墙规则保存到/etc/sysconfig/iptables
和/etc/sysconfig/ip6tables
。 - 删除临时规则文件:
sudo rm /tmp/{v4,v6}
Arch Linux
- 创建文件
/etc/iptables/iptables.rules
和/etc/iptables/ip6tables.rules
。将上面的规则集粘贴到各自的文件中。 - 立即使用以下命令导入规则集:
sudo iptables-restore < /etc/iptables/iptables.rules sudo ip6tables-restore < /etc/iptables/ip6tables.rules
- 默认情况下,在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.v4
或rules.v6
文件添加,删除或编辑服务器规则。可以使用文本编辑器编辑这些文件,以充当代理,NAT或防火墙。配置取决于服务器的要求以及所需的功能。以下是来自rules.v4
和rules.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.v4
和rules.v6
文件。在较旧的系统上,iptables-save
用于将更改写入rules
文件。现在这iptables-persistent
是一个选项,不要使用iptables-save > /etc/iptables/rules.v4
或iptables-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的图形界面来访问您的服务器:
- 连接到您的Linode管理器。
- 单击“远程访问”选项卡。
- 在标题为“控制台访问”的部分下,单击Launch Lish Console链接。
- 使用root或sudo用户名和密码登录。
- 删除导致连接问题的所有规则。
- 退出Lish窗口。
- 尝试通过常规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防火墙