404. 抱歉,您访问的资源不存在。
可能是网址有误,或者对应的内容被删除,或者处于私有状态。
代码改变世界,联系邮箱 contact@cnblogs.com
Original: https://www.cnblogs.com/JZjuechen/p/15742721.html
Author: JZEason
Title: Linux之虚拟专用网络—VPN
相关阅读1
Title: Linux——防火墙、SELinux规则
防火墙的作用:简单来说就是放行或者阻拦某些服务、端口
1、防火墙的简单操作
# 查看防火墙状态
systemctl status firewalld
# 开启防火墙
systemctl start firewalld
# 关闭防火墙
systemctl stop firewalld
# 设置防火墙开机自启
systemctl enable firewalld
# 设置防火墙取消开机自启
systemctl disable firewalld
2、firewall的直接规则
注意:要在防火墙开启状态下才可设置
# 1、查看防火墙放行的服务
firewall-cmd --list-all
# 2、在防火墙中放行某服务,并设为永久生效
firewall-cmd --permanent --add-service=&协议名
# 3、在防火墙中放行某端口,并设为永久生效
firewall-cmd --permanent --add-port=8088/tcp
# 4、刷新(重新加载)防火墙配置
firewall-cmd --reload
网络服务及协议名对应关系:
服务名 协议名 vsftpd ftp NFS nfs SAMBA windows:cifs linux:smb、nmb APACHE http/https
3、firewall的富规则
注意:要在防火墙开启状态下才可设置
# 1、添加一条富规则(以172.25.1.0/24网段,ftp服务为例)
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.1.0/24 service name=ftp accept'
# 2、删除一条富规则
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=172.25.1.0/24 service name=ftp accept'
# 3、笼统的设置一个攻击域
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.1.0/24 reject'
# 4、为某个具体的服务设置一个攻击域
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.1.0/24 service name=ssh reject'
# 5、添加端口到防火墙中:
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.1.0/24 port port=80 protocol=tcp accept'
# 6、添加端口转发:(要先添加端口才能端口转发)
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.1.0/24 forward-port port=8080 protocol=tcp to-port=80'
tcp:有去有回,类似于打电话
udp:有去无回,类似于发传真
SElinux也是Linux操作系统的一种安全访问规则。用于确定哪个进程可以访问哪些文件、目录和端口的一组安全规则。保护的对象是 服务(进程)、 服务对应的文件(目录)、 服务对应的端口。
SElinux可以被看作是与标准权限系统并行的权限系统,如果selinux开启,以root身份运行进程,访问文件不光要受 用户对文件访问权限的限制,还要受 进程对文件selinux上下文类型的限制,否则,就算是root用户运行的进程,也不一定能访问某个文件。
1、selinux的三种模式(状态)
名称 模式 作用 enforcing 强制模式 拒绝非法访问并录入日志 permissive 许可模式(警告模式) 暂时允许非法访问并录入日志 disabled 禁用模式 允许非法访问且不录入日志
如何切换selinux的状态:
#获取selinux状态
[root@localhost ~]# getenforce
# 临时切换:
[root@localhost ~]# setenforce 0 #临时关闭selinux策略 enforcing -> permissive
[root@localhost ~]# setenforce 1 #临时开启selinux策略 permissive -> enforcing
# 永久切换:
[root@localhost ~]# vim /etc/selinux/config
SELINUX=enforcing/permissive/disabled
[root@localhost ~]# reboot
2、SELinux的上下文
在linux系统里面,每个文件、进程、端口都具有SELinux上下文,它是一种安全策略,用来判断某个进程能否访问文件、目录或端口的工具。
[root@localhost /]# ll -Z
lrwxrwxrwx. root root system_u:object_r:bin_t:s0 bin -> usr/bin
dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot
drwxr-xr-x. root root system_u:object_r:device_t:s0 dev
drwxr-xr-x. root root system_u:object_r:etc_t:s0 etc
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
...
第四列(用户:角色:类型:敏感度)
用户 -> 系统用户(system_u);root及普通用户组成的未指定用户(unconfined_u)
角色 -> 系统角色(system_r);未指定角色(unconfined_r);对象角色(object_r)
类型 -> 以_t结尾,每个服务它的三个方面的类型要一一对应,即 服务对应的文件和端口要与服务本身的SELinux上下文类型一致
敏感度 -> s0,指的是安全等级,有0、1、2三种,数值越大,灵敏度越高
# 查看文件的上下文
# 方法一:ll -Z filename
[root@localhost etc]# ll -Z samba/
# 方法二:semanage fcontext -l | grep filename
# filename要写绝对路径,且不一定能查看所有文件
[root@localhost etc]# semanage fcontext -l | grep /etc/ssh
# 查看进程的上下文
# ps -auxZ | grep 进程
[root@localhost ~]# ps -auxZ | grep sshd
# 查看所有端口上下文
# semamage port -l | grep 端口号
[root@localhost ~]# semanage port -l | grep 22
# 查看已经开放的端口上下文
[root@localhost ~]# netstat -pantZ
修改文件的上下文类型
# 临时修改:
# chcon -t 上下文类型 filename
# 将selinux设置成disabled后reboot,然后再设置成enforcing后reboot,修改会失效,将还原成原始默认类型 -> 不推荐使用
[root@localhost ~]# chcon -t httpd_sys_content_t /opt/testfile
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@localhost ~]# reboot
[root@localhost ~]# sed -i 's/SELINUX=disabled/SELINUX=enforcing/g' /etc/selinux/config
[root@localhost ~]# reboot
[root@localhost ~]# ll -dZ /opt/testfile
# 永久修改:
# semanage fcontext -a -t 上下文类型 ‘/filename(/.*)?’ #注意:这里的filename要写绝对路径
# restorecon -RFv /filename #强制递归刷新上下文类型并显示刷新过程
[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t '/opt/test(/.*)?'
[root@localhost ~]# restorecon -RFv /opt/test/
修改端口的上下文类型(添加selinux上下文类型)
# semanage port -a -t 端口上下文类型 -p tcp/udp 端口号
[root@localhost ~]# semanage port -a -t ssh_port_t -p tcp 22022
[root@localhost ~]# semanage port -l | grep ssh
3、selinux布尔值
当selinux开启时,系统默认会设置很多服务功能的开关,而且默认都是关闭的,sebool就是那个开关
getsebool -a(| grep 布尔值) #查看
setsebool bool名 on/off #设置开启或关闭
semanage boolean -l(| grep 布尔值) #查看布尔值是否永久开启(括号中右边那个值),并显示该布尔值状态的简短描述
注意:
1、文件会默认继承父文件夹的selinux类型;
2、文件被cp到新的文件夹下,会自动继承新文件夹的selinux上下文类型,但mv不会这样,仍会保留原上下文类型;
3、如果修改了某服务的配置文件位置,则必须重新修改该文件的selinux上下文类型,以重新匹配服务,否则服务无法访问该配置文件。
声明:未经许可,不得转载
Original: https://www.cnblogs.com/wzgwzg/p/15602936.html
Author: 王智刚
Title: Linux——防火墙、SELinux规则
相关阅读2
Title: Linux快速安装流量监控工具(实用版)
前言:
Linux流量监控工具,在此我推荐两种分别为:
1、nload(推荐)因为个人看着舒服点😂
2、iftop
以上两种任选其一即可,在此对两种都有介绍和安装教程,我写了,大家随意哈
nload安装及介绍
nload流量监控快速安装
1、下载所需依赖包环境
yum install -y gcc gcc-c++ ncurses-devel make wget
2、下载所需安装包
wget http://www.roland-riegel.de/nload/nload-0.7.4.tar.gz
3、解压安装包并进入解压文件
tar zxvf nload-0.7.4.tar.gz
cd nload-0.7.4
4、依次执行配置安装命令
./configure
make
make install
5、检查是否安装成功
nload
至此,安装就完美收官喽
nload介绍
nload的显示信息也是支持设置显示单位的。我们可以加入-u 参数,其后可以跟h(表示自动格式化为易读的单位)、b(表示为Bit/s)、k(表示为KBit/s)、m(表示为MBit/s),g(表示为GBit/s)。例如下面我们输入如命令"nload -u m",就是以MB为单位。
默认上边Incoming是进入网卡的流量;
默认下边Outgoing是网卡出去的流量;
默认右边(Curr当前流量)、(Avg平均流量)、(Min最小流量)、(Max最大流量)、(Ttl流量统计)
nload 网卡名称 -u 以什么单位显示
iftop安装及介绍
iftop快速安装
1、下载所需依赖包环境
yum install libpcap libpcap-devel ncurses ncurses-devel wget -y
2、下载iftop安装包
wget http://www.ex-parrot.com/pdw/iftop/download/iftop-1.0pre4.tar.gz
3、解压安装文件并进入解压文件
tar xzf iftop-1.0pre4.tar.gz
cd iftop-1.0pre4
4、依次执行配置安装命令
./configure
make && make install
5、检查是否安装成功
iftop
这里还有一点提醒大家注意,有些服务器配置时候默认网卡没有设置为外网卡,导致了iftop后数据为空,这个时候你可以执行ip addr命令获取服务器所有的网卡名称,找到对应外网的网卡唯一识别,然后输入命令如下:
ip addr
#假设外网网卡唯一ID是eth0
iftop -i eth0
至此,iftop就安装成功啦
iftop参数介绍
TX:发送流量
RX:接收流量
TOTAL:总流量
cumm:运行iftop以来的总流量
peak:峰值流量
rates:分别表示过去 2s 10s 40s时间内网卡总的平均流量
其他参数常用参数如下:
查看代码
iftop常用参数摘录
-i设定监测的网卡,如:# iftop -i eth1
-B 以bytes为单位显示流量(默认是bits),如:# iftop -B
-n使host信息默认直接都显示IP,如:# iftop -n
-N使端口信息默认直接都显示端口号,如: # iftop -N
-F显示特定网段的进出流量,如# iftop -F 192.168.1.0/24或# iftop -F 192.168.1.0/255.255.255.0
-h(display this message),帮助,显示参数信息
-p使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;
-b使流量图形条默认就显示;
-f这个暂时还不太会用,过滤计算包用的;
-P使host信息及端口信息默认就都显示;
-m设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M
进入iftop画面后的一些操作命令(注意大小写)
按n切换显示本机的IP或主机名;
按s切换是否显示本机的host信息;
按d切换是否显示远端目标主机的host信息;
按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
按N切换显示端口号或端口服务名称;
按S切换是否显示本机的端口信息;
按D切换是否显示远端目标主机的端口信息;
按p切换是否显示端口信息;
按P切换暂停/继续显示;
按b切换是否显示平均流量图形条;
按B切换计算2秒或10秒或40秒内的平均流量;
按T切换是否显示每个连接的总流量;
按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
按j或按k可以向上或向下滚动屏幕显示的连接记录;
按1或2或3可以根据右侧显示的三列流量数据进行排序;
按根据远端目标主机的主机名或IP排序;
按o切换是否固定只显示当前的连接;
按q退出监控。
Original: https://www.cnblogs.com/aerfazhe/p/15963096.html
Author: 阿尔法哲
Title: Linux快速安装流量监控工具(实用版)
相关阅读3
Title: 常用的分布式锁和redis和zk两种分布式锁的对比
常用的分布式锁
一、基于数据库实现分布式锁
1. 悲观锁
利用select ... where ... for update 排他锁
注意: 其他附加功能与实现一基本一致,这里需要注意的是"where name=lock ",name字段必须要走索引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。
2. 乐观锁
所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源,操作过程中认为不存在并发冲突,只有update version失败后才能觉察到。我们的抢购、秒杀就是用了这种实现以防止超卖。
通过增加递增的版本号字段实现乐观锁
二、基于jdk的实现方式
思路:另启一个服务,利用jdk并发工具来控制唯一资源,如在服务中维护一个concurrentHashMap,其他服务对某个key请求锁时,通过该服务暴露的端口,以网络通信的方式发送消息,服务端解析这个消息,将concurrentHashMap中的key对应值设为true,分布式锁请求成功,可以采用基于netty通信调用,当然你想用java的bio、nio或者整合dubbo、spring cloud feign来实现通信也没问题
缺点:这种方式的分布式锁看似简单,但是要考虑可用性、可靠性、效率、扩展性的话,编码难度会比较高。
三、基于缓存(Redis等)实现分布式锁
1、官方叫做 RedLock 算法,是 redis 官方支持的分布式锁算法。
这个分布式锁有 3 个重要的考量点:
- 1.互斥(只能有一个客户端获取锁)
- 2.不能死锁
- 3.容错(只要大部分 redis 节点创建了这把锁就可以)
2、下面是redis分布式锁的各种实现方式和缺点,按照时间的发展排序
- 1、直接setnx
直接利用setnx,执行完业务逻辑后调用del释放锁,简单粗暴
缺点:如果setnx成功,还没来得及释放,服务挂了,那么这个key永远都不会被获取到 - 2、setnx设置一个过期时间
为了改正第一个方法的缺陷,我们用setnx获取锁,然后用expire对其设置一个过期时间,如果服务挂了,过期时间一到自动释放
缺点:setnx和expire是两个方法,不能保证原子性,如果在setnx之后,还没来得及expire,服务挂了,还是会出现锁不释放的问题 - 3、set nx px
redis官方为了解决第二种方式存在的缺点,在2.8版本为set指令添加了扩展参数nx和ex,保证了setnx+expire的原子性,使用方法:
set key value ex 5 nx
缺点:
①如果在过期时间内,事务还没有执行完,锁提前被自动释放,其他的线程还是可以拿到锁
②上面所说的那个缺点还会导致当前的线程释放其他线程占有的锁 - 4、加一个事务id
上面所说的第一个缺点,没有特别好的解决方法,只能把过期时间尽量设置的长一点,并且最好不要执行耗时任务
第二个缺点,可以理解为当前线程有可能会释放其他线程的锁,那么问题就转换为保证线程只能释放当前线程持有的锁,即setnx的时候将value设为任务的唯一id,释放的时候先get key比较一下value是否与当前的id相同,是则释放,否则抛异常回滚,其实也是变相地解决了第一个问题
缺点:get key和将value与id比较是两个步骤,不能保证原子性 - 5、set nx px + 事务id + lua
我们可以用lua来写一个getkey并比较的脚本,jedis/luttce/redisson对lua脚本都有很好的支持
缺点:集群环境下,对master节点申请了分布式锁,由于redis的主从同步是异步进行的,master在内存中写入了nx之后直接返回,客户端获取锁成功,此时master节点挂了,并且数据还没来得及同步,另一个节点被升级为master,这样其他的线程依然可以获取锁 - 6、redlock
为了解决上面提到的redis集群中的分布式锁问题,redis的作者antirez的提出了red lock的概念,假设集群中所有的n个master节点完全独立,并且没有主从同步,此时对所有的节点都去setnx,并且设置一个请求过期时间re和锁的过期时间le,同时re必须小于le(可以理解,不然请求3秒才拿到锁,而锁的过期时间只有1秒也太蠢了),此时如果有n / 2 + 1个节点成功拿到锁,此次分布式锁就算申请成功
缺点:可靠性还没有被广泛验证,并且严重依赖时间,好的分布式系统应该是异步的,并不能以时间为担保,程序暂停、系统延迟等都可能会导致时间错误(网上还有很多人都对这个方法提出了质疑,比如full gc发生的锁的正确性问题,但是antirez都一一作出了解答,感兴趣的同学可以参考一下这位同学的文章)
四、基于zookeeper实现的分布式锁
1. 实现方式
ZooKeeper是一个为分布式应用提供一致性服务的开源组件,它内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名。基于ZooKeeper实现分布式锁的步骤如下:
(1)创建一个目录mylock;
(2)线程A想获取锁就在mylock目录下创建临时顺序节点;
(3)获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;
(4)线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点;
(5)线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。
这里推荐一个Apache的开源库Curator,它是一个ZooKeeper客户端,Curator提供的InterProcessMutex是分布式锁的实现,acquire方法用于获取锁,release方法用于释放锁。
优点:具备高可用、可重入、阻塞锁特性,可解决失效死锁问题。
缺点:因为需要频繁的创建和删除节点,性能上不如Redis方式。
2. 两种利用特性实现原理:
- 1、利用临时节点特性
zookeeper的临时节点有两个特性,一是节点名称不能重复,二是会随着客户端退出而销毁,因此直接将key作为节点名称,能够成功创建的客户端则获取成功,失败的客户端监听成功的节点的删除事件
缺点:所有客户端监听同一个节点,但是同时只有一个节点的事件触发是有效的,造成资源的无效调度 - 2、利用顺序临时节点特性
zookeeper的顺序临时节点拥有临时节点的特性,同时,在一个父节点下创建创建的子临时顺序节点,会根据节点创建的先后顺序,用一个32位的数字作为后缀,我们可以用key创建一个根节点,然后每次申请锁的时候在其下创建顺序节点,接着获取根节点下所有的顺序节点并排序,获取顺序最小的节点,如果该节点的名称与当前添加的名称相同,则表示能够获取锁,否则监听根节点下面的处于当前节点之前的节点的删除事件,如果监听生效,则回到上一步重新判断顺序,直到获取锁。
总结
基于数据库分布式锁实现
优点:直接使用数据库,实现方式简单。
缺点:
- db操作性能较差,并且有锁表的风险
- 非阻塞操作失败后,需要轮询,占用cpu资源;
- 长时间不commit或者长时间轮询,可能会占用较多连接资源
基于jdk的并发工具自己实现的锁
优点:不需要引入中间件,架构简单
缺点:编写一个可靠、高可用、高效率的分布式锁服务,难度较大
基于redis缓存
-
redis set px nx + 唯一id + lua脚本
优点:redis本身的读写性能很高,因此基于redis的分布式锁效率比较高
缺点:依赖中间件,分布式环境下可能会有节点数据同步问题,可靠性有一定的影响,如果发生则需要人工介入 -
基于redis的redlock
优点:可以解决redis集群的同步可用性问题
缺点: -
依赖中间件,并没有被广泛验证,维护成本高,需要多个独立的master节点;需要同时对多个节点申请锁,降低了一些效率
- 锁删除失败 过期时间不好控制
- 非阻塞,操作失败后,需要轮询,占用cpu资源;
基于zookeeper的分布式锁
优点:不存在redis的超时、数据同步(zookeeper是同步完以后才返回)、主从切换(zookeeper主从切换的过程中服务是不可用的)的问题,可靠性很高
缺点:依赖中间件,保证了可靠性的同时牺牲了一部分效率(但是依然很高)。性能不如redis。
jdk的方式不太推荐。
- 从理解的难易程度角度(从低到高)数据库 > 缓存 > Zookeeper
- 从实现的复杂性角度(从低到高)Zookeeper >= 缓存 > 数据库
- 从性能角度(从高到低)缓存 > Zookeeper >= 数据库
- 从可靠性角度(从高到低)Zookeeper > 缓存 > 数据库
没有绝对完美的实现方式,具体要选择哪一种分布式锁,需要结合每一种锁的优缺点和业务特点而定。
作者:
森林木马
出处:
https://www.cnblogs.com/owenma/
Original: https://www.cnblogs.com/owenma/p/12355262.html
Author: 森林木马
Title: 常用的分布式锁和redis和zk两种分布式锁的对比