情丿本是债 发布的文章

密码存储方案更改后,平滑过渡的几个方案

最近发现一个项目的密码存储方案采用的容易被爆破的方式,因此更换了新的存储算法,由此导致密码需要平滑过渡。
1.暴力重置:让用户在登陆之前必须重置密码,采用新算法入库密码,缺点:太不友好。有点:少写代码

2.嵌套加密:举个例子,用户的密码是password,之前用的md5存储,现在更换为argon2i,那么:
老的已经md5的密码全部做一次argon2i后入库:

argon2i(md5(password)) #代码语法不对,表示含义而已

3.登陆时验证并切换进入新算法
数据库新增一个密码是否更新算法的字段。在登陆的时候,当用户输入密码,发现没有更新算法,使用老算法做验证,验证成功后视情况调用两步验证验明正身,验证后使用新算法加密密码后入库。

记录一次持续集成的代码更新监控两种实现方式

持续集成是一种软件开发的实践,通过持续集成,可以快速完成调试、测试等过程,在软件开发时提高开发效率。
这里的持续集成将会通过两种不同的方案来实现。整体流程均如下:

git仓库代码更新 --> 集成系统检测到代码更新 --> 集成系统获取新代码 --> 集成系统编译/打包/上线新代码

在获取代码更新的时候,有两种方案,一种是通过webhook来实现:
https://developer.github.com/webhooks/
webhook是一种callback的形式。简单的说,在这篇文章的环境下,就是每次更新后,git系统都会通知集成系统 代码已经更新,剩下的交由集成系统完成。
缺点:webhook需要集成系统对外暴露一个回调接口,如果出现集成系统部署在内网,git系统在外网,又难以实现端口映射等对外暴露回调接口的时候,就需要让集成系统去主动查询,也就是下面这种方案

第二种方案是:集成系统定时查询和更新git仓库上代码:
通过crontab等方式,定时启动集成系统的更新查询模块,当查询到的版本号与集成系统本地代码的版本号不同的时候,启动持续集成的后续流程。

上次基于第二种实现,写了一个内网gitbook自动更新的功能。然后重装代码丢了,就不上代码了。圣诞快乐

记一次通过Nginx为移动端和PC端返回不同页面内容且不影响的URL的处理方案

首先说下需求,由于WEB没写响应式页面,而是写了独立的PC和移动页面,导致必须要通过其他方式判断用户设备并且给出相应内容

初步的解决方案是

  • 通过前端JS跳转
  • 额外写一个index 隐藏跳转过程和url,根据用户UA加载移动端或者PC端代码
  • 通过服务端判断用户UA 返回不同内容

讨论结果是

  1. 通过前端JS跳转会导致移动端URL暴露,在用户做二次分享的时候体验也不好
  2. 额外写一个index来动态加载代码的方法我觉得挺棒的,但是前端太懒了不想写
  3. 通过Nginx判断UA 返回内容,并且保证URL不变

好吧那就开写

先交代服务器情况 /home/www/ 是根目录 PC代码在test里 移动端代码在 test/mobile里

最先用的 if 里嵌套 alias 的方法 代码如下(注意:这种代码是错误的)

location /test/ {
 
if ( $http_user_agent ~ "(iPhone)|(Android)" ){
        alias /home/www/test/mobile/;
}

但是Nginx提示这种语法不支持。。。。
报错内容

nginx: [emerg] "alias" directive is not allowed here in /etc/nginx/sites-enabled/default:49

关于if的各种坑,可以查看 https://xwsoul.com/posts/761?tdsourcetag=s_pctim_aiomsg
感觉写的还不错

然后咨询和讨论得到两种解决方法

  1. 通过 rewrite 和 location 做两次处理
  2. 通过 if 内嵌变量,然后把用alias+变量的方法间接处理

上代码

方案一

    location ~ ^/test(/.*) {
    set $way $1;
            if ( $http_user_agent ~ "(iPhone)|(Android)" ){
        rewrite ^ fuckurl$way;
    }
}

location fuckurl/ {
    internal;
    alias /home/www/test/mobile/;
}

方案二

location /test/ {
set $getdir "/home/www/test/";
            if ( $http_user_agent ~ "(iPhone)|(Android)" ){
        set $getdir "/home/www/test/mobile/";
    }
alias $getdir;
}

都实测过了,代码能用

Proxmox 第一次部署经历

由于要去托管一台机器,由于机房运维方式过于古老,如果直接在机器系统上操作,出了问题需要找客服来手动维修,所以考虑使用虚拟化方案,最先本来只了解到QEMU Docker LXC 等方案。咨询学长后了解到Proxmox的解决方案,它可以一次性管理Kvm和LXC的虚拟化方案,同时提供图形化界面,而且经过使用后,真的觉得其易用性非常到位。

首先是安装:
系统基础平台使用Debian9.4,安装参考

https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Stretch

首先是修改主机名
一定要按照要求改,例如主机名为 49tql 公网IP是49.49.49.49
那么一定要添加

49.49.49.49 49tql.proxmox.com 49tql pvelocalhost

这个浪费了我几个小时。

然后开始加入他的源,

echo "deb [arch=amd64] http://download.proxmox.com/debian/pve stretch pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list

下载GPG

wget http://download.proxmox.com/debian/proxmox-ve-release-5.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg

开始更新

apt update && apt dist-upgrade

开始正式安装

apt install proxmox-ve postfix open-iscsi

会让你选择一个邮件服务器的什么玩意,不知道是啥,按照他的提示,如果不知道,就选local only

然后,重启服务器

reboot

重启后应该就能打开它的web管理页面了

注意页面是https

https://49.49.49.49:8006

进去后先加网桥,
名称 vmbr0
IP地址 192.168.3.1自己想个内网
掩码 255.255.255.0自己写
桥接端口 eno0写你的网卡名字

其他都不要填

然后开NAT 和 IP转发

iptables -t nat -I POSTROUTING -s 192.168.3.0/24 -o eno1 -j MASQUERADE

echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-ip_forward.conf && sysctl -p --system

接下来是把刚才的iptables持久化

apt install netfilter-persistent iptables-persistent
netfilter-persistent save

然后就可以开小鸡了,KVM 的直接下载官方安装镜像,放到 /var/lib/vz/template/iso
然后挂载成CD后进虚拟机开始安装。

小鸡里面静态IP写刚才的内网IP段内的,网关也写刚才那里面的 192.168.3.1 (这个可以自定义网段)。

好像差不多就这样了,剩下的还有端口转发,也用iptab写,我还没操作。先去买服务器了

聊聊重邮的内网和外网

什么是内网?

局域网(Local Area Network, LAN)

注:为了信息安全,隐藏了内网相关敏感信息,如果需要,请内网查看:

http://gogs.sret1.st.tn/SRE2017/wiki/wiki/%E8%81%8A%E8%81%8A%E9%87%8D%E9%82%AE%E7%9A%84%E5%86%85%E7%BD%91%E5%92%8C%E5%A4%96%E7%BD%91

参考链接

  1. https://zh.wikipedia.org/wiki/%E5%B1%80%E5%9F%9F%E7%BD%91
  2. https://baike.baidu.com/item/%E5%B1%80%E5%9F%9F%E7%BD%91/98626

局域网(LAN)是一个可连接住宅,学校,实验室,大学校园或办公大楼等有限区域内计算机的计算机网络 [1]。相比之下,广域网(WAN)不仅覆盖较大的地理距离,而且还通常涉及固接专线和对于互联网的链接。 相比来说互联网则更为广阔,是连接全球商业和个人电脑的系统。

按照标准,局域网被分配了指定段的IP,专门用于局域网连接,。也就是说,这些IP,在公网上是不会被使用的,你可以自由的分配使用这些IP。

  1. 10.0.0.0/8 地址范围:10.0.0.0 至 10.255.255.255 共有2的24次方个地址
  2. 172.16.0.0/12 地址范围:172.16.0.0 至 172.31.255.255 共有2的20次方个地址
  3. 192.168.0.0/16 地址范围:192.168.0.0 至 192.168.255.255 共有2的16次方个地址
  4. 100.64.0.0/16 这是留给运营商做局域网的IP段,一般我们不用

对于重邮来说,我们有一个内网,重邮内网的范围是多少呢?

(为了安全,这一段隐藏了)

其中 2 6 是符合IP分配标准的

剩下的几个呢?

其实,其中1 3 4 5 是没有问题的。

为什么呢?

因为这些公网IP其实是属于重邮的(好像是吧,第一个肯定是,后面三个好像是电信租给重邮的)

这些IP段就可以同时从公网和内网访问

这些IP通过内网直连,而不绕行公网,是有好处的。

  1. 他可以节约公网流量,甚至我们不需要公网就可以打开这些网站。而且,他可以跑满带宽,这个跑满不是指的你买的带宽,而且指的网线、交换机、路由器的硬件限制。
  2. 其中类似于教务在线,为了信息安全 xxx.xxx.xxx.xxx(为了安全,这一段隐藏了) 他屏蔽了从公网来的请求

但是呢,最后的7 8 9 是有问题的,这两个段的IP 被分配给 WIFI局域网 但是他的所有者是谁呢,我们来查一下

http://rwhois.he.net/whois.php?query=172.32.0.0

OrgName:        T-Mobile USA, Inc.
OrgId:          TMOBI
Address:        12920 SE 38th Street
City:           Bellevue
StateProv:      WA
PostalCode:     98006
Country:        US
RegDate:        2003-01-02
Updated:        2017-01-28

所以,这家美国公司躺枪了,所有从我校本来应该访问到美国的流量,居然被指向了内网。

那,我们能怎么办呢?我们只能在心里画圈圈。

聊完这些,我们来谈谈如何连接内网:

附:有些说寝室网线插上没网的,寝室只有一根网线是入户线,很多寝室室内提前安好三根分线,需要自己接交换机。

没办网或者电信用户教程

第一步:把寝室入户的网线插入交换机(还有些人喜欢叫他分线器)如果你寝室里只有里一个人用网线,你也可以不插交换机

第二步:从交换机接一根线到你的电脑里

大功告成了,剩下的IP地址分配等事情,内网上的DHCP服务器会帮你解决好。(有些楼栋的DHCP服务器无法为linux系统分配IP,这个有点迷,无解。。。)

没办电信网?不存在的,都说了内网不收费的,插上网线就能用。
如果里有电信网,也是直接使用内网就OK了,没有影响,电信客户端会帮你解决这些问题。

移动和联通用户如何使用呢?(或者手机开热点)

1. 断开电脑所有连接(这是为了好找活动连接,如果自己找得到,可以不用全部断开),插上移动网卡并连接网络(或者连接上手机热点)
2. 修改移动网卡的跃点数
进入相关设备的网络设置,再进入internet TCP/IP的属性设置,再进入高级属性设置

默认情况下是勾选的“自动跃点”,不要选择它,手动输入“接口跃点数”:10。

输入的数字越小,优先级越高,这样可以手动控制哪个路由的优先级了
然后插上寝室网线
3. 先下载脚本,然后插上内网网线,最后执行内网路由表修改脚本

(外网下载地址:(为了安全,这一段隐藏了))