使用 SoftEther 搭建 L2TP VPN

使用 SoftEther 搭建 L2TP VPN

在openwrt上搭建 L2TP VPN 都推荐用 openswan、libreswan 比较繁琐,softether在openwrt上不知道为什么总是丢失配置文件,所以要在Linux上配置,softether这个简单易用还容易管理,也能完成多地组网的复杂操作。

安装

编译安装

1
2
3
4
5
6
7
8
9
10
# 安装编译工具
apt install build-essential gcc make wget tzdata git libreadline-dev libncurses-dev libssl-dev zlib1g-dev
# 下载源码
git clone https://github.com/SoftEtherVPN/SoftEtherVPN_Stable.git
# 编译,我编译的时候丝般顺滑,一点报错都没有(Ubuntu 20.04)
cd SoftEtherVPN_Stable/
./configure
make
# 安装
make install

开机自启

创建文件:/lib/systemd/system/vpnserver.service

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/vpnserver start
ExecStop=/usr/bin/vpnserver stop

[Install]
WantedBy=multi-user.target
1
2
3
4
# 开启这个服务
systemctl enable vpnserver.service
# 启动服务
service vpnserver start

配置L2TP

配置

咕了,这东西配置起来很容易很容易,教程特别多,都是中文的,大致说一下有两种配置方式:

一种是通过命令行配置vpncmd,这里如果你的Linux服务器是中文的,那么这个vpncmd的命令帮助都是中文的,简直太简单,这个vpncmd值得好好玩一玩,GUI配置有些时候着实是不方便。

另一种是通过管理程序配置,也是中文的,配置工具下载 https://www.softether-download.com/cn.aspx?product=softether。

如果想要访问内网的东西,需要开启SecureNAT

参考配置教程:

  1. 中文:https://noter.tw/4524/softether-vpn-架設記錄/
  2. 官方英文(不推荐):https://www.softether.org/4-docs/2-howto/9.L2TPIPsec_Setup_Guide_for_SoftEther_VPN_Server/1.Setup_L2TP%2F%2F%2F%2FIPsec_VPN_Server_on_SoftEther_VPN_Server
  3. 中文:https://libertyleadingnetwork.blogspot.com/2018/01/softethervpsvpn.html
  4. 中文:http://blog.dengxj.com/archives/9/

端口转发

如果你和我一样是在内网配置的,且有公网IP,需要在路由器上转发UDP:500UDP:4500出去,再搞一个DDNS这样就可以远程访问家里了。

Ubuntu 编译 vmfs-tool

Ubuntu 编译 vmfs-tool

VMFS 文件系统想要在 linux 里读取,需要使用vmfs-fuse,但是这个工具已经下架了,所以需要自己编译,

其实编译整理来说就是缺什么下什么,然后就编译完了。

我的系统:ubuntu 20.04

vmfs-tools 下载地址

如果只做读取使用这个就可以了

下载下来后,直接安装即可

1
opkg -i vmfs-tools_0.2.5-1_amd64.deb

挂载 VMFS 文件系统

其实挂载VMFS 文件系统很简单,类似 mount 命令

1
2
3
4
5
# 查看哪个是 VMFS
fdisk -l
# 挂载 /dev/sdb3
mkdir /tmp/vmfs
vmfs-fuse /dev/sdb3 /tmp/vmfs

或者你也可以手动编译

安装需要的库

1
apt install git build-essential gcc pkg-config xsltproc libfuse-dev uuid-dev

下载源码编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载源码
cd /tmp
git clone https://github.com/glandium/vmfs-tools.git
cd vmfs-tools
# 开始编译
./configure
make
gcc -Wall -O2 -g -D_FILE_OFFSET_BITS=64 -Ivmfs-fuse -Ilibvmfs -I/usr/include/uuid -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -c -o vmfs-fuse/vmfs-fuse.o vmfs-fuse/vmfs-fuse.c
gcc -o vmfs-fuse/vmfs-fuse vmfs-fuse/vmfs-fuse.o libvmfs/libvmfs.a -luuid -lfuse -pthread
# 安装
make install
install -s -m 0755 debugvmfs/debugvmfs /usr/local/sbin/
install -s -m 0755 vmfs-lvm/vmfs-lvm /usr/local/sbin/
install -s -m 0755 vmfs-fuse/vmfs-fuse /usr/local/sbin/
install -s -m 0755 fsck.vmfs/fsck.vmfs /usr/local/sbin/

PVE 硬盘相关

PVE 硬盘相关

休眠

PVE 硬盘不休眠的原因基本都是由于pvestatd一直在读取硬盘信息,导致不会休眠

所以问题就比较简单了

第一种方法 (比较粗暴,不推荐)

1
pvestatd stop

第二种方法

修改/etc/lvm/lvm.conf文件,开启 lvm 的 metadata 的缓存

1
2
3
4
# 开启
sed -i 's/use_lvmetad = 0/use_lvmetad = 1/g' /etc/lvm/lvm.conf
# 重启
pvestatd restart

如果开启的话,就会缓存 lvm 的信息,就不需要再读取硬盘获取了

第三种方法

修改/etc/lvm/lvm.conf文件,过滤不需要监控的盘

1
2
3
4
# 添加 "r|/dev/sd*|" 到 global_filter
global_filter = [ "r|/dev/zd.*|", "r|/dev/mapper/pve-.*|", "r|/dev/sd*|" ]
# 重启
pvestatd restart

通过以上方式允许硬盘休眠后,可以让硬盘立即休眠来测试下是否还会被唤醒

1
2
3
4
# 立即休眠
hdparm -y /dev/sdc
# 设置硬盘休眠时间为 5 分钟
hdparm -S 60 /dev/sdc

这里-S取值设定逻辑比较奇怪,本文列出部分常见取值供选:

30 = 2 min 30 sec

60 = 5 minutes

120 = 10 minutes

180 = 15 minutes

241 = 30 minutes

242 = 1 hour

243 = 1.5 hours

244 = 2 hours

持久化保存 休眠时间

不要添加到各种开机启动的脚本、crontab 中

编辑/etc/hdparm.conf就可以做到持久化保存休眠配置

第一种

在 command_line 处

1
2
3
command_line {
hdparm -S 60 /dev/disk/by-uuid/f6c52265-d89f-43a4-b03b-302c3dadb215
}

第二种

在 特定硬盘处

1
2
3
4
# 这里也可以改为 sdc 或者 /dev/disk/by-label/8TB,但是 UUID 最稳定
/dev/disk/by-uuid/91e32677-0656-45b8-bcf5-14acce39d9c2 {
spindown_time = 60
}

挂载硬盘 给 lxc

首先需要注意的是,创建 LXC 容器需要在创建时开启了特权模式,否则只能读取但无法写入数据。

假设 lxc id 是 202

使用 sd* 挂载设备 (不推荐)

1
2
3
4
5
6
# 停止
pct stop 202
# 挂载 sdc 到 /data
pct set 202 -mp0 /dev/sdc,mp=/data
# 开机
pct start 202

使用 UUID 挂载设备(推荐)

因为 /dev/sdb /dev/sdc 这种形式可能会随着插拔设备之类的发生变动,或改变顺序,而 UUID 则不会改变

1
2
3
4
5
6
7
8
# 停止
pct stop 202
# 获取设备 UUID
blkid /dev/sdc
# 挂载 sdc 到 /data
pct set 202 -mp0 /dev/disk/by-uuid/312e15c4-c8e8-4465-8099-2f1cf007fe92,mp=/data
# 开机
pct start 202

tar 解压遇到的小问题

tar 解压遇到的小问题解决

  1. 报错tar: Ignoring unknown extended header keyword时需要安装bsdtar例如Ubuntuapt install bsdtar,使用bsdtar即可轻松解决问题,参数不需要变,如tar xvf xxx.tar.gz变为bsdtar xvf xxx.tar.gz

  2. 报错Pathname can't be converted from UTF-8 to current locale.时只需要增加--warning=no-unknown-keyword参数即可,如tar xvf xxx.tar.gz变为tar xvf xxx.tar.gz --warning=no-unknown-keyword。解压出来的东西是没问题的,就是可能文件名显示有问题,不过这就是另一回事了。

如何转移 MySQL 的数据到 MongoDB

如何转移 MySQL 的数据到 MongoDB

我的系统是 Ubuntu

  1. 安装 ruby

    1
    apt install ruby
  2. 安装 mongoify

    1
    gem install mongoify
  3. 配置数据库

    1. 新建一个database.config

    2. 填写数据库配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      sql_connection do
      adapter "mysql2"
      host "localhost"
      username "root"
      password "passw0rd"
      database "my_database"
      end

      mongodb_connection do
      host "localhost"
      database "my_database"
      end
  4. 检查数据库配置

    1
    2
    3
    4
    5
    mongify check database.config
    # 如果提示 Specified 'mysql' for database adapter, but the gem is not loaded. Add `gem 'mysql'` to your Gemfile 则需要安装 mysql
    # gem install mysql2
    # 如果安装 mysql2 提示:mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h 则需要安装 libmysqlclient-dev
    apt install libmysqlclient-dev

    提示这个即可下一步

    1
    2
    SQL connection works
    NoSQL connection works
  5. 配置转移配置

    1. 先自动生成一个

      1
      mongify translation database.config > translation.rb
    2. 随后开始根据文档修改,或者如果没有需要动的结构直接迁移即可,这是文档地址)。

  6. 开始转移

    1
    mongify process database.config translation.rb

附录

  1. 转移过程中 清理/修改 数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    table "sgk" do
    # 修改列名
    column "name1", :string, :rename_to => 'username'
    # 保持原样,未作修改
    column "email", :string
    # 忽略这个列
    column "id", :key, :ignore => true

    # 保存之前操作
    before_save do |row|
    # 清理空格
    if row.username
    row.username = row.username.strip
    end
    end
    end

保存 Git 认证信息

保存 Git 认证信息

如果经常 git pull 而且总是要输入密码信息一定很麻烦

代码

1
2
3
4
5
cd codedir # 跳转到代码目录,确保其中有 .git 文件夹
git config credential.helper store # 开启密码保存功能
git pull # 输入认证信息
git pull # 验证是否需要输入认证信息
# 结束