防火墙

功能:防火墙对经过它的流量进行一个扫描,这样就能够过滤掉一些恶意的流量,以免在目标机器上被执行;防火墙还能够阻挡,关闭一些不常用的端口,禁止该端口的流量进出
概念:linux下防火墙一般分为软件防火墙和硬件防火墙

  • 硬件防火墙:在硬件的级别实现防火墙功能流量过滤功能,性能很高,但是成本也很高
  • 软件防火墙:在软件系统内核级别实现网络流量的过滤,性能稍弱,但是成本很低

    软件防火墙

    在linux上提供的软件防火墙,名字叫做iptables,它是一个防火墙命令行工具,iptables还是一个客户端代理,通过iptables的代理,将用户配置的安全策略,执行到对应的安全框架中netfilter
    iptables只是一个命令行工具,处于用户空间,离用户最近
    真正实现流量过滤的软件是netfilter,处于系统内核空间,和操作系离得最近
    iptables+netfilter共同组成了linux的软件防火墙,一般就用来替代昂贵的防火墙了
    centos7系统下,filrewalld软件,又替代了iptables工具
    iptables是把用户配置的防火墙规则,交给内核层的netfilter工具去处理
    filrewalld服务是把用户配置的防火墙规则,交给内核层的nftables网络过滤器去处理
    (二选一即可,用哪个都可以)

    iptables命令

    iptables默认会自上而下的读取防火墙规则,匹配到正确的规则后,就结束匹配的工作,并且执行对应的工作。如果读取的防火墙所有规则都没有符合,就执行默认的策略。

  • 允许:当默认的规则全部都是允许的时候,就得设置一些禁止、决绝的匹配规则,以保证服务器的安全

  • 决绝:当默认的规则全部都是拒绝的时候,你就得设置一些允许通过的流量,否则所有的流量都禁止了,就没意义了

规则就存储在内核空间的信息包过滤表中,这些规则定义了源地址信息、目的地址、传输的协议类型、服务类型等
当数据包符合规则条件的时候,iptables就根据所定义的方法(动作)来处理这些数据包,放行accept、拒绝reject、丢弃drop

iptables把用于处理和过滤流量的策略,称之为规则,多条规则就组成了一个规则链,并且规则链还有默认的动作。规则链根据数据包所处的不同位置进行不同的分类。
linux默认的5个规则链:

  • 路由选择前处理数据包,prerouting链
  • 处理流入的数据包,input链 ====>>> #主要使用的规则链#
  • 处理流出的数据包,output链
  • 处理转发的数据包,forward链
  • 进行路由选择后处理数据包,postrouting链

    动作

    服务器流量在通过input链之后,进入到服务器内,还得遵循一些动作去处理这些数据包

  • accept,允许数据包通过

  • reject,拒绝数据包通过,还会给客户端一个响应,告知它被拒绝
  • log,在linux系统的日志目录下/var/log/message中记录防火墙日志,然后将数据包递给下一个规则,不做处理
  • drop,直接丢弃数据包,不给任何回应,客户端会以为自己的请求扔进大海,直到请求超时报错
  • SNAT,源地址转换,解决内网用户用同一个公网的问题
  • DNAT,目标地址转换
  • redirect,在本机做端口映射

    参数

    -t<表>:指定要操纵的表;
    -A:向规则链中添加条目;
    -D:从规则链中删除条目;
    -i:向规则链中插入条目;
    -R:替换规则链中的条目;
    -L:查看防火墙规则;
    -F:清楚规则链中已有的条目;
    -Z:清空规则链中的数据包计算器和字节计数器;
    -N:创建新的用户自定义规则链;
    -P:定义规则链中的默认目标;
    -h:显示帮助信息;
    -p:指定要匹配的数据包协议类型;
    -s:指定要匹配的数据包源ip地址;
    -j<目标>:指定要跳转的目标;
    -i<网络接口>:指定数据包进入本机的网络接口;
    -o<网络接口>:指定数据包要离开本机所使用的网络接口。

    iptables命令选项输入顺序: iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> —sport 源端口 <-d 目标IP/目标子网> —dport 目标端口 -j 动作

三表五链

表名包括:

  • raw :高级功能,如:网址过滤。
  • mangle :数据包修改(QOS),用于实现服务质量。
  • net :地址转换,用于网关路由器。
  • filter :包过滤,用于防火墙规则。

规则链名包括:

  • INPUT链 :处理输入数据包
  • OUTPUT链 :处理输出数据包。
  • PORWARD链 :处理转发数据包。
  • PREROUTING链 :用于目标地址转换(DNAT)。
  • POSTOUTING链 :用于源地址转换(SNAT)。

动作包括:

  • accept :接收数据包。
  • DROP :丢弃数据包。
  • REDIRECT :重定向、映射、透明代理。
  • SNAT :源地址转换。
  • DNAT :目标地址转换。
  • MASQUERADE :IP伪装(NAT),用于ADSL。
  • LOG :日志记录。

    案例

  1. 查看linux本地的iptables规则

    iptables -L

  2. 清空本地防火墙规则

    iptables -F

  3. 禁止服务器被ping,服务器拒绝icmp协议的流量【直接丢弃,丢弃后给与响应 drop reject】

    iptables -A INPUT -p icmp —icmp-type 8 -s 0/0 -j REJECT

    参数解释:

    -A:指定链 -p:指定协议
    —icmp-type 8:指定icmp协议的类型 -s:指定源IP网段 -j:指定动作

  4. 服务器禁止ping,直接丢弃请求,不给与响应

    iptables -A INPUT -p icmp —icmp-type 8 -s 0/0 -j DROP

  5. 删除指定的iptables规则

    iptables -D INPUT 1

  6. 注意云服务器不要随意的联系iptables,因为云服务器是不用软件防火墙的,如果你随意的禁止端口,禁止流量,可能会造成云服务器无法远程连接

  7. 禁止访问服务器的80端口

    iptables -A INPUT -p tcp —dport 80 -j DROP

  8. 禁止服务器的FTP端口被访问,端口ftp默认是21

    iptables -A INPUT -p tcp —dport 21 -j ACCEPT

  9. 指定允许的ip地址网段连接该服务器的22端口,指定客户端进行远程连接,决绝所有其他的流量(这里需要设置两个规则)

    1. 第一步:允许某一个客户端连接该服务器的22端口

      iptables -A INPUT -s 192.168.47.128.0/24 -p tcp —dport 22 -j ACCEPT

    2. 第二步:拒绝其他所有流量

      iptables -A INPUT -s 0/0 -p tcp -j DROP

  10. 禁止指定的机器,访问本机的80端口

    iptables -A INPUT -p tcp -s 192.168.47.128.0/24 —dport 80 -j REJECT

  11. 禁止所有的主机网段,访问该服务器的8000-9000端口(注意这里要写所有的tcp和udp连接,所以还是两条规则)

    iptables -A INPUT -p tcp -s 0/0 —dport 8000:9000 -j REJECT iptables -A INPUT -p udp -s 0/0 —dport 8000:9000 -j REJECT

HTTP

HTTP(HyperText Transfer Protocal)超文本传输协议, 完成客户端到服务端的一系列请求过程。
HTTP协议用于client和server之间通信,一般是请求一个静态资源称之为客户端,提供资源的一方称之为服务端。
HTTP是一个简单的请求-响应协议,它通常运行在TCP之上,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
web基础
我们访问一个网页的流程,一般情况下是这样的:打开浏览器—输入网址—得到对应的网页,所以我们也可以根据这个流程得到其原理如下:
浏览器会根据用户输入的域名(我们常说的网址),进行域名解析(得到他根本的服务器ip地址),向该服务器所运行一个web服务器程序,这个web服务器软件能够在机器上寻找用户想要的资料,最终返回给用户浏览器进行渲染

  • 而web服务器使用的就是一种名叫HTTP协议(超文本传输协议)。

    TCP/IP协议

    常见的协议:

  • lcmp协议,用于在服务器之间,网络设备之间进行消息传递

  • dns协议,建立在UDP和TCP协议之上,默认使用服务器的53端口进行通信,进行域名解析
  • FTP协议,文件传输协议,主要是两个部分:client,server(c/s模式)
  • nfs协议,rpc协议+nfs协议,运行处理网络共享文件系统
  • snmp协议,应用层协议,预先告警发现网络设备的问题
  • http协议,简单的请求和响应,运行在TCP,IP协议之上,指定了客户端能够给服务器发送什么形式的请求

    IP和ARP的关系

    ARP协议就是把IP地址和MAC地址进行解析的一个协议;网络数据包的传递过程,将数据通过路由器进行传递解析

    TCP协议

    TCP协议位于传输层,提供可靠的字节流服务,指的是以字节流的形式传递给接受者,没有固定的报文边界限制,只能知道总共发送的数据,但是不知道一次能读取到多少数据,为了更容易传输大数据将数据切割

    三次握手

    为了数据的准确性,服务端和客户端之间需要三次的交互(俗称三次握手)

  • 第一次:clinet 发送 syn 包(syn=j)给 server ,进入 SYN_SEND 状态,等待服务器确认

  • 第二次:server 收到 syn 包,确认 client 发来的 syn(ack=j+1),同时自己发送一个 syn 包
  • 第三次:客户端接收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此时包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手

    URL和DRL

    URL(统一资源标识符)用来标识某一个互联网资源的自妇产,在世界互联网范围内,标识定位某一个唯一的资源信息
    URL主要用于各种www服务器,url可以用一个统一的格式来描述各种静态资源信息,包括图片、视频、txt、htm文件等等
    URL组成解释(也就是我们完整一条网址的解读):

  • http:// 协议

  • baidu.com 主机名,网站的域名,通过dns解析成服务器的ip地址
  • 80端口是http协议的默认端口;443端口是加密的http协议,也叫做https协议
  • 文件资源的具体地址目录(在服务器上具体什么位置,通过web服务器配置修改的)

    js代码

    Javascript互联网上最流行的前端编程语言,主要用html和web开发使用,广泛用于服务器、PC、笔记本上做展示
    js代码主要由浏览器去执行(和Java并没有关系哈~)
    js是一个轻量级的脚本语言,能够插入到html标签语言中的代码

    静态网页

    在网页设计中,纯HTML的网页文件(HTML文件中,包含只有图片、视频、js代码、css代码、gif等等)就会被称为是一个静态网页(静态网页没有和数据库打交道,仅仅是从服务器磁盘上,读取数据,返回给用户查看)
    并且静态网页是开发人员写好了什么样,用户看到的就是固定什么样子的,一旦静态网页编写完成,就不会有任何的改变了
    静态网页主要用于更新较少的展示型网站功能,产品宣传站点,适合各种中小型站点

静态网页资源,对应的文件后缀一般如下:

  • 纯文本文件:htm、html、xml、js、css
  • 图片类型文件:jpg、png、gif、bmp、ppt
  • 视频类型文件:mp4、avi、flv

静态网页特性:

  • 静态网页一般都有固定的URL地址,url地址中不包含任何的?&等特殊符号
  • 静态网页,一般发布到服务器,网页文件内容是单独的一个文件,保存在服务器上
  • 静态网页内容一般固定不变,非常容易被搜索引擎收录
  • 静态网页没有数据库支撑,在网站制作上,维护较难(缺点)
  • 静态网页交互很吵,缺少程序的动态功能加载(缺点)
  • 客户端在解析网址的时候,由于静态网页不需要和数据库交互,因此服务器能够承载更高的并发数,请求到来的时候,直接去磁盘上读取即可

    动态网页

    包含了静态网页的内容,以及能够和数据库交互,有后台程序,可以和用户交互的网页

  • 动态网页和静态网页一般都是相对而言

  • 动态网页常见特点是后缀,一般是asp、aspx、php、js、cgi,这些都是动态请求
  • 并且动态请求的url,常见会有?&=等特殊符号

特性:

  • 动态网页主要以数据库为支撑,能够大大减少网页内容的维护工作
  • 动态网页能够实现比静态网页更多的事情,登陆、注册、投票、点赞、用户管理、网站后台程序等等
  • 搜索引擎一般不会抓取网页url携带?&等特殊符号的站点,因此企业一般都制作伪静态,让一个动态网页,模拟成以html为后缀的静态网页

    网站并发压力

    并发模型

    进程是linux的资源单位
    线程是由进程发起的工作单位

    单进程模式

    单进程和单线程是一个概念,因此一个进程单位必须有一个线程单位在工作
    当大量请求进入服务器的时候,单线程情况下一个一个去处理请求,请求很容易积压,得不到想赢,这是一种没有并发概念的模式

    多进程模式

    服务器的多进程工作模式,也就是有多个进程可以处理客户端的请求

    复用的IO模型

    一个进程相应n个请求,但是不是单纯的一个单进程,而是背后生成了多个线程去工作

    单进程:一个银行,一个窗口,一个客服人员,效率慢,来的人要排队等待 多进程:一个银行,多个窗口,每个窗口一个客服人员,效率快,不用等待,但是成本高 复用IO:一个银行,多个窗口,每个窗口都有不止一个客服人员分工合作,效率更快

HTTP请求与响应

  1. 客户端和服务器建立连接,客户端发出请求,服务器进行三次握手身份确认
  2. 服务器接受到请求,linux内核根据(客户端的请求)socket进程通信管道把发给HTTP应用程序去解析(Apache,Nginx)
  3. HTTP服务器开始处理请求,对用户的请求报文进行解析,明确客户端需要的资源和请求方式等等
  4. HTTP在存储系统上,请求资源,内核去本地文件系统上读取数据
  5. HTTP服务构造响应体,应用程序创建响应报文
  6. liunx内核发出HTTP服务器构造的响应报文,发送客户端
  7. HTTP服务器会进行事务记录,记录这个流程的日志

    事务

    在计算机领域中,事务是指程序中一系列严密的逻辑性操作,并且必须保证所有的操作都能够成功的完成,如果出错,那么得保证每个操作中的更改动作,都会被撤销
    【多件事情当做一件事情来处理,要么都成功,要么只有失败】
    特性:
  • 原子性:执行命令,要么全部成功,要么全部失败,只要有一个环节出错,那么其他指令都要进行数据回滚,回滚到执行命令之前的操作
  • 一致性:事务的执行使得数据从一个状态,进入到另一个状态,但是对于数据完整性,还是保持稳定
  • 隔离性:好比多个用户并发访问数据库的时候,共同操作一张数据表,数据库会为每一个用户开启事务,不能被其他的事务所干扰,多个并发的事务操作,要进行隔离
  • 持久性:当事务正确完成后,对数据的修改是永久性的

    HTTP事物流程

  1. DNS解析

①输入网址
②浏览器去客户端本地寻找DNS缓存,查看是否有解析记录
③如果没有继续读取本地hosts文件,是否写死对应的ip地址
④ 如果没有再向本地配置的dns服务器地址,进行解析请求发送,公网的nds服务器对该域名解析
⑤最后浏览器解析域名得到对应的ip地址

  1. 客户端此时和服务器端建立TCP/IP (三次握手)

①客户端得到服务器ip后,确认客户端的user-agent是正常的浏览器,浏览器会以(1024端口~65535端口)向服务器的80端口进行请求发送,进行三次握手
②该客户端请求,经过TCP/IP的四层封包组,请求组进入到服务器的应用程序,完成解包的过程,最终和客户端建立TCP连接
③此时TCP连接上之后,开始三次握手
*客户端和服务器的断开,也需要进行一次四次挥手的过程,也就是服务器再次和客户端进行信号数据包发送,确认对方都要进行TCP断开

  1. 数据传输,发起HTTP请求

①查看用户发出的请求动作,请求方法

  • 使用web服务器的日志功能查看,查看用户发出的请求是什么类型的请求,且获取服务器资料
  • 使用浏览器的开发者模式查看,点击请求的资源名,查看请求头的类型

    常见的HTTP请求方法: get:向服务器获取数据,资源 post:向服务器提交数据,比如登陆、注册 head:获取url的响应头信息,不要响应体信息(只要脑袋,不要身体数据) put:将请求主体发送给服务器 delete:删除服务器指定的一些资源 trace:追求请求到达服务器的一些列变动