安装iptables-services
yum install iptables-services -y
查看启动的内核模块
lsmod|egrep 'filter|nat|iptable'
加载需要的模块
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
检查
[root@oradb ~]# lsmod|egrep 'filter|nat|iptable'
nf_nat_ftp 12809
nf_conntrack_ftp 18478
iptable_nat 12875
nf_nat_ipv4 14115
nf_nat 26583
nf_conntrack 139264
iptable_filter 12810
ip_tables 27126
libcrc32c 12644
关闭防火墙,开启iptables
# 关闭防火墙
[root@controller ~]# systemctl stop firewalld
[root@controller ~]# systemctl disable firewalld
# 开启iptables
[root@controller ~]# systemctl start iptables.service
[root@controller ~]# systemctl enable iptables.service
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
查询配置
[root@controller ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain neutron-filter-top (0 references)
target prot opt source destination
Chain neutron-linuxbri-FORWARD (0 references)
target prot opt source destination
Chain neutron-linuxbri-INPUT (0 references)
target prot opt source destination
Chain neutron-linuxbri-OUTPUT (0 references)
target prot opt source destination
Chain neutron-linuxbri-local (0 references)
target prot opt source destination
Chain neutron-linuxbri-sg-chain (0 references)
target prot opt source destination
Chain neutron-linuxbri-sg-fallback (0 references)
target prot opt source destination
这个命令(iptables -nL
)的输出确实可以看作是一个大致的过程描述,但它描述的是 iptables 防火墙的配置,而不是实际的流量处理过程。然而,通过查看这些配置,你可以对流量如何处理有一个大致的了解。
当你运行 iptables -nL
时,你看到的是 iptables 中各个链和规则的静态快照。这些链和规则定义了当特定类型的数据包到达时,iptables 应该采取什么行动。这些行动可能包括接受(ACCEPT)数据包、丢弃(DROP)数据包、拒绝(REJECT)数据包(通常向发送方发送一个错误消息),或者将数据包跳转到另一个链进行进一步处理。
要理解这个过程,你需要想象数据包是如何在 iptables 中流动的。当数据包到达网络接口时,iptables 会根据数据包的特性(如源地址、目的地址、协议类型等)来决定它应该进入哪个链。然后,iptables 会检查该链中的规则,看是否有任何规则与数据包匹配。
- 如果找到匹配的规则,iptables 会根据规则指定的行动来处理数据包。
- 如果没有找到匹配的规则,iptables 会根据链的默认策略来处理数据包。
这个过程是动态的,因为数据包是实时到达的,而 iptables 会根据当前的配置来实时处理它们。但是,iptables -nL
命令的输出是静态的,它只展示了 iptables 在你运行命令那一刻的配置。
因此,虽然 iptables -nL
的输出不是流量处理过程的实时描述,但它确实提供了一个关于 iptables 如何配置以及它可能会如何处理流量的有用快照。要理解实际的流量处理过程,你需要结合这个输出和你对 iptables 工作原理的理解。
在iptables
输出中,我们看到了几个链(chains),这些链是 Linux 内核防火墙(iptables)用来过滤和处理网络数据包的一部分。每个链都有一组规则(rules),这些规则定义了如何处理经过该链的数据包。在这个例子中,我们主要关注的是默认的链(INPUT, FORWARD, OUTPUT)和与 Neutron(一个用于OpenStack的网络服务组件)相关的自定义链。
默认链
- INPUT 链:处理进入本机的数据包。
- FORWARD 链:处理经过本机转发的数据包(即不是发往本机也不是由本机发出的数据包)。
- OUTPUT 链:处理由本机发出的数据包。
在您的输出中,这些链的策略(policy)都被设置为 ACCEPT
,意味着默认情况下,所有经过这些链的数据包都会被允许通过。
Neutron 相关的链
Neutron 在 OpenStack 中负责网络服务,它可能会配置一些自定义的 iptables 链来处理与虚拟网络相关的流量。这些链通常用于实现安全组(security groups)和其他网络策略。
- neutron-filter-top:这个链可能是一个顶层链,用于在数据包进入其他 Neutron 特定的链之前进行预处理。在这个例子中,它是空的,没有规则。
-
neutron-linuxbri-*:这些链与 Neutron 的 Linux Bridge 插件相关。Linux Bridge 是 Neutron 用来连接虚拟机(VMs)和物理网络的一种方法。这些链可能包含用于实现安全组、网络隔离等功能的规则。
- neutron-linuxbri-FORWARD:处理经过 Linux Bridge 转发的数据包。
- neutron-linuxbri-INPUT:处理进入 Linux Bridge 的数据包(可能是从物理网络到虚拟机的数据包)。
- neutron-linuxbri-OUTPUT:处理从 Linux Bridge 发出的数据包(可能是从虚拟机到物理网络的数据包)。
- neutron-linuxbri-local:可能用于处理在本地主机上循环的数据包(即源地址和目的地址都在同一台主机上的数据包)。
-
neutron-linuxbri-sg-chain 和 neutron-linuxbri-sg-fallback:这些链与安全组规则的实现相关。
sg-chain
链可能包含根据安全组规则允许或拒绝数据包的规则,而sg-fallback
链可能是在sg-chain
链中没有找到匹配规则时的备选处理链。
举例子
假设我们有一个虚拟机(VM1)通过 Neutron 的 Linux Bridge 连接到物理网络。现在,有一个来自物理网络的数据包(来自 IP 地址 192.168.1.100
)想要访问 VM1(IP 地址为 10.0.0.2
)。
- 数据包首先会到达本机的 INPUT 链,但由于它是发往 VM1 的,不是发往本机的,所以 INPUT 链不会处理它(除非有特定的规则)。
- 数据包随后会被转发到 Linux Bridge(因为 Neutron 配置了相应的路由和桥接)。
- 在 Linux Bridge 上,数据包会进入
neutron-linuxbri-FORWARD
链。 -
neutron-linuxbri-FORWARD
链可能会检查安全组规则(通过neutron-linuxbri-sg-chain
链),以决定是否允许数据包继续转发到 VM1。 - 如果安全组规则允许数据包通过,数据包最终会被转发到 VM1。
- 如果 VM1 响应这个数据包,响应数据包会经过
neutron-linuxbri-OUTPUT
链,然后可能被发送到物理网络。
请注意,这个例子是为了解释而简化的,实际的流量处理过程可能更加复杂,具体取决于 Neutron 的配置和安全组规则。
清空访问规则
[root@controller ~]# iptables -F
# 清除所有规则,但不会清楚默认规则
禁止访问80端口
[root@hm-master ~]# iptables -A INPUT -p tcp --dport 80 -j DROP
# -A 添加一条规则,指定作用链
# -p tcp 指定端口还是ip(端口 要先指定协议[协议:tcp udp icmp all(所有)])
# 端口在网络中一般由两种情况,ip也是有两种情况,就是目标端口,源端口,目标ip,源ip
# --dport 目标端口, -d 目标ip --sport源端口
# 禁止访问80端口,也就是说 端口80 是目标端口,所以用-dport 80
# - j DROP 禁止访问 DROP要大写 ACCEPT、DROP、REJECT
–dport 选项
在 iptables 的帮助信息中,并没有直接列出 --dport 选项,这是因为 --dport 是作为 --match 或特定协议(如 TCP)的隐含选项存在的。当你指定 -p tcp(或 UDP 等其他协议)时,iptables 允许你使用与该协议相关的特定选项,如 --dport(目的端口)和 --sport(源端口)。
这些选项并不是 iptables 命令本身的直接参数,而是由协议匹配模块(如 tcp 模块)提供的。当你运行如 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 这样的命令时,iptables 会解析 -p tcp 并知道 TCP 协议匹配模块支持 --dport 和 --sport 等选项。
因此,虽然帮助信息中没有直接列出 --dport,你仍然可以在使用 TCP 或 UDP 协议时指定它,因为 iptables 会根据上下文理解这些选项的含义。
在 iptables
命令中,--dport 80
用于指定目的端口号为80,通常用于允许或阻止HTTP流量。-d
或 --destination
选项用于指定目的地址。除了这两个选项外,iptables
还支持许多其他选项和参数,用于构建更复杂的防火墙规则。
以下是一些可以与 --dport 80
和 -d
一起使用的其他选项和参数的示例:
-
源地址 (
-s
或--source
):- 用于指定源IP地址或地址范围。
- 示例:
-s 192.168.1.0/24
表示允许来自192.168.1.0/24子网的流量。
-
协议 (
-p
):- 虽然你已经指定了TCP协议(通过
--dport
隐含指定),但也可以明确指定-p tcp
。 - 示例:
-p tcp
。
- 虽然你已经指定了TCP协议(通过
-
网络接口 (
-i
或--in-interface
和-o
或--out-interface
):- 用于指定入站和出站网络接口。
- 示例:
-i eth0
表示流量必须通过eth0接口进入。
-
动作 (
-j
或--jump
):- 用于指定匹配规则后采取的动作,如ACCEPT、DROP、REJECT等。
- 示例:
-j ACCEPT
表示允许匹配的流量。
-
日志记录 (
--log-prefix
和--log-level
):- 用于记录匹配的流量到系统日志中。
- 示例:
--log-prefix "HTTP traffic: " --log-level 4
。
-
状态匹配 (
-m state
):- 用于基于连接状态(如NEW、ESTABLISHED、RELATED)进行匹配。
- 示例:
-m state --state NEW,ESTABLISHED
。
-
其他匹配模块:
-
iptables
支持许多其他匹配模块,如地址范围匹配(-m iprange
)、MAC地址匹配(-m mac
)、时间匹配(-m time
)等。 - 示例:使用地址范围匹配
-m iprange --src-range 192.168.1.10-192.168.1.20
。
-
-
扩展选项:
- 某些匹配模块和动作可能支持额外的选项。
- 示例:对于REJECT动作,可以使用
--reject-with
选项指定拒绝类型(如icmp-port-unreachable)。
请注意,以上选项和参数并不是全部,iptables
提供了非常灵活和强大的防火墙配置能力。在实际使用中,你需要根据具体的安全需求和网络环境来选择合适的选项和参数。
此外,构建 iptables
规则时,建议首先使用临时规则进行测试,确保它们按预期工作,然后再将它们保存到防火墙配置中。这可以通过不保存配置直接运行命令来实现,或者使用 --temporary
选项(如果可用)来添加临时规则。
删除规则
[root@hm-master ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
6 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@hm-master ~]# iptables -D INPUT 6
[root@hm-master ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
禁止指定ip,访问本服务器指定端口
禁止指定ip,访问本服务器指定端口
禁止10.0.0.12 访问服务器的80端口
[root@hm-master ~]# iptables -I INPUT -s 10.0.0.12 -p tcp --dport 80 -j DROP
[root@hm-master ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 10.0.0.12 0.0.0.0/0 tcp dpt:80
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
这个 iptables
命令用于在 Linux 系统的防火墙规则中添加一条新的规则,以丢弃(DROP)来自特定源 IP 地址且目标端口为 80(HTTP)的 TCP 流量。下面是命令的详细解释:
-
iptables
:这是用于配置 Linux 内核防火墙的工具。 -
-I INPUT
:-I
是--insert
的简写,表示将规则插入到指定的链中。在这里,INPUT
链用于处理进入本机的数据包。因此,这条规则将被添加到处理进入数据包的链中。 -
-s 10.0.0.12
:-s
是--source
的简写,用于指定源 IP 地址。在这个例子中,源 IP 地址被设置为10.0.0.12
。这意味着只有来自这个 IP 地址的数据包才会被这条规则匹配。 -
-p tcp
:-p
是--protocol
的简写,用于指定数据包所使用的协议。在这里,协议被设置为tcp
,表示这条规则仅适用于 TCP 协议的数据包。 -
--dport 80
:--dport
用于指定目的端口号。在这个例子中,目的端口号被设置为 80,这是 HTTP 服务的标准端口。因此,这条规则将匹配目标端口为 80 的 TCP 数据包。 -
-j DROP
:-j
是--jump
的简写,用于指定匹配规则后采取的动作。在这里,动作被设置为DROP
,表示丢弃匹配的数据包。这意味着来自10.0.0.12
且目标端口为 80 的 TCP 数据包将被防火墙丢弃,不会到达本机上的任何服务。
综上所述,这条 iptables
命令的作用是:阻止来自 IP 地址 10.0.0.12
的设备通过 TCP 协议访问本机上的 HTTP 服务(端口 80)。这样的规则通常用于阻止不受信任的 IP 地址访问特定的服务。
指定只能某个网段访问本服务器
指定只能某个网段访问本服务器(不是指定网段都拒绝掉)
[root@hm-master ~]# iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
# ! 取反
# 10.0.0.0/24 是一个 CIDR 表示法的 IP 地址范围,表示从 10.0.0.1 到 10.0.0.254 的所有 IP 地址(包括网络地址 10.0.0.0 和广播地址 10.0.0.255,但这两个地址在大多数情况下不会被用作源地址)。因此,! -s 10.0.0.0/24 的意思是“不是来自 10.0.0.0/24 子网的”
# j DROP 表示 丢弃 不给予回应
使用iptables实现禁止ping功能
ping 使用的是icmp协议,ping命令使用了ICMP(Internet Control Message Protocol,互联网控制消息协议)中的echo-request类型消息。
ICMP是一种网络协议,用于在IP主机、路由器之间传递控制消息,这些消息包括网络是否通畅、主机是否可达等。ICMP消息被封装在IP数据包中进行传输。其中,echo-request和echo-reply是ICMP协议中用于测试网络连接可达性和延迟的两种消息类型。
当使用ping命令时,它会发送一个ICMP echo-request消息到目标主机,并等待目标主机的ICMP echo-reply消息作为回应。通过这个过程,源主机可以确定目标主机是否可达以及往返时间,这对于网络故障排除和性能监测非常有用。
因此,可以说ping命令是基于ICMP协议中的echo-request类型消息来实现的,但ping命令本身并不是一种协议,而是一种网络工具或命令。
[root@hm-master ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 或者
[root@hm-master ~]# iptables -A INPUT -p icmp --icmp-type any -j DROP
这两个 iptables
命令都涉及到 ICMP(Internet Control Message Protocol,互联网控制消息协议)数据包的处理,但它们在防火墙规则的应用方式和目标上有所不同。
-
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
-
-A INPUT
:-A
是--append
的简写,表示将规则追加到INPUT
链的末尾。 -
-p icmp
:指定协议为 ICMP。 -
--icmp-type echo-request
:指定 ICMP 消息类型为 echo-request,这通常对应于 ping 请求。 -
-j DROP
:匹配的数据包将被丢弃。
这条命令的作用是:丢弃所有进入本机的 ICMP echo-request 数据包,即阻止外部设备对本机进行 ping 操作。
-
-
iptables -I INPUT -p icmp --icmp-type any -j DROP
-
-I INPUT
:-I
是--insert
的简写,表示将规则插入到INPUT
链的开头。 -
-p icmp
:同样指定协议为 ICMP。 -
--icmp-type any
:指定 ICMP 消息类型为任意类型。 -
-j DROP
:匹配的数据包也将被丢弃。
这条命令的作用是:丢弃所有进入本机的 ICMP 数据包,无论其类型为何。这实际上会阻止所有 ICMP 相关的通信,包括但不限于 ping 请求、目的地不可达消息、时间超过消息等。
-
保存和恢复规则
iptables-save会保存当前防火请到配置文件中,加上重定向,可以将防火墙规则导入到指定文件中备份起来
iptables-save会把所有的打印出来*
后面显示表的名字:
后面是默认规则
再往下就是自己配置的规则
[root@hm-master ~]# iptables-save > lll.txt
[root@hm-master ~]# vi lll.txt
# Generated by iptables-save v1.4.21 on Wed Oct 9 07:33:39 2024
*nat
:PREROUTING ACCEPT [145:24560]
:INPUT ACCEPT [13:2324]
:OUTPUT ACCEPT [22:1759]
:POSTROUTING ACCEPT [22:1759]
COMMIT
# Completed on Wed Oct 9 07:33:39 2024
# Generated by iptables-save v1.4.21 on Wed Oct 9 07:33:39 2024
*filter
:INPUT ACCEPT [273:48037]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [75:6536]
-A INPUT -p icmp -m icmp --icmp-type any -j DROP
COMMIT
# Completed on Wed Oct 9 07:33:39 2024
# 实际保存的是如下文件
[root@hm-master ~]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@hm-master ~]# iptables -F
[root@hm-master ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@hm-master ~]# systemctl restart iptables
[root@hm-master ~]# iptables-restore < lll.txt
[root@hm-master ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 255
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@hm-master ~]# # 这条命令会清空iptables的规则
[root@hm-master ~]# systemctl restart iptables.service
[root@hm-master ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
修改默认规则为drop,默认都不接受的做法
# 防止ssh掉了
[root@hm-master ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# 设置本地lo网卡 通讯规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#INPUT 链:
使用 -i 选项来指定数据包进入本机的网络接口。
#OUTPUT 链:
OUTPUT 链处理的是从本机发出的数据包。
对于 OUTPUT 链,你通常使用 -o 选项来指定数据包离开本机的网络接口,而不是 -i。
[root@hm-master ~]# iptables -I INPUT -p tcp --dport 20,21,22,80,443 -j ACCEPT
iptables v1.4.21: invalid port/service `20,21,22,80,443' specified
Try `iptables -h' or 'iptables --help' for more information.
[root@hm-master ~]# iptables -I INPUT -p tcp -m --dport 20,21,22,80,443 -j ACCEPT
iptables v1.4.21: Couldn't load match `--dport':No such file or directory
Try `iptables -h' or 'iptables --help' for more information.
[root@hm-master ~]# iptables -I INPUT -p tcp -m multiport --dport 20,21,22,80,443 -j ACCEPT
# 自定多个端口
# -m参数指定扩展模块,通过multiport参数就可以同时指定多个不连续的端口号
# 修改默认规则
[root@hm-master ~]#
[root@hm-master ~]# iptables -P INPUT DROP
[root@hm-master ~]# iptables -P FORWARD DROP
[root@hm-master ~]# iptables -P OUTPUT ACCEPT
[root@hm-master ~]# iptables -nL
Chain INPUT (policy DROP) # 默认 DROP
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 20,21,22,80,443
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP) # 默认 DROP
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)# 默认 ACCEPT
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
添加白名单
# 添加ip白名单
[root@hm-master ~]# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
# 添加端口白名单
[root@hm-master ~]# iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# 添加ip和端口白名单
限速limit
iptables -I INPUT -p tcp --dport 8080 -m limit --limit-burst=1000 -j ACCEPT
这条规则是:8080端口会对包的速率做匹配,也就是每秒只处理500个包,假如某一时刻进来700个包,只处理500个包,后面ACCEPT表示放行,也就是这500个包放行。
剩下的200个包不做处理,交给下一个规则处理。
初始的burst值是1000,表示刚开始1000个包不受500/s速率限制,当减为0时,就受500/s速率限制。
上面描述可能有问题,应该这样理解,这一条规则看作一个池子,里有1000个令牌,有数据流量进来先从池里取令牌,
取到令牌:根据后面的规则处理,由于是ACCEPT,所以放行允许数据包通过。
未取到令牌(数量为0):不做处理,下一条规则去处理。
假如池子里令牌数量减为0,就会触发–limit 500/s,以每秒500个令牌的速度像池里放令牌。
iptables -A INPUT -p tcp --dport 8080 -j DROP
这条规则是:这是对数据包进行丢弃
iptables -lINPUT -p tcp --dport 8080 -m limit --limit=500/s --imit-burst=1000 -jACCEPT这条规则是:8080端口会对包的速率做匹配,也就是每秒只处理500个包,假如某一时刻进来700个包,只处理500个包后面ACCEPT表示放行,也就是这500个包放行:剩下的200个包不做处理,交给下一个规则处理。
理解:
先限速 超过了就直接放,指定了要放行 那就是要去下一条链了 如果指定了拒绝 那就直接没了
–limit 500/s 表示每秒500次; 1/m 则为每分钟一次
–limit-burst 表示允许触发 limit 限制的最大次数 (预设5)
这里的--limit-burst=1000相当于说最开始我有1000的可以匹配的包去处理,然后我匹配的包的个数是根据--limit=500/s进行处理的,
也就是每秒限制500个数据包,多余的会被下面符合要求的DROP规则去处理,去进行丢弃,这样就实现了对数据包的限速问题。
通过对上面的数据分析,可以知道,利用iptables进行限速主要是利用率iptables的limit模块对数据包进行匹配处理,从而实现限速的;
--limit=match,这个是限定了匹配包的速率,
换句话说就是每秒可以转发多少个数据包,这是对iptables做限速的最主要的参数,通过制定它就基本可以确定要控制的限制速率是多少;
--limit-burst是允许触发 limit 限制的最大次数,默认预设是5;
也就是说最开始的5个包会被直接转发,这时burst就会减为0,再来的包就会丢给下一条规则去处理(这里设定是DROP),直到limit参数产生新的令牌,才会继续去匹配转发。
简单来说限速最主要的就是limit和burst,
burst是最初有多少令牌可以去转发包,后面limit会进行按速率匹配,相当于按时间补充令牌数,
第一条规则达到速率上限就会把剩下的包丢给下一条规则去处理,我们下一条和它对应的就是DROP,所以会把剩下的包丢弃,从而实现了限速。