1、介绍
iptables 是一个在 Linux 系统上用于配置和管理防火墙规则的工具。它允许系统管理员定义数据包的过滤规则、网络地址转换(NAT)规则和数据包的网络地址和端口的转发规则。iptables 提供了非常灵活和强大的功能,可以用于保护网络安全、实现网络地址转换、限制网络流量等。
2、命令
2.1 命令格式
iptables命令的一般格式如下:
iptables [OPTIONS] -t table -A chain [MATCH] -j target
其中OPTIONS 是一些可选的命令选项,用于指定一些特定的操作或参数。
- -t table 指定要操作的表(如filter、nat、mangle等)。
- -A chain 指定要追加规则的链。
- [MATCH] 是一些匹配条件,用于匹配数据包的特定属性。
- -j target 指定规则的目标动作,即数据包匹配成功后要执行的操作
2.2 四张表
filter 表:
- 用于过滤数据包,即根据规则决定是否允许数据包通过防火墙。
- 可以配置规则来允许或拒绝数据包的传输,实现基本的网络访问控制。
- 通常用于实现基本的网络安全功能,如阻止特定IP地址的访问、允许特定端口的访问等。
nat 表(Network Address Translation,网络地址转换):
- 用于修改数据包的源或目标地址,实现网络地址转换功能。
- 可以将私有网络内部的IP地址转换为公网IP地址(源地址转换),也可以将目标地址转换为内部的IP地址(目标地址转换)。
- 通常用于实现内网访问外网的功能,或者实现端口映射等。
mangle 表:
- 用于对数据包进行特定的修改,如修改TTL(Time to Live)字段、标记数据包等。
- 可以在数据包经过防火墙时对其进行特定的处理,而不是简单地允许或拒绝。
- 通常用于实现一些高级的网络功能,如负载均衡、QoS(Quality of Service)等。
raw 表:
- iptables中的一个特殊表,用于在数据包进入连接追踪之前进行处理。它提供了一种在数据包进行连接追踪之前处理数据包的机制,可以用于一些特定的场景和需求
2.3 五个链
- PREROUTING(路由前):这个链用于在数据包进入路由流程之前进行处理。它通常用于目的地址转换(DestinationNAT)或者对数据包进行标记。举例来说,当数据包到达网络接口时,可以使用PREROUTING链将数据包的目的地址进行修改,以便将数据包重定向到不同的目标主机。
- INPUT(数据包流入口):这个链用于处理发往本地系统的数据包。当数据包的目的地址是本地系统,它将经过INPUT链进行处理。举例来说,当一台服务器收到一个SSH连接请求时,数据包将经过INPUT链进行处理,以确定是否允许该连接进入系统。
- FORWARD(转发管卡):这个链用于处理通过系统进行转发的数据包。当数据包的目的地址不是本地系统,且需要通过系统进行转发时,它将经过FORWARD链进行处理。举例来说,当一台路由器收到一个数据包,需要将它转发到另一个网络时,数据包将经过FORWARD链进行处理。
- OUTPUT(数据包出口):这个链用于处理从本地系统发出的数据包。当数据包由本地系统发出时,它将经过OUTPUT链进行处理。举例来说,当本地系统发出一个HTTP请求时,数据包将经过OUTPUT链进行处理,以确定是否允许该请求离开系统。
- POSTROUTING(路由后):这个链用于在数据包离开系统之前进行处理。它通常用于源地址转换(SourceNAT)或者对数据包进行标记。举例来说,当数据包即将离开系统的网络接口时,可以使用POSTROUTING链将数据包的源地址进行修改,以便隐藏真实的源地址或者实现负载均衡。
2.4 iptables命令选项
- -A, --append chain rule-specification [options]: 将规则追加到指定的链(chain)中。
- -C, --check chain: 检查规则是否存在。
- -D, --delete chain [rulenum]: 从指定的链中删除匹配的规则,如果指定了rulenum,则删除指定编号的规则。
- -I, --insert chain [rulenum] rule-specification [options]: 在指定的链中插入规则,如果指定了rulenum,则插入到指定编号的位置。
- -R, --replace chain rulenum rule-specification [options]: 替换指定链中指定编号的规则。
- -L, --list [chain [rulenum]]: 列出指定链中的规则,如果没有指定链名,则列出所有链中的规则。
- -S, --list-rules [chain [rulenum]]: 打印指定链中的规则,如果没有指定链名,则打印所有链中的规则。
- -F, --flush [chain]: 清空指定链中的所有规则,如果没有指定链名,则清空所有链中的规则。
- -Z, --zero [chain [rulenum]]: 将指定链中的数据包和字节计数器归零,如果没有指定链名,则归零所有链中的计数器。
- -N, --new chain: 创建一个新的用户自定义链。
- -X, --delete-chain [chain]: 删除一个用户自定义链,如果没有指定链名,则删除所有用户自定义链。
- -P, --policy chain target [options]: 修改指定链的默认策略。
- -E, --rename-chain old-chain new-chain: 修改用户自定义链的名称,并移动任何引用该链的地方。
- -p, --protocol proto: 指定协议,可以是协议号或协议名。
- -s, --source address[/mask][...]: 指定源地址。
- -d, --destination address[/mask][...]: 指定目标地址。
- -i, --in-interface input name[+]: 指定输入网络接口名。
- -j, --jump target: 指定规则的目标动作。
- -g, --goto chain: 跳转到指定链,没有返回。
- -m, --match match: 扩展匹配(可以加载扩展)。
- -n, --numeric: 使用数字形式输出地址和端口。
- -o, --out-interface output name[+]: 指定输出网络接口名。
- -t, --table table: 指定要操作的表,默认为filter。
- -v, --verbose: 显示详细信息。
- -w, --wait [seconds]: 在放弃之前尝试获取xtables锁的最长等待时间。
- -W, --wait-interval [usecs]: 尝试获取xtables锁的等待时间,默认为1秒。
- -x, --exact: 显示精确值。
- -f, --fragment: 仅匹配第二个或更多的分片。
- -V, --version: 打印软件包版本号。
3、实际操作
3.1 禁止访问eth0网卡的22端口
iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP
- -A 指定操作INPUT链
- -i 指定网络接口为eth0
- -p 指定tcp协议
- --dport 指定端口
- -j 指定DROP丢弃包
ssh使用在22端口进行监听:
添加该规则后使用PC就无法连接到终端的22端口:
使用以下命令删除该规则:
iptables -D INPUT -i eth0 -p tcp --dport 8080 -j DROP
3.2 指定使用wlan0访问固定IP
iptables -t nat -A POSTROUTING -d 172.20.247.121 -o wlan0 -j MASQUERADE
- -t 指定nat表
- -A 指定链POSTROUTING
- -d 指定IP 172.20.247.121
- -o wlan0 指定输出wlan0网口
- -j MASQUERADE修改数据包的源地址
3.3 查看当前nat表详细规则
iptables -t nat -nvL
- -t 指定nat表
- -nvL:
- -n:表示显示IP地址和端口号时不进行反向解析,显示数字格式。
- -v:显示详细信息,包括数据包和字节计数。
- -L:表示列出当前nat表中的规则。