Linux之虚拟专用网络—VPN

Linux76

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

Linux之虚拟专用网络—VPN

至此,安装就完美收官喽

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

Linux之虚拟专用网络—VPN

至此,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创建一个根节点,然后每次申请锁的时候在其下创建顺序节点,接着获取根节点下所有的顺序节点并排序,获取顺序最小的节点,如果该节点的名称与当前添加的名称相同,则表示能够获取锁,否则监听根节点下面的处于当前节点之前的节点的删除事件,如果监听生效,则回到上一步重新判断顺序,直到获取锁。

总结

基于数据库分布式锁实现

优点:直接使用数据库,实现方式简单。
缺点

  1. db操作性能较差,并且有锁表的风险
  2. 非阻塞操作失败后,需要轮询,占用cpu资源;
  3. 长时间不commit或者长时间轮询,可能会占用较多连接资源

基于jdk的并发工具自己实现的锁

优点:不需要引入中间件,架构简单
缺点:编写一个可靠、高可用、高效率的分布式锁服务,难度较大

基于redis缓存

  1. redis set px nx + 唯一id + lua脚本
    优点:redis本身的读写性能很高,因此基于redis的分布式锁效率比较高
    缺点:依赖中间件,分布式环境下可能会有节点数据同步问题,可靠性有一定的影响,如果发生则需要人工介入

  2. 基于redis的redlock
    优点:可以解决redis集群的同步可用性问题
    缺点

  3. 依赖中间件,并没有被广泛验证,维护成本高,需要多个独立的master节点;需要同时对多个节点申请锁,降低了一些效率

  4. 锁删除失败 过期时间不好控制
  5. 非阻塞,操作失败后,需要轮询,占用cpu资源;

基于zookeeper的分布式锁

优点:不存在redis的超时、数据同步(zookeeper是同步完以后才返回)、主从切换(zookeeper主从切换的过程中服务是不可用的)的问题,可靠性很高

缺点:依赖中间件,保证了可靠性的同时牺牲了一部分效率(但是依然很高)。性能不如redis。

jdk的方式不太推荐。

  1. 从理解的难易程度角度(从低到高)数据库 > 缓存 > Zookeeper
  2. 从实现的复杂性角度(从低到高)Zookeeper >= 缓存 > 数据库
  3. 从性能角度(从高到低)缓存 > Zookeeper >= 数据库
  4. 从可靠性角度(从高到低)Zookeeper > 缓存 > 数据库

没有绝对完美的实现方式,具体要选择哪一种分布式锁,需要结合每一种锁的优缺点和业务特点而定。

作者:
森林木马

出处:
https://www.cnblogs.com/owenma/

Original: https://www.cnblogs.com/owenma/p/12355262.html
Author: 森林木马
Title: 常用的分布式锁和redis和zk两种分布式锁的对比