Linux 中的iptables 规则策略
Linux 的防火墙
防火墙的分类:
防火墙的分类 |
作用 |
优势 |
劣势 |
硬件防火墙 |
对数据的传输做限制,消除安全隐患。数据过滤 |
性能高 |
成本高 |
软件防火墙 |
通过策略规范数据访问连接,提高安全。数据过滤 |
防火墙是开源的,费用低。 |
性能不如硬件防火墙, |
数据过滤:
数据过滤: 通过防火墙的策略对数据进行规范,如下图:防火墙允许1 2客户机访问服务器,3不能访问服务器,这一过程叫数据过滤
数据过滤:
出方向:服务器允许那些数据可以发送出去
入方向:那些数据可以进入服务器
穿 :1.0网段进入网卡1通过网卡2转发出去访问2.0网段,中间服务充当路由器转发的功能。
数据封装:
网络为了保证数据的正确传输,任何数据在外传输都会进行封装。数据到达目的主机,会进行解封装,
Osi七层模型
端口号是依赖单个IP地址存在的,如果有一个ip只能启65535端口,两个ip65535*2端口。 端口号:0-65535
源端口号一般情况 >1024
数据封装的过程:
应用层:游览器产生一个http请求 确保数据能到达目的地---传输层
传输层:进行封装、添加TCP/UDP报头 (TCP/UDP报头:源端口号,目的端口号)
(传输层根据应用层协议确定添加的报头) 到达网络层
网络层:对传输层的添加IP报头(源ip,目的ip) (只知道大致的地址)
数据链路层:对网络层的数据添加MAC帧头(源mac地址、目的mac地址) (mac唯一确定具体的地址)
解封装的过程:
源主机给目的主机发送数据
目的数据收到源主机的的数据进行解封装
解封MAC帧头,确认MAC的目的地址是不是目的主机的MAC
是接续解封装
否丢弃数据包
解封IP 报头,确认IP报头的目的ip是目的主机的IP地址
是继续解封装
否丢弃数据包
解封TCP/IP, 检测目的端口号由目的主机对应的端口号的进程去响应解决请求
没有对应的目的端口会丢弃数据包
解封装后收到请求后,目的主机会响应源主机的请求。响应请求的过程也是数据封装
linux防火墙 四表五链
内核模块:netfilter
实现数据过滤:
入方向
出方向
转发
Linux防火墙有钩子函数:
Input 截获进入服务器的数据
Forward 截获由服务器转发的数据
Output 截获由服务器发出的数据
Prerouting 截获路由前的操作
Postrouting 截获路由之后的操作
根据钩子函数创建防火墙规则
Linux 存储防火墙规则在链
五个钩子函数对应的五个链(chain):用来存储防火墙规则
INPUT
FORWARD
OUTPUT
PREROUTING
POSTROUTING
4张表
Filter 实现数据过滤
Nat 实现网络地址转换
Mangle 为数据打标记(一般通过数字标识)
Raw 数据跟踪
五条链根据防火墙实现的规则不同,被分配在四张表里面
Filter 实现数据过滤
INPUT FORWARD OUTPUT 根据需求写对应的链
Nat 实现网络地址转换
OUTPUT PREROUTING POSTROUTING 实现IP报头源ip和目的ip的转换
Mangle 为数据打标记(一般通过数字标识)
INPUT FORWARD OUTPUT PREROUTING POSTROUTING 都可以打标签
Raw 数据跟踪
OUTPUT (对发出去的数据跟踪) prerouting(路由之前的数据跟踪)
防火墙命令: iptables (firewalld 7.0版本之后)
防火墙规则匹配的顺序:
默认自上而下匹配,当匹配到最先匹配的规则。后面的防火墙规则不执行。
在设置防火墙规则要将经常匹配的规则写在上面。
防火墙顺序不规范会拖慢服务器的访问速度
防火情有默认规则,手写的规则匹配不到数据,会匹配默认规则
iptables 的使用方法:
Iptables 子命令 链名 规则
Iptables 查看
Iptables -L 查看防火墙规则 默认查看filter表的规则
[root@44 ~]# iptables -L
Chain INPUT (policy ACCEPT) ACCEPT 默认规则允许
Iptables -t 表名 查看指定的表规则信息
[root@44 ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
Iptables -nL 规则用的服务显示成端口号
Iptables --line-numbers 显示防火墙规则带有行号
Iptables -v 显示规则的计数器,数据包个数,大小。只要规则匹配到数据>0 如果一直为0考虑检测防火墙规则是否写错
Iptables 的删除
Iptables -F 清空防火墙规则,默认清除filter表
Iptables -t 表名 -F 清除指定表名的防火墙
Iptables -D 链 【序号】 删除指定的iptables
iptables 的添加
Iptables -A 链 在链追加规则
Iptables -I 链 插入规则,默认插入到最上 iptables -I chain 【序列】 指定位置插入
防火墙的规则组成:
匹配的数据条件
操作行为
操作行为:
-j < 操作行为> 只针对数据过滤的表 filter
ACCEPT 允许
DROP 丢弃 客户端请求进不到服务器
REJECT 拒绝 客户端进入服务器,服务器不响应
匹配数据的条件:
源IP 、目的IP、 源端口 、目的端口 、 协议 (五元组)
{-s } { -d } { -p 协议{tcp|udp|icmp} --sport --dport }
-s IP地址 : 可匹配ip地址、ip的网段
-s 192.168.20.1 配置源ip !-s 192.168.20.1 匹配源ip不是
-s 192.16.20.0/24
-p tcp --dport 22 匹配数据包目的端口号22 -p tcp --dport 22:100 表示连续的范围
-s 1.1.1.1 -d 2.2.2.2 -p --dport 80 1.1.1.1 访问2.2.2.2 的80端口
-d 2.2.2.2 -p tcp --dport 80 匹配所有的客户端访问2.2.2.2的80 端口的请求
-i 匹配网卡名 从网卡进来的数据
-o 匹配网卡名 从网卡发出的数据
-P I许改链的默认状态
-p icmp --icmp-type 8 ping请求
--icmp-type 0 ping回应
事例: 拒绝ssh
测试45 访问192.168.20.139是可以ssh的
[root@45 ~]# ssh 192.168.20.139
root@192.168.20.139's password:
在进入的数据中设置拒绝源地址是192.168.20.140通过ssh22端口访问192.168.20.139的
[root@44 ~]# iptables -A INPUT -s 192.168.20.140 -d 192.168.20.139 -p tcp --dport 22 -j REJECT
[root@45 ~]# ssh 192.168.20.139
ssh: connect to host 192.168.20.139 port 22: Connection refused
拒绝http
通过45访问44的httpd的web
[root@45 ~]# curl 192.168.20.139
web iptable
拒绝所有访问44httpd的web服务
[root@44 ~]# iptables -A INPUT -d 192.168.20.139 -p tcp --dport 80 -j REJECT
[root@46 ~]# curl 192.168.20.139
curl: (7) Failed connect to 192.168.20.139:80; Connection refused
查看iptables的配置
[root@44 ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 REJECT tcp -- 192.168.20.140 192.168.20.139 tcp dpt:22 reject-with icmp-port-unreachable
2 REJECT tcp -- 0.0.0.0/0 192.168.20.139 tcp dpt:80 reject
拒绝任何ipping 44
[root@45 ~]# ping -c1 192.168.20.139
PING 192.168.20.139 (192.168.20.139) 56(84) bytes of data.
64 bytes from 192.168.20.139: icmp_seq=1 ttl=64 time=0.968 ms
[root@44 ~]# iptables -A INPUT -d 192.168.20.139 -p icmp -j REJECT
[root@45 ~]# ping -c1 192.168.20.139
PING 192.168.20.139 (192.168.20.139) 56(84) bytes of data.
From 192.168.20.139 icmp_seq=1 Destination Port Unreachable
保存iptables规则
[root@44 ~]# iptables-save > 1.txt
恢复规则
[root@44 ~]# iptables-restore < 1.txt
修改规则:
Iptables -R 链 修改信息
-m 补充模块
Iptables -m 模块名 -- help 查模块的帮助信息
Multiport 模块: 支持多个端口,多个端口用,隔开
EG:
[root@44 ~]# iptables -A INPUT -s 192.168.20.140 -p tcp -m multiport --dport 22,80 -j REJECT
Iprange 模块 : 支持多个IP地址
[root@44 ~]# iptables -A INPUT -m iprange --src-range 192.168.20.140 192.168.20.141 -p tcp -j REJECT
Iptables 实现数据过滤:
基本条件: (五元组)
源ip、目的ip 、源地址、目的地址 、 协议
连接状态进行的数据过滤:
-m state-state <状态>
状态值: NEW 首次访问
ESTABLISHED 完成 服务的后续访问、服务器的响应
RELATED 相关联
Iptables---NAT表的使用
Nat -----网络地址转换
主要实现更换换源IP 与目的IP
主要在PREROUTING路由前 和 POSTROUTING 路后 写规则
路由前:主机收到一个数据在主机对数据操作路由之前发生的事情
路由后:主机收到一个数据对数据进行了路由的查找之后的操作
-j <操作>
-j SNAT 转换数据的源IP地址
-j MASQUERADE 转换数据里面的源IP地址
-j DNAT 转换数据里的目的IP地址
NAT转化的原理:
源主机访问目的主机
snat可以让本地ip地址伪装成其他机器的ip地址,或者是公网IP,
源主机会封装自己数据请求{源ip 、目的ip 、请求}
数据请求到达NAT上,NAT会查路由确认能不能连接到目的主机IP
(1) 如果查看路由表不能,会返回目的ip不可达
(2) 如果查看自己的路由表能,会把源ip转换成目的ip网段的ip(同时NAT会记录这条NAT转换的数据){转换的网络:1单独公网ip 2.NAT设备上现有的IP }
通过转换后的源IP数据请求会把数据请求发送到目的IP上
目的IP对源IP发出的请求做出响应
-s SNAT <公网IP)> 手动指定单独的公网ip
-s MASQUERADE 会自动把源ip转换成NAT上自身的公网ip
-s DNAT 目的ip转换 路由前
dnat是用来做目的网络地址转换的,就是重写包的目的IP地址。
发布服务:把服务从私有地址发布到公网上
- web的私有ip换为固定的公网ip
- 互联网用户会发送请求到NAT
- NAT接受请求会把目的ip 转化为web的私有ip
- NAT查看路由,把请求发送到转换后的目的IP
实现:
[root@44 ~]# iptables -t nat -A POSTROUTING -s 192.168.20.141 -d 192.168.20.139 -p tcp --dport 80 -j SNAT --to-source 192.168.20.139:8888
Iptables ----mangle表实现数据标记
数据打标记的目的:为了把想要的数据区分,分类标记出来。
Mangle 一般在路由前PREROUTING打标记。
操作命令事例:
把相同的数据打成一个标记,对同一标记的数据做相同的处理
将对目的主机执行icmp的数据打标记为88
[root@44 ~]# iptables -t mangle -A PREROUTING -d 192.168.20.139 -p icmp -j MARK --set-mark 88
打标记对数据区分分类,并不改动数据本身
[root@45 ~]# ping 192.168.20.139
PING 192.168.20.139 (192.168.20.139) 56(84) bytes of data.
64 bytes from 192.168.20.139: icmp_seq=1 ttl=64 time=2.03 ms
64 bytes from 192.168.20.139: icmp_seq=2 ttl=64 time=0.418 ms
64 bytes from 192.168.20.139: icmp_seq=3 ttl=64 time=0.545 ms
把标记名为88的苏数据丢弃
[root@44 ~]# iptables -A INPUT -m mark --mark 88 -j DROP
[root@45 ~]# ping 192.168.20.139
PING 192.168.20.139 (192.168.20.139) 56(84) bytes of data.
Iptables----forward链实现数据过滤
[root@44 juben]# yum install iptables-services.x86_64
导出防火墙规则,做保存
[root@44 juben]# iptables-save > /etc/sysconfig/iptables