linux防火墙如何配置?一看就会的iptables防火墙新手教程
作者:互联网
对于一名合格的网络人员来说,自己服务器的安全与否是一个很重要的问题。虽然现在普遍都在使用高防服务器,但是众所周知,高防的成本很高,并且很多攻击尤其是渗透劫持都不是高防能解决的,因此我们就要依靠服务器的基本防火墙来进行这些攻击。今天icode9小编给大家带来保姆级的iptables防火墙教程,大家一起来看看吧。
本文适用于不了解网络或特别是iptables命令的用户。
1 $ 人iptables
2
3 概要
4 iptables [-t table] {-A|-C|-D} 链规则规范
5
6 规则规范= [匹配...] [目标]
7
8 match = -m matchname [每个匹配选项]
9
10 target = -j targetname [每个目标选项]
11
12 描述
13 iptables 和 ip6tables 用于在Linux 内核中建立、维护和检查 IPv4 和 IPv6 包过滤规则表。可以定义几个不同的表。每个表包含许多内置链,也可能
14 包含用户定义的链。
15
16 每个链都是可以匹配一组数据包的规则列表。每个规则指定如何处理匹配的数据包。这称为“目标”,它可能是跳转到同一表中的用户定义链。
17
18 目标
19 防火墙规则指定数据包和目标的标准。如果数据包不匹配,则检查链中的下一条规则;如果匹配,则下一条规则由目标的值指定,该目标可以是
20 用户定义的链,在iptables-extensions(8) 中描述的目标之一,或者特殊值 ACCEPT、DROP 或 RETURN 之一。
21
22 ACCEPT 表示让数据包通过。DROP 表示将数据包丢弃在地板上。RETURN 表示停止遍历此链并在前一个(调用)链中的下一个规则处继续。如果到达内置链的末尾或规则
23 在与目标 RETURN 匹配的内置链中,链策略指定的目标决定了数据包的命运。
24
25 桌子
26 目前有五个独立的表(哪些表随时存在取决于内核配置选项和存在哪些模块)。
27
28 -t , --table表
29 此选项指定命令应操作的数据包匹配表。如果内核配置了自动模块加载,则将尝试为该表加载适当的模块,如果它不是al-
30 准备好了。
31
32 表格如下:
33
34 筛选:
35 这是默认表(如果未传递-t选项)。它包含内置链 INPUT(用于发往本地套接字的数据包)、FORWARD(用于通过盒子路由的数据包)和 OUTPUT(用于本地生成的数据包)。
36
37 纳特:
38 当遇到创建新连接的数据包时,将查询此表。它由四个内置函数组成:PREROUTING(用于在数据包进入时立即更改数据包)、INPUT(用于更改发往本地sock的数据包)
39 ets)、OUTPUT(用于在路由之前更改本地生成的数据包)和 POSTROUTING(用于更改即将发送的数据包)。IPv6 NAT 支持从内核3 .7 开始可用。
40
41 粉碎:
42 该表用于专门的数据包更改。在内核2 .4.17 之前,它有两个内置链:PREROUTING(用于在路由之前更改传入的数据包)和 OUTPUT(用于在路由之前更改本地生成的数据包)。
43 从内核 2 .4.18 开始,还支持其他三个内置链:INPUT(用于进入盒子本身的数据包)、FORWARD(用于改变通过盒子路由的数据包)和 POSTROUTING(用于改变数据包,因为它们是
44 即将出门)。
45
46 生的:
47 该表主要用于结合NOTRACK 目标配置连接跟踪豁免。它以更高的优先级在 netfilter 挂钩上注册,因此在 ip_conntrack 或任何其他挂钩之前被调用
48 IP 表。它提供以下内置链: PREROUTING(用于通过任何网络接口到达的数据包) OUTPUT(用于本地进程生成的数据包)
49
50 安全:
51 此表用于强制访问控制 (MAC) 网络规则,例如由 SECMARK 和 CONNSECMARK 目标启用的规则。强制访问控制由 SELinux 等 Linux 安全模块实现。安全的
52 rity 表在过滤表之后被调用,允许过滤表中的任意自主访问控制 (DAC) 规则在MAC 规则之前生效。此表提供以下内置链: INPUT(用于来自
53 进入盒子本身),OUTPUT(用于在路由之前更改本地生成的数据包)和 FORWARD(用于更改通过盒子路由的数据包)。
54
55
1 $ python3 -m http.server
2 在0 .0.0.0 端口8000 (http://0.0.0.0:8000/)上提供 HTTP ...
3
1 $ sudo iptables -A INPUT -p tcp --dport 8000 -j DROP
2
3 # 检查与端口的连通性
4 $ 远程登录 本地主机8000
5 正在尝试127 .0.0.1...
6 telnet:无法连接到远程主机:连接超时
7
8 $ curl -v http://localhost:8000
9 * 尝试127 .0.0.1:8000...
10 * 尝试 ::1:8000...
11 * 连接到 ::1 端口8000失败:连接被拒绝
12
13
1 $ sudo iptables -S |grep DROP
2 -A输入-p tcp -m tcp --dport 8000 -j DROP
3
4 # 我们也可以只列出 INPUT 链的输出
5 $ sudo iptables -L输入-v -n
6 Chain INPUT(策略接受0个数据包,0字节)
7 pkts bytes target prot opt in out 源 目的地
8 33 1980下降 tcp -- * * 0 .0.0.0/0 0 .0.0.0/0 tcp dpt:8000
9
10 # 没有 -n 开关
11 $ sudo iptables -L输入-v
12 Chain INPUT(策略接受0个数据包,0字节)
13 pkts bytes target prot opt in out 源 目的地
14 33 1980 DROP tcp -- 任何任何地方任何地方 tcp dpt:8000
15
16 # 没有冗长的选项
17 $ sudo iptables -L输入-n
18 链输入(策略接受)
19 目标保护选择源 目的地
20 丢弃 tcp -- 0 .0.0.0/0 0 .0.0.0/0 tcp dpt:8000
21
22
1 $ sudo iptables -L --行号
2 链输入(策略接受)
3 num target prot opt源 目的地
4 1 DROP tcp -- 任何地方 tcp dpt:8000
5
6 链 FORWARD(策略 DROP)
7 num target prot opt源 目的地
8 1 DOCKER-USER all -- 任何地方
9 2 DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
10 3 ACCEPT all -- anywhere anywhere ctstate RELATED, ESTABLISHED
11
1 # 删除 INPUT 链的第一条规则。
2 $ sudo iptables -D输入1
3
4 # 再次检查连通性。
5 $ 远程登录本地主机8000
6 正在尝试127 .0.0.1...
7 连接到本地主机。
8 转义字符是'^]'。
9
10 $ curl -s -D - -o /dev/null http://localhost:8000
11 HTTP/1.0 200正常
12 服务器:SimpleHTTP/0.6 Python/3.10.6
13 日期:2023年 1 月14日星期六02:07:12 GMT
14 内容类型:文本/html;字符集= utf-8
15 内容长度:2571
16
17
9. 我们还可以通过使用 -D 开关指定完整规则来删除规则。
壳
1$ sudo iptables -A INPUT -p tcp --dport 8000 -j DROP
2
3$ sudo iptables -S |grep 输入
4-A输入-p tcp -m tcp --dport 8000 -j DROP
5
6$ sudo iptables -D INPUT -p tcp -m tcp --dport 8000 -j DROP
7
8$ curl -s -D - -o /dev/null http://localhost:8000
9HTTP/1.0 200正常
10服务器:SimpleHTTP/0.6 Python/3.10.6
11日期:2023年 1 月14日星期六02:13:39 GMT
12内容类型:文本/html;字符集= utf-8
13内容长度:2571
这就是本文的内容。我希望本文能帮助您对 iptables 命令有一个基本的了解。
本文适用于不了解网络或特别是iptables命令的用户。
1. 首先让我们对iptables命令有一个基本的了解。它是适用于 Linux 操作系统的标准防火墙。此命令(带有 t 开关)可以修改任何网络表过滤器、nat、mangle、raw 和security。
这里的filter是默认的表(如果没有传递-t选项的话);它用于数据包过滤。它包含内置链 INPUT(用于发往本地套接字的数据包)、FORWARD(用于通过盒子路由的数据包)和 OUTPUT(用于本地生成的数据包)。
壳1 $ 人iptables
2
3 概要
4 iptables [-t table] {-A|-C|-D} 链规则规范
5
6 规则规范= [匹配...] [目标]
7
8 match = -m matchname [每个匹配选项]
9
10 target = -j targetname [每个目标选项]
11
12 描述
13 iptables 和 ip6tables 用于在Linux 内核中建立、维护和检查 IPv4 和 IPv6 包过滤规则表。可以定义几个不同的表。每个表包含许多内置链,也可能
14 包含用户定义的链。
15
16 每个链都是可以匹配一组数据包的规则列表。每个规则指定如何处理匹配的数据包。这称为“目标”,它可能是跳转到同一表中的用户定义链。
17
18 目标
19 防火墙规则指定数据包和目标的标准。如果数据包不匹配,则检查链中的下一条规则;如果匹配,则下一条规则由目标的值指定,该目标可以是
20 用户定义的链,在iptables-extensions(8) 中描述的目标之一,或者特殊值 ACCEPT、DROP 或 RETURN 之一。
21
22 ACCEPT 表示让数据包通过。DROP 表示将数据包丢弃在地板上。RETURN 表示停止遍历此链并在前一个(调用)链中的下一个规则处继续。如果到达内置链的末尾或规则
23 在与目标 RETURN 匹配的内置链中,链策略指定的目标决定了数据包的命运。
24
25 桌子
26 目前有五个独立的表(哪些表随时存在取决于内核配置选项和存在哪些模块)。
27
28 -t , --table表
29 此选项指定命令应操作的数据包匹配表。如果内核配置了自动模块加载,则将尝试为该表加载适当的模块,如果它不是al-
30 准备好了。
31
32 表格如下:
33
34 筛选:
35 这是默认表(如果未传递-t选项)。它包含内置链 INPUT(用于发往本地套接字的数据包)、FORWARD(用于通过盒子路由的数据包)和 OUTPUT(用于本地生成的数据包)。
36
37 纳特:
38 当遇到创建新连接的数据包时,将查询此表。它由四个内置函数组成:PREROUTING(用于在数据包进入时立即更改数据包)、INPUT(用于更改发往本地sock的数据包)
39 ets)、OUTPUT(用于在路由之前更改本地生成的数据包)和 POSTROUTING(用于更改即将发送的数据包)。IPv6 NAT 支持从内核3 .7 开始可用。
40
41 粉碎:
42 该表用于专门的数据包更改。在内核2 .4.17 之前,它有两个内置链:PREROUTING(用于在路由之前更改传入的数据包)和 OUTPUT(用于在路由之前更改本地生成的数据包)。
43 从内核 2 .4.18 开始,还支持其他三个内置链:INPUT(用于进入盒子本身的数据包)、FORWARD(用于改变通过盒子路由的数据包)和 POSTROUTING(用于改变数据包,因为它们是
44 即将出门)。
45
46 生的:
47 该表主要用于结合NOTRACK 目标配置连接跟踪豁免。它以更高的优先级在 netfilter 挂钩上注册,因此在 ip_conntrack 或任何其他挂钩之前被调用
48 IP 表。它提供以下内置链: PREROUTING(用于通过任何网络接口到达的数据包) OUTPUT(用于本地进程生成的数据包)
49
50 安全:
51 此表用于强制访问控制 (MAC) 网络规则,例如由 SECMARK 和 CONNSECMARK 目标启用的规则。强制访问控制由 SELinux 等 Linux 安全模块实现。安全的
52 rity 表在过滤表之后被调用,允许过滤表中的任意自主访问控制 (DAC) 规则在MAC 规则之前生效。此表提供以下内置链: INPUT(用于来自
53 进入盒子本身),OUTPUT(用于在路由之前更改本地生成的数据包)和 FORWARD(用于更改通过盒子路由的数据包)。
54
55
2. 让我们使用python实用程序启动一个基本的HTTP 服务器 。壳
1 $ python3 -m http.server
2 在0 .0.0.0 端口8000 (http://0.0.0.0:8000/)上提供 HTTP ...
3
3. 我们如何使用 iptables 命令列出防火墙规则。
$ sudo iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# Explanation of switch used
-v, --verbose
Verbose output.
-n, --numeric
Numeric output. IP addresses and port numbers will be printed in numeric format. By default, the program will try to dis‐
play them as host names, network names, or services (whenever applicable).
-L, --list [chain]
List all rules in the selected chain.
4. 访问 HTTP 服务器侦听我们开始使用 python 实用程序的 8000 端口。
$ curl -s -D - -o /dev/null http://localhost:8000
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.6
Date: Sat, 14 Jan 2023 01:28:02 GMT
Content-type: text/html; charset=utf-8
Content-Length: 2571
Note:
-s hides the progress bar
-D - dump headers to stdout indicated by -
-o /dev/null send output (HTML) to /dev/null essentially ignoring it
# In http server, we can see GET entry.
$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
127.0.0.1 - - [14/Jan/2023 06:00:37] "GET / HTTP/1.1" 200 -
5. 阻止或丢弃到 8000 端口的传入流量。
壳1 $ sudo iptables -A INPUT -p tcp --dport 8000 -j DROP
2
3 # 检查与端口的连通性
4 $ 远程登录 本地主机8000
5 正在尝试127 .0.0.1...
6 telnet:无法连接到远程主机:连接超时
7
8 $ curl -v http://localhost:8000
9 * 尝试127 .0.0.1:8000...
10 * 尝试 ::1:8000...
11 * 连接到 ::1 端口8000失败:连接被拒绝
12
13
6. 我们可以再次查看规则列表。但是,switch -S 为我们提供了一种方便的方式来列出规则。使用此开关,我们可以看到与应用规则相同格式的规则。这将有助于我们重用规则。壳
1 $ sudo iptables -S |grep DROP
2 -A输入-p tcp -m tcp --dport 8000 -j DROP
3
4 # 我们也可以只列出 INPUT 链的输出
5 $ sudo iptables -L输入-v -n
6 Chain INPUT(策略接受0个数据包,0字节)
7 pkts bytes target prot opt in out 源 目的地
8 33 1980下降 tcp -- * * 0 .0.0.0/0 0 .0.0.0/0 tcp dpt:8000
9
10 # 没有 -n 开关
11 $ sudo iptables -L输入-v
12 Chain INPUT(策略接受0个数据包,0字节)
13 pkts bytes target prot opt in out 源 目的地
14 33 1980 DROP tcp -- 任何任何地方任何地方 tcp dpt:8000
15
16 # 没有冗长的选项
17 $ sudo iptables -L输入-n
18 链输入(策略接受)
19 目标保护选择源 目的地
20 丢弃 tcp -- 0 .0.0.0/0 0 .0.0.0/0 tcp dpt:8000
21
22
7.我们也可以列出带有行号的规则;这在删除特定规则时特别有用。壳
1 $ sudo iptables -L --行号
2 链输入(策略接受)
3 num target prot opt源 目的地
4 1 DROP tcp -- 任何地方 tcp dpt:8000
5
6 链 FORWARD(策略 DROP)
7 num target prot opt源 目的地
8 1 DOCKER-USER all -- 任何地方
9 2 DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
10 3 ACCEPT all -- anywhere anywhere ctstate RELATED, ESTABLISHED
11
8. 删除规则。壳
1 # 删除 INPUT 链的第一条规则。
2 $ sudo iptables -D输入1
3
4 # 再次检查连通性。
5 $ 远程登录本地主机8000
6 正在尝试127 .0.0.1...
7 连接到本地主机。
8 转义字符是'^]'。
9
10 $ curl -s -D - -o /dev/null http://localhost:8000
11 HTTP/1.0 200正常
12 服务器:SimpleHTTP/0.6 Python/3.10.6
13 日期:2023年 1 月14日星期六02:07:12 GMT
14 内容类型:文本/html;字符集= utf-8
15 内容长度:2571
16
17
9. 我们还可以通过使用 -D 开关指定完整规则来删除规则。
壳
1$ sudo iptables -A INPUT -p tcp --dport 8000 -j DROP
2
3$ sudo iptables -S |grep 输入
4-A输入-p tcp -m tcp --dport 8000 -j DROP
5
6$ sudo iptables -D INPUT -p tcp -m tcp --dport 8000 -j DROP
7
8$ curl -s -D - -o /dev/null http://localhost:8000
9HTTP/1.0 200正常
10服务器:SimpleHTTP/0.6 Python/3.10.6
11日期:2023年 1 月14日星期六02:13:39 GMT
12内容类型:文本/html;字符集= utf-8
13内容长度:2571
这就是本文的内容。我希望本文能帮助您对 iptables 命令有一个基本的了解。