一、iptables概述
iptables防火墙是linux系统防火墙的一种,实际上由两个组件netfilter和iptables组成。
netfilters与iptables的关系:
- netfilter:属于“内核态”的防火墙功能体系。是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。
- iptables:属于“用户态”的防火墙管理体系。是一种用来管理linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables文件下。
netfilter/iptables后期简称为iptables。iptables是基于内核的防护墙,其中内置了raw、mangle、nat、filter四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
二、规则表与规则链结构(四表五链)
1.简述
- 规则表(四表)的作用:容纳各种规则链。
- 规则链(五链)的作用:容纳各种防火墙规则。
总结:表中有链,链中有规则。
2.四表(规则表)
- raw表:确定是否对该数据包进行状态跟踪。包含两个规则链 - output、prerouting。
- mangle表:修改数据包内容,用于流量整形,给数据包设置标记。包含五个规则链 - input、output、forward、prerouing、postrouting。
- nat表:负责网络地址转换,用来的修改数据包中的源、目标ip地址或端口。包含三个规则链 - output、prerouting、postrouting。
- filter表:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,input、forward、output。
数据包到达防火墙时,数据表之间的优先顺序:
raw -> mangle -> nat -> filter
3.五链(规则链)
- input:处理入站数据包,匹配目标ip为本机的数据包。
- output:处理出战数据包,匹配从本机发出的数据包。
- forward:处理转发数据包,匹配流经本机的数据包。
- prerouting:在进行路由选择前处理数据包,用来修改目的地址,用来做dnet。相当于把内网服务器的ip和端口映射到路由器的外网ip和端口上。
- postroutiing:在进行路由选择后处理数据包,用来修改源地址,用来做snat。相当于内网通过路由器nat转换功能实现内网主机通过一个公网ip地址上网。
三、数据链过滤的匹配流程
- 入站数据:prerouting -> input -> 本机的应用程序
- 出站数据:本机的应用程序 -> output -> postrouting
- 转发数据:prerouting -> forward -> postrouting
四、iptables命令行配置方法
1.命令格式
iptables -t "表名" "管理选项" "链名" "匹配条件" -j "控制类型"
- 不指定表名时,默认指filter表
- 不指定链名时,默认值表内所有链
常用选项 | 解释 |
---|---|
-a | --apend 在指定表的末尾追加新规则 |
-i | --insert 在指定链的开头插入一条新规则,不指定序号时默认在开头插入新规则 |
-r | --replace 修改、替换指定链中某一条的规则,可指定序号或具体内容 |
-p | --policy 设置指定链的默认策略 |
-d | --delete 删除指定链中的某一条规则 |
-f | --flush 清空指定链中的所有规则,若为指定链名,则清空表中所有链 |
-l | --list 列出指定链中的所有规则,若为指定链名,则列出表中所有链 |
-n | --numeric 使用数字形式输出结果,如显示ip地址而不是主机名 |
-v | 显示详细信息,包括每条规则的匹配包数量和匹配字节数 |
--line-numbers | 查看规则时,显示序号 |
常用控制类型 | 解释 |
---|---|
accept | 允许数据包通过 |
drop | 直接丢弃数据包,不给出任何回应信息 |
reject | 拒绝数据包通过,会给数据发送端一个响应信息 |
snat | 修改数据包的源地址 |
dnat | 修改数据包的目的地址 |
redirect | 重定向改变目的端口,将接受的包转发至本机的不同端口 |
masquerade | 伪装成一个非固定公网ip地址 |
log | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则 |
2.基本匹配条件
基本匹配条件 | 解释 |
---|---|
-p | 指定协议 |
-s | 指定源地址 |
-d | 指定目的地址 |
-i | 指定入站网卡 |
-o | 指定出站网卡 |
3.隐含匹配
需以特定的协议匹配作为前提。
3.1.端口匹配
匹配条件 | 解释 |
---|---|
--sport | 源端口 |
--dport | 目的端口 |
例:
iptables -a input -p tcp --dport 20:21 -j accept
ps:--sport 和 --dport 必须配合-p "协议类型"使用
3.2 tcp标志位匹配
标志位 | 解释 |
---|---|
syn | 同步位 |
ack | 确认位 |
fin | 结束位 |
rst | 重置位 |
urg | 紧急位 |
psh | 推送位 |
例:
iptables -i input -p tcp --dport 22 --tcp-flags syn,ack,fin,rst,urg,psh syn -j reject
拒绝来自22端口的syn之外的tcp包(只接收syn包)
3.2 icmp类型匹配
类型 | 代码 | 解释 |
---|---|---|
echo-reques | 8 | 请求 |
echo-reply | 0 | 回显 |
destination-unreachable | 3 | 目标不可达 |
例:
iptables -a input -p icmp --icmp-type 8 -j -drop #禁止其他主机ping本机
3.3 显示匹配
要求以“-m 扩展模块”的形式明确指出类型,包括多端口、mac地址、ip范围、数据包状态等条件。
3.3.1 多端口匹配:
-m multiport --sport 源端口列表 -m multiport --dport 目的端口列表
例:
iptables -a input -p tcp -m multiport --dport 80,22,21 -j accept
3.3.2 ip范围匹配:
-m iprange --src-range 源ip范围 -m iprange --dst-range 目的ip范围
例:
iptables -a forward -p udp -m iprange --src-range 192.168.80.100-19.2169.80.200
3.3.3 mac地址匹配
-m mace --mace-source "mac地址"
3.3.4 状态匹配
-m state --state "连接状态"
常见的状态连接 | 解释 |
---|---|
new | 与任何连接无关的,还没开始连接 |
established | 响应请求或者已建立连接的,连接态 |
related | 与已有连接有相关性的,衍生态,一般与established 配合使用 |
invalid | 无效的封包,例如数据破损的封包状态 |
例:
iptables -a input -p tcp -m state --state established,related -j accept
五、snat与dnat
均需网关开启ip路由转发:
临时打开 echo 1 > /proc/sys/net/ipv4/ip_forward 或 sysctl -w net.ipv4.ip_forward=1
永久打开:
vim /etc/sysctl.conf .... net.ipv4.ip_forward=1 #将此行写入配置文件 sysctl -p #载入配置
1.snat
snat用于在网络中修改数据包的源地址。
snat转换前提条件:
- 局域网各主机已正确设置ip地址、子网掩码、默认网关地址
- linux网关开启ip路由转发
iptables -t nat -a postrouting -s 192.168.80.0/24 -o ens36 -j snat --to-source 12.0.0.1-12.0.0.10
2.dnat
dnat用于在网络中修改数据包的目的地址,通常是为了保护内网服务器的安全。
dnat转换前提条件:
- 局域网的服务器能够访问internet
- 网关的外网地址有正确的dns解析记录
- linux网关开启ip路由转发
iptables -t nat -a prerouting -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j dnat --to-destination 192.168.80.11
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论