linux基础之互联网架构与Iptables
目录
0、互联网架构图:
1、防火墙
防火墙的作用就是外部的防止恶意访问。
2、防火墙的种类
1.硬件防火墙
F5 :性能高,但是比较贵
2.软件防火墙
iptables、firewalld、... :免费的
3.安全组
云服务器上的防火墙
3、ipsatles基本介绍
用户 ---> 调用iptables ---> ip_tables内核模块 ---> Netfilter(系统安全框架) ---> 过滤请求
4、包
在数据传输过程,并不是一次性传输完成的;而是将数据分成若干个数据包,一点一点的传输。
5、包过滤防火墙
过滤数据包的防火墙。
6、包过滤防火墙如何实现
通过系统安全框架,过滤数据包。
7、Iptables链
Iptables有四表五链:表跟链是相互配合的关系,链可以把表放在需要的位置执行。
7.1 四表
表:具有某些功能的集合。
四表分别为(默认的表是filter):
1.filter:负责过滤功能:INPUT、FORWARD、OUTPUT
2.nat:负责网络地址转换:PREROUTING、INPUT、OUTPUT、POSTROUTING
3.mangle:负责修改数据包的内容:PREROUTING、 INPUT、 FORWARD、 OUTPUT、 POSTROUTING
4.raw:负责数据包跟踪:PREROUTING、OUTPUT
7.2 五链
五链分别为:
1. PREROUTING: 主机外报文进入位置,允许的表mangle, nat(目标地址转换,把本机地址转换为真正的目标机地址,通常指响应报文)
2. INPUT:报文进入本机用户空间位置,允许的表filter, mangle
3. OUTPUT:报文从本机用户空间出去的位置,允许filter, mangle, nat
4. FOWARD:报文经过路由并且发觉不是本机决定转发但还不知道从哪个网卡出去,允许filter, mangle
5. POSTROUTING:报文经过路由被转发出去,允许mangle,nat(源地址转换,把原始地址转换为转发主机出口网卡地址)
流入本机:PREROUTING --> INPUT --> PROCESS(进程)
经过本机:PREROUTING --> FORWARD --> POSTROUTING
从本机流出:PROCESS(进程) --> OUTPUT --> POSTROUTING
8、Iptables流程图
三种网络模型:
1.流入本机:A ---> PREROUTING ---> INPUT ---> B
2.流出本机:OUTPUT ---> POSTROUTING ---> B
3.经过本机: A ---> OUTPUT ---> POSTROUTING | ---> PREROUTING ---> FORWARD ---> POSTROUTING ---> C ---> PREROUTING ---> INPUT ---> B
四表包含的链:
filter : INPUT 、 FORWARD、 OUTPUT
nat : PREROUTING 、 INPUT、 OUTPUT、 POSTROUTING
raw : PREROUTING、 OUTPUT
mangle : PREROUTING、 INPUT、 FORWARD、 OUTPUT、 POSTROUTING
9、Iptables的使用
9.1 安装Iptables
[root@mysql03 ~]# yum install iptables*
9.2 启动Iptables
[root@mysql03 ~]# systemctl start iptables # 启动iptables
[root@mysql03 ~]# systemctl status iptables # 查看是否开启,active即为开启。
9.3 关闭防火墙(firewalld)
[root@mysql03 ~]# systemctl disable --now firewalld
9.4 Iptables的命令格式
iptables 参数 表名 选 项 链名 条件动作
9.5 Iptables参数
-t 指定操作的表;不能单独使用,需要配合其他参数
-L, --list 列出当前的规则;可以单独使用
-v 显示数据包和数据包大小;不能单独使用,需要配合其他参数
-n 不反解地址;不能单独使用,需要配合其他参数
-A, --append 追加一条规则到链中
-I, --insert 插入一条规则,插入到顶部
-F, --flush 清空原有的规则
-Z, --zero 清空计数器(包数量 、包大小)
-D, --delete 删除链中的规则
-R, --replace 修改
-S, --list-rules 列出所有的规则
-N, --new-chain 创建一个自定义链
-X, --delete-chain 删除一个自定义链
-P, --policy 指定链的默认策略
10、iptables中的动作
四个动作:
1.ACCEPT : 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链。
2.REJECT : 拦阻该数据包,并传送数据包通知对方。
3.DROP : 丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
4.REDIRECT : 将包重新导向到另一个端口,进行完此处理动作后,将会继续比对其它规则。
11、iptables基本的条件匹配
协议:匹配的基本条件,即我们要对什么协议进行过滤:
1.TCP : http协议归总在TCP协议里面了
2.UDP
3.ICMP :ping baidu.com
4.ALL
12、-s源地址 、-d 目标地址
-s : 源地址:发送请求的地址
-d : 目标地址:访问的地址
13、--sport源端口、--dport目标端口
--sport : 源端口:发送请求的端口
--dport : 目标端口:访问的端口
14、-i、-o、-m、-j 动作
-i : 进来的网卡
-o : 出去的网卡
-m : 指定模块
-j : 转发动作
-p :指定协议
15、模块
拓展iptables的功能的。
-m : 指定模块
1.连续匹配多个端口(multiport)
--dports : 指定多个端口(不同端口之间以逗号分割,连续的端口使用冒号分割)。
2.指定一段连续的ip地址范围(iprange)
--src-range from[-to]: 源地址范围
--dst-range from[-to]: 目标地址范围
3.匹配指定字符串(string)
--string "字符串" : 指定要匹配的字符串
--algo bm 或 --algo kmp : 匹配的查询算法
4.根据时间段匹配报文(time):注意时间使用UTC时间,即当前时间减去8小时
--timestart hh:mm[:ss] : 开始时间
--timestop hh:mm[:ss] : 结束时间
--monthdays day[,day...] : 指定一个月的某一天
--weekdays day[,day...] : 指定周 还是 周天
5.禁ping, 默认本机无法ping别人 、别人无法ping自己
--icmp-type {type[/code]|typename}
echo-request (8) 请求
echo-reply (0) 回应
6.限制链接数,并发连接数(connlimit)
--connlimit-upto n : 如果现有连接数小于或等于 n 则 匹配
--connlimit-above n : 如果现有连接数大于n 则匹配
7.针对 报文速率 进行限制。 秒、分钟、小时、天。(不准确的)
--limit rate[/second|/minute|/hour|/day] : 报文数量
--limit-burst number : 报文数量(默认:5)
16、小练习
# 案例1:只允许22端口可以访问,其他端口全部无法访问。
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -j DROP
# 案例2:只允许22,80,443端口可以访问,其他端口全部无法访问。
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP --dport 80 -j ACCEPT
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP --dport 443 -j ACCEPT
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -j DROP
# 案例3:只允许22,80,443端口可以访问,其他端口全部无法访问,但是本机可以访问百度。
# 案例4:要求使用192.168.15.81能够通过22端口链接,但是其他的不行
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22 -j ACCEPT
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -j DROP
# 案例5:只允许192.168.15.71能够通过22端口链接,其他的不行。
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -s 192.168.15.71 -d 192.168.15.100 --dport 22 -j ACCEPT
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -j DROP
# 案例6:要求192.168.15.100对外部不可见
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.100 -j DROP
# 案例7:要求使用eth0网卡的所有请求全部拒绝
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -i eth0 -j DROP
# 案例8: 使用172.16.1.71登录进来的窗口,不允许访问百度。
[root@mysql03 ~]# iptables -t filter -I OUTPUT -p TCP -o eth1 -j DROP
# 案例9:要求访问服务器的8080端口转发至80端口
[root@mysql03 ~]# iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80
# 案例10:要求只允许windows通过ssh连接192.168.15.81,其他的拒绝
[root@mysql03 ~]# iptables -t filter -I INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j DROP
# 案例11:要求将22,80,443以及30000-50000之间所有的端口向外暴露,其他端口拒绝
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -j DROP
# 案例12:要求访问数据包中包含HelloWorld的数据不允许通过。
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP
# 案例13:要求192.168.15.1 - 192.168.15.10之间的所有IP能够连接192.168.15.81,其他拒绝
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT
[root@mysql03 ~]# iptables -f filter -A INPUT -p TCP -j DROP
# 案例14:要求每天的12到13点之间,不允许访问(按UTC时间,当前时间需要减去8小时)
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -m time --timestart 4:00 --timestop 5:00 -j DROP # 必须使用UTC时间
# 案例15:要求别人不能ping本机,但是本机可以ping别人
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -m icmp --icmp-type "echo-request" -j DROP
# 案例16:要求主机连接最多有2个
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP
# 案例17:要求限制速率在500k/s左右
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -m limit 333/s -j ACCEPT
[root@mysql03 ~]# iptables -t filter -A INPUT -p TCP -j DROP
# 知识储备:
查看本机端口占用的命令: netstat -nutlp