防火墙
什么是防火墙?防火墙其实就是一个隔离的工具,工作于主机或者网络的边缘,对于进出本主机或者网络的报文根据事先定义好的网络规则做匹配监测。
防火墙可以简单地划分为两大类:主机防火墙 网络防火墙
又可以分为:硬件防火墙、软件防火墙。
对于软件防火墙,如果设立匹配较多,速度会很慢。
硬件防火墙在硬件上处理远超于软件防火墙。
linux主要分为两个部分:
内核空间——tcp/ip协议站共作在内核空间
用户空间
防火墙firewalld——其中就有netfilter来过滤进出的报文。
四表五链:
表: filter nat mangle raw
应用优先级:raw>mangle>nat>filter
常用优先级:filter nat mangle raw
链:prerouting input forward output postrouting
各表中的链:
filter : INPUT FORWARD OUTPUT
nat:PREROUTING OUTPUT INPUT POSTROUTING
mangle:PREROUTING INPUT FORWARD OUTPUT POSTROUTING
raw:PREROUTING OUTPUT
firewalld是工作在liunx的内核空间之中的,那么我们用户是无法直接对其进行操作的。所以liunx提供了一种工具来实现
用户对于firewalld的网络规则的操作,那就是iptables,iptables是用来调度内核中的表和链的。
各表的功能:
filter:过滤,防火墙
nat:网络地址转换,network address translation
mangle:拆分报文,做出修改,封装报文
raw:关闭nat表上启用的连接追踪机制
添加规则的考量点:
1、要实现什么功能:判断在哪张表上。
2、报文的流向的路径:判断在哪条链上。
[jerry@centos ~]$ sudo iptables -L -n
[sudo] jerry 的密码:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
iptables工具:
-L:以列表的形式查看
-n:以数字形式显示
-t:指定表
-P:指定链的默认规则
-F:清空所有的规则
-X:清除自定义链
-j:指定要执行的操作
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
SNAT:源地址转换
-A:append追加策略
-s:source源ip(可以是网段)
-d:destination源ip(可以是网段)
-I:insert插入策略
-p:protocol指定协议
--dport:指定目标端口
--sport:指定源端口
--line-num:显示规则的行号
-D:按照行号删除某链中的规则
-i:指定网卡interface
iptables -X #删除自定义链
iptables -L -n
iptables -t nat -L -n --line-number
内核工作在内存当中。关机就丢失数据,就需要重设,但是可以事先将规则写到文件里。
对于firewalld是没有进程的,集成在内核当中,开机防火墙就存在,只是使用与不使用的区别。
iptables-save > rules.txt #存储规则到文件
iptables-restore < rules.txt #加载规则到四表五链
iptables -X #清除自定义的链
iptables -L -n
filter表:过滤
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p icmp -j DROP #ping提示连接超时
iptables -L -n
iptables -F #清所有的规则
iptables -t filter -A INPUT -s 192.168.27.0/24 -d 192.168.27.20 -p icmp -j REJECT #ping提示无法连接到端口
iptables -t filter -A INPUT -s 0.0.0.0 -d 192.168.27.20 -p icmp -j REJECT #决绝所有ip来ping本主机
拒绝访问本主机的web服务:
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
iptables -t filter -A OUTPUT -p tcp --sport 80 -j DROP
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p tcp --dport 80 -j REJECT
使用:telnet 192.168.27.20 80
iptables -t filter -P INPUT DROP
ssh远程连接也是通过tcp协议:
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p tcp --dport 22 -j ACCEPT
iptables -L -n
-i——指定网卡:
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -i ens33 -p icmp -j REJECT
iptables -t filter -A OUPUT -s 192.168.27.20 -d 192.168.27.1 -o ens33 -p icmp -j REJECT
iptables -t filter -A INPUT -i ens33 -p icmp -j DROP
iptables -t filter -A OUTPUT -o ens33 -p icmp -j REJECT
iptables -L -n --line-num #显示规则的行号,便于删除
iptables -t filter -D INPUT 2 #删除filter表上INPUT链上的2号规则
nat表:地址转换
#开启ipforward的核心转发功能
临时性:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久性:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
使用Sysctl -p来生效
#源地址为192.168.20.2的主机地址经过防火墙都转换成172.16.100.1这个地址(snat——源地址转换)
iptables -t nat -A POSTROUTING -s 192.168.20.2 -d 172.16.100.2 -j SNAT --to-source 172.16.100.1
#访问目标地址为172.16.100.1的这个机器并且是tcp协议80端口都转发给192.168.20.2的80端口(dnat——目标地址转化)
iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --deport 80 -j DNAT --to-destination 192.168.20.2:80
#访问目标地址为172.16.100.1的这个机器并且是tcp协议80端口都转发给192.168.20.2的8080端口(dnat——目标地址转化)
iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --deport 80 -j DNAT --to-destination 192.168.20.2:8080
如果将IPFORWARD链上的转发功能给关掉就无法实现了。
iptables -P IPFORWARD DROP
iptables -t nat -A POSTROUTING -s 192.168.20.2 -d 172.16.100.2 -p tcp --dport 80 -j SNAT --to-source 172.16.100.1
iptables -t nat -A PREROUTING -s 172.16.100.2 -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2:9999
iptables -t nat -L -n #查看两条链上的规则
系统的扩展方式:
scale up:向上扩展
scale out:向外扩展
也即是走质量或者走数量。
集群类型:LB HA
LB集群的实现:
硬件:FS Redware
软件:lvs haproxy nginx
基于工作协议层划分:
传输层:
lvs:工作在内核空间之中,属于四层LB。
haproxy:1、mode tcp,如果工作在应用层,只能调度http协议。如果基于tcp协议他能够调度https,mysql等常用的tcp协议。
2、haproxy只是模拟tcp协议,因为tcp协议工作在内核之中,而haproxy属于应用程序工作在第七层,是工作在某个套接字上的应用程序。
应用层:
haproxy lvs
LVS
linux virtual server
工作在input链上的,lvs接受报文转发的流程:PREROUTING —— INPUT —— POSTROUTING
用户空间使用ipvsadm定义转发规则,通过系统调用将规则发送给内核中的ipvs
Lvs——处理并发上不封顶
Haproxy——最多处理并发3万
Nginx——微线程,io处理切换,一遇见io就切换
lvs术语:
调度器——director server(DS)
后端真实处理服务器——Real server (RS)
client ip —— CIP
Director virtual ip —— VIP
director ip —— DIP
Real server ip —— RIP
ipvs工作原理:
报文从PREROUTING进入,按正常顺序流入INPUT链,lvs工作在INPUT链上,根据所匹配的规则,符合规则的报文会被LVS强行拉到POSTROUTING链上
然后根据规则流通出去。
lvs的模式:
lvs-nat(其实就是一个DNAT)
lvs-dr(direct routing)
lvs-tun(ip tunneling)
lvs-nat:多目标的DNAT,通过修改请求报文的ip和端口至挑选出来的某个RS的RIP地址来实现转发。
特点: 1、RIP应该和DIP使用私网地址,且RS的网关应该指向DIP。
2、请求和响应报文都要经过director server,因此在并发量较高的情况下,director server有可能成为瓶颈。
3、支持端口映射。
4、RS可以是任意的OS。
5、RS的RIP和director的DIP必须在同一个网段。
** lvs-dr:路由模式**
交换机通过mac地址寻址的方式来找主机。
通过修改请求报文的目标mac地址进行转发。
特点:1、保证前端路由器将目标ip为vip的请求发送给director server
解决方案:静态绑定 arptables 修改RS的内核参数
2、RS和DS必须在同一个物理网络之中。
3、请求报文经过director调度,但是响应报文一定不能经过director
4、不支持端口映射
5、RS可以是大多数的OS
6、RS的网关不能指向DIP
lvs支持的算法:
静态方法:依据算法本身进行调度
RR:round robin轮调
WRR:weighted RR
SH:source hash,实现session保持的机制
DH:destination hash ,将同一个目标的请求始终发往同一个RS
动态方法:gun算法以及各RS的当前负载情况进行调度
LC:least connection
overhead=active*256+inactive
WLC:weighted LC
overhead=(active*256+inactive)/weighted
overhead较小的即为被挑选的主机
SED LBLC LBLCR
lvs—nat模式配置:
网络环境说明:
DS:外网网卡和内网网卡
外网网卡:192.168.27.10
255.255.255.0
192.168.27.1
内网网卡:172.16.100.1
255.255.255.0
RS1:网关指向DS的内网网卡
172.16.100.10
255.255.255.0
172.16.100.1
RS2:网关指向DS的内网网卡
172.16.100.20
255.255.255.0
172.16.100.1
安装lvs:yum install ipvsadm -y
DS开启路由转发模式:
临时性:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久性:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
使用Sysctl -p来生效
ipvsadm配置:
ipvsadm -A -t 192.168.27.10:80 -s rr
ipvasdm -a -t 192.168.27.10:80 -r 172.16.100.10 -m
ipvsadm -a -t 192.168.27.10:80 -r 172.16.100.20 -m
-A : 添加virtual server
-D : 删除virtual server
-s :调度算法
-r :真实的real server
-m : nat模式
-t :tcp协议
ipvsadm也是工作在内核空间的,所以规则需要写入文件:ipvsadm-save > a.txt 和iptables是类似的。
lvs—dr模式配置:
direct-server:192.168.27.20
real-server:192.168.27.30
real-server:192.168.27.40
#vip为虚拟服务ip
vip:192.168.27.250
direct-server:
yum install ipvsadm -y
direct-server:
ipvsadm -C #清除配置信息
ipvsadm -A -t 192.168.27.250:80 -s rr #-A为ADD -t为tcp -s rr 为轮调算法
#添加两台real-server
ipvsadm -a -t 192.168.27.250:80 -r 192.168.27.30:80 -g
#-a为add -t:tcp -r:realserver -g为DR路由模式。
ipvsadm -a -t 192.168.27.250:80 -r 192.168.27.40:80 -g
#配置网卡的子网口为vip,ip地址为192.168.27.250
ifconfig ens33:0 192.168.27.250 broadcast 192.168.27.250 netmask 255.255.255.255 up
#添加路由(访问192.168.27.250都走ens33:0这个网卡)
route add -host 192.168.27.250 dev ens33:0
real-server:
#在回环地址上配置服务ip(vip)
ifconfig lo:0 192.168.27.250 broadcast 192.168.27.250 netmask 255.255.255.255 up
#添加路由
route add -host 192.168.27.250 dev lo:0
arp_ignore:定义接受到ARP请求时的响应级别
0——默认,只要本地配置的有响应地址都给予回应
1——仅仅在目标IP是本地地址,并且是配置在请求进来的接口上的时候才给予响应
(仅在请求的目标地址配置请求到达的接口上的时候,才给予响应)
arp_announce:定义将自己的地址向外通告时的级别
0——默认,表示使用配置在任何接口的任何地址向外通告
1——尽量仅向目标网络通告与其网络匹配的地址
2——仅向与本地接口上地址匹配的网络进行通告
#为了实现在访问vip的时候direct-server响应,然后转发给real-server,再由real-server回应并返回vip地址,需要执行以下配置:
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
#如果需要关闭这些功能
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
#备注
如果没有ifconfig这个命令:yum install net-tools -y
配置多个虚拟ip——ens33:1 or ens33:2