iptables
介绍
iptables简介
- netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,完成封包过滤、封包重定向和网络地址转换(NAT)等功能
- 规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等
- 当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)和丢弃(DROP)等
- 配置防火墙的主要工作就是添加、修改和删除这些规则
iptables和netfilter的关系
- iptables是Linux防火墙的管理工具,位于/sbin/iptables
- 真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构
iptables的规则表和链
-
表(tables)
- 提供特定的功能
-
链(chains)
- 数据包传播的路径,每一条链中可以有数条规则
- 当数据包到达链时,逐条按照规则检查,满足则处理,后面不再匹配;都不满足则按默认策略处理
数据包传输过程
- 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
- 如果数据包就是进入本机的,发送到INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出
- 如果数据包是要转发出去的,且内核允许转发,数据包就会发送到FORWARD链,然后到达POSTROUTING链输出
基础
四表
-
raw
- 数据追踪(PREROUTING和OUTPUT检查)
-
mangle
- 数据包标记(所有链检查)
-
nat
- 网络地址转换(仅FORWARD不检查)
-
filter
- 数据包过滤 (默认) (INPUT,OUTPUT,FORWARD检查)
五链
-
PREROUTING
- 路由前
-
INPUT
- 进来的流量—起点不是本机,终点是本机
-
FORWARD
- 穿越的流量—起点、终点均不是本机
-
OUTPUT
- 出去的流量–起点是本机,终点不是本机
-
POSTROUTING
- 路由后
数据包路径
-
PREROUTING—>INPUT
- 进来的
-
OUTPUT—>POSTROUTING
- 出去的
-
PREROUTING—>FORWARD—>POSTROUTING
- 经过的
配置
语法
-
-nL
-
数字的形式显示指定链所有规则,默认所有链
- iptables -t 表名 -nL [链名]
- iptables -t filter -nL FORWARD
-
-
-S
-
打印链中所有规则,默认所有链
- iptables -t 表名 -S [链名]
- iptables -t nat -S
-
-
-F
-
清空链中所有规则,默认所有链
- iptables -t 表名 -F [链名]
- iptables -t filter -F INPUT
-
-
-D
-
删除链中规则,接序号或规则动作
- iptables -t 表名 -D 链名 [数字|具体的规则]
- iptables -t nat -D PREROUTING 1
-
-
-P
-
设置链的默认策略
- iptables -t 表名 -P 链名 动作
- iptables -t filter -P INPUT DROP
- iptables -t filter -A FORWARD -j DROP
-
-
-A
-
向链中追加规则
- iptables -t 表名 -A 链名 匹配条件 -j 动作
- iptables -t filter -A INPUT -s 1.1.1.1 -j ACCEPT
-
-
-I
-
向链中插入规则,数字表示插入到第几条,默认1
- iptables -t 表名 -I 链名 [数字] 匹配条件 -j 动作
- iptables -t filter -I INPUT 2 -s 1.1.1.11 -p tcp --dport 22 -j ACCEP
-
-
-R
-
替换链中指定序号的规则
- iptables -t 表名 -R 链名 数字 匹配条件 -j 动作
- iptables -t filter -R INPUT 2 -s 1.1.1.11 -p tcp --dport 2222 -j ACCEPT
-
-
所有链名和动作必须大写
匹配条件
-
-p 协议
- 匹配协议类型,如tcp/udp/icmp
-
-s ip_addr
- 匹配源IP地址
-
-d ip_addr
- 匹配目标IP地址
-
-i 网卡名称
- 从哪个网卡进来的(PREROUTING)
-
-o 网卡名称
- 从哪个网卡出去的(POSTROUTING)
-
-m
-
扩展匹配
-
tcp
- –sport 源端口
- –dport 目标端口
- –tcp-flags mark标记
-
udp
- –sport 源端口
- –dport 目标端口
-
icmp
-
–icmp-type
- 指定匹配ICMP类型
-
-
mac
-
–mac-source
- 匹配源MAC地址
-
-
multiport
-
–sports
- 匹配多个源端口
-
–dports
- 匹配多个目标端口
-
–ports
- 匹配多个端口,不区分方向
-
-
state
-
通过state模块实现连接追踪机制,只要有互相通信就算建立连接
多个状态用逗号分隔 -
iptables -t filter -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
-
–state
-
NEW
- 表示包为新的连接
-
ESTABLISHED
- NEW之后,双向传送的连接
-
RELATED
- 表示包由新连接开始,但是和一个已存在的连接有关联,如ftp中的数据连接
-
INVALID
- 表示包是未知连接
-
UNTRACKED
- 表示报文未被追踪,通常为无法找到相关的连接
-
-
-
mark
-
匹配防火墙标记
-
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 11
-
–mark
- iptables -t filter -A INPUT -m mark --mark 11 -j ACCEPT
-
-
动作
-
filter
-
REJECT
- 拒绝
- iptables -t filter -A INPUT -j REJECT
-
ACCEPT
- 允许
- iptables -t filter -A INPUT -j ACCEPT
-
DROP
- 丢弃
- iptables -t filter -A INPUT -j DROP
-
-
nat
-
DNAT
- 目标地址转换,PREROUTING/OUTPUT
- iptables -t nat -A PREROUTING -d 180.12.13.15 -j DNAT --to 1.1.1.11
-
SNAT
- 源地址转换,POSTROUTING/INPUT
- iptables -t nat -A POSTROUTING -s 180.12.111.111 -j SNAT --to 1.1.1.24
-
MASQUERADE
- 根据网卡IP转换源地,POSTROUTING
- iptables -t nat -A POSTROUTING -s 1.1.1.11 -j MASQUERADE
-
REDIRECT
- 端口重定向,PREROUTING/OUTPUT
- iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to 80
-
-
mangle
-
MARK
- 标记
- iptables -t mangle -A PREROUTING -p tcp --dport 21 -j MARK --set-mark 21
-
示例
-
将INPUT,OUTPUT,FORWARD默认策略都设置为DROP
- iptables -P INPUT DROP
- iptables -P FORWARD DROP
- iptables -P OUTPUT DROP
-
允许物理机通过SSH连接本机
- iptables -A INPUT -s 1.1.1.1 -j ACCEPT
-
允许所有人访问本机web服务(80,8080,443)
- iptables -A INPUT -p tcp -m multiport --dports 80,8080,443 -j ACCEPT
-
允许所有人访问本机的FTP服务(21,30001-31000,20)
- iptables -A INPUT -p tcp -m multiport --dports 20,21,30001:31000 -j ACCEPT
-
允许1.1.1.11访问本机的MySQL服务(3306)
- iptables -A INPUT -s 1.1.1.11 -p tcp --dport 3306 -j ACCEPT
-
output配置
- iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
实验
实验一SNAT
-
目的
- 实现内网的主机能够访问外网
-
规划
-
web-server
- 180.15.100.100
-
防火墙
- 180.15.16.17
- 1.1.1.24
-
client
- 1.1.1.11
-
-
配置
-
防火墙
-
echo 1 > /proc/sys/net/ipv4/ip_forward
- 开启路由转发
-
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to 180.15.16.17
-
能ping通客户端和服务器
-
-
client
- route add default gw 1.1.1.24
-
-
测试
-
client
- curl 180.15.100.100,显示web-server内容
-
实验二DNAT
-
目的
- 内网服务器对外发布服务
-
规划
-
client
- 180.15.100.100
-
防火墙
- 外网:180.15.16.17
- 内网:1.1.1.24
-
web-server
- 1.1.1.11
-
-
配置
-
防火墙
- echo 1 > /proc/sys/net/ipv4/ip_forward
- iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 1.1.1.11
-
web-server
- route add default gw 1.1.1.24
-
-
测试
-
client
- curl 180.15.16.17,显示web-server内容
-
-
注意
- web-server的路由表确保只有一条默认路由,否则可能报错Connection reset by peer
实验三filter
-
在DNAT实验的基础上实现
- 将web服务器端口改成8080,客户端通过80端口仍能访问
- 防火墙的22端口仅对主机180.15.10.10开放
- 对外仅开放80端口
-
防火墙
-
PREROUTING链
- iptables -t nat -R PREROUTING 1 -p tcp --dport 80 -j DNAT --to 1.1.1.11:8080
-
INPUT链
- iptables -A INPUT -s 180.15.10.10 -p tcp --dport 22 -j ACCEPT
- iptables -A INPUT -s 1.1.1.1 -p tcp --dport 22 -j ACCEPT
- iptables -A INPUT -j DROP
-
FORWARD链
- iptables -A FORWARD -p tcp --dport 8080 -j ACCEPT
- iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
- iptables -A FORWARD -j DROP
-
-
测试
-
client
- curl 180.15.16.17,显示web-server内容
-
实验四
DANT+filter
-
要求
- 公司对外发布web(80)和ftp(21)两个业务,所有客户都能正常访问且只能访问这两个业务
- 仅管理机180.15.10.10可以通过防火墙的2280端口ssh连接web服务器,2221端口连接ftp服务器
- 防火墙本机仅允许管理机连接
-
规划
-
client
- 180.15.100.100
-
防火墙
- 外网:180.15.16.17
- 内网:1.1.1.24
-
web-server
- 1.1.1.11
-
ftp-server
- 1.1.1.23
-
-
配置
-
防火墙
-
路由转发
- echo 1 > /proc/sys/net/ipv4/ip_forward
-
PREROUTING
- iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 1.1.1.11
- iptables -t nat -A PREROUTING -p tcp -m multiport --dports 21,40001:41000 -j DNAT --to 1.1.1.23
- iptables -t nat -A PREROUTING -s 180.15.10.10 -p tcp --dport 2280 -j DNAT --to 1.1.1.11:22
- iptables -t nat -A PREROUTING -s 180.15.10.10 -p tcp --dport 2221 -j DNAT --to 1.1.1.23:22
-
POSTROUTING
- iptables -t nat -A POSTROUTING -p tcp --sport 20 -j MASQUERADE
-
INPUT
- iptables -A INPUT -s 1.1.1.1 -p tcp --dport 22 -j ACCEPT
- iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- iptables -A INPUT -j DROP
-
FORWARD
- iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
- iptables -A FORWARD -p tcp -m state --state ESTABLISHED -j ACCEPT
- iptables -A FORWARD -p tcp -m multiport --dports 21,40001:41000 -j ACCEPT
- iptables -A FORWARD -p tcp --sport 20 -j ACCEPT
- iptables -A FORWARD -s 180.15.10.10/32 -p tcp --dport 22 -j ACCEPT
- iptables -A FORWARD -j DROP
-
-
web-server
- route add default gw 1.1.1.24
-
ftp-server
-
pasv_min_port=40001 #设置被动模式端口范围
pasv_max_port=41000 #设置被动模式端口范围
pasv_address=180.15.16.17 #设置被动模式PASV响应IP
- systemctl start vsftpd
注意事项
原则
-
堵不如疏
-
堵
- 默认为放行,设置策略禁止需要禁止的流量
-
疏
- 默认为禁止,设置策略放行需要放行的流量
策略
- 注意策略顺序, 防火墙的匹配是从上到下,匹配到即执行相应的动作,后面的不再匹配
- 将匹配较多的策略放在上面,以避免额外的系统开销
- 设置默认禁止策略前先设置好放行管理机策略,再把默认策略放在最后一条,不建议用-P设置默认禁止
- 同一条策略里不同类型的多个条件之间是与的关系,同一个条件的多个参数之间是或的关系
存储
-
iptables策略有效期
- 配置的策略默认重启后失效,恢复为默认设置
-
保存iptables策略
- iptables-save > /etc/sysconfig/iptables
-
恢复iptables策略
- iptables-restore /etc/sysconfig/iptables
开机启动
-
方式一
- yum -y install iptables-services
- systemctl start iptables;systemctl enable iptables
-
方式二
iptables-restore /etc/sysconfig/iptables
- chmod +x /etc/rc.d/rc.local