迁移VPS L2TP VPN至Docker容器 —— Docker初上手

趁着学习IBM Cloud Private课程的机会,深入学习了一下Docker的架构和应用方式。感觉这玩意儿真是好啊,应用间隔离加上开源社区贡献各种images,完全不需要重复造轮子,要用的服务直接pull就可以了。于是打算demo一下,把VPS上的L2TP VPN服务迁移到Docker上。

现有VPS上的L2TP IPSec VPN是用xl2tpd和openswan搭建起来的,整体稳定,但经常出一些莫名其妙的连接问题,也许和伟大的墙有关。我也不能隔三岔五换IP,就当个佛系用户了。

首先要删除VPS 环境中的VPN相关包

#yum remove xl2tpd openswan

操作完成后查看udp端口500 和 4500未被占用即可

#ss -annp

接下来安装Docker。

参考官网,在vps上安装CE版本

https://docs.docker.com/install/linux/docker-ce/centos/

#yum install -y yum-utils device-mapper-persistent-data lvm2

#yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo

#yum install docker-ce

#systemctl start docker

Docker启动后,pull VPN服务。去https://hub.docker.com搜索images,发现排名第一的L2TP image是fcojean/l2tp-ipsec-vpn-server,就锁定它了。

#docker pull fcojean/l2tp-ipsec-vpn-server

按照格式要求输入参数,保存成配置文件。

#vim vpn.env

VPN_IPSEC_PSK=输入私钥
VPN_USER_CREDENTIAL_LIST=[{“login”:”用户1″,”password”:”密码1″},{“login”:”用户2″,”password”:”密码2″}]
VPN_NETWORK_INTERFACE=网卡名

提前检查IPSEC Kernel mod是否开启

# modprobe af_key

然后开启vpn服务

docker run \
–name l2tp-ipsec-vpn-server \
–env-file ./vpn.env \
-p 500:500/udp \
-p 4500:4500/udp \
-v /lib/modules:/lib/modules:ro \
-d –privileged \
fcojean/l2tp-ipsec-vpn-server

执行成功后,docker返回container编号

aa605459103f25c8bd29734e27be267da371c219f1e244fdb24c90c2a9ba7e9e

[root@albertknight ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa605459103f fcojean/l2tp-ipsec-vpn-server “/run.sh” 7 seconds ago Up 7 seconds 0.0.0.0:500->500/udp, 0.0.0.0:4500->4500/udp l2tp-ipsec-vpn-server

检查vpn login记录

#docker logs l2tp-ipsec-vpn-server

Trying to auto discover IPs of this server…

================================================

IPsec VPN server is now ready for use!

Connect to your new VPN with these details:

DNS: 8.8.8.8
Server IP: x.x.x.x
IPsec PSK: balabalabala
Users credentials :

Login : test1 Password : test1
Login : test2 Password : test2

Write these down. You’ll need them to connect!

Setup VPN Clients: https://git.io/vpnclients

================================================

Redirecting to: /etc/init.d/ipsec start
Starting pluto IKE daemon for IPsec: Initializing NSS database

.
xl2tpd[1]: setsockopt recvref[30]: Protocol not available
xl2tpd[1]: This binary does not support kernel L2TP.
xl2tpd[1]: xl2tpd version xl2tpd-1.3.6 started on aa605459103f PID:1
xl2tpd[1]: Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.
xl2tpd[1]: Forked by Scott Balmos and David Stipp, (C) 2001
xl2tpd[1]: Inherited by Jeff McAdams, (C) 2002
xl2tpd[1]: Forked again by Xelerance (www.xelerance.com) (C) 2006
xl2tpd[1]: Listening on IP address 0.0.0.0, port 1701
xl2tpd[1]: Connection established to 172.17.0.1, 50124. Local: 5584, Remote: 6 (ref=0/0). LNS session is ‘default’
xl2tpd[1]: start_pppd: I’m running:
xl2tpd[1]: “/usr/sbin/pppd”
xl2tpd[1]: “passive”
xl2tpd[1]: “nodetach”
xl2tpd[1]: “192.168.42.1:192.168.42.10”
xl2tpd[1]: “refuse-pap”
xl2tpd[1]: “auth”
xl2tpd[1]: “require-chap”
xl2tpd[1]: “name”
xl2tpd[1]: “l2tpd”
xl2tpd[1]: “file”
xl2tpd[1]: “/etc/ppp/options.xl2tpd”
xl2tpd[1]: “/dev/pts/0”
xl2tpd[1]: Call established with 172.17.0.1, Local: 63456, Remote: 25724, Serial: 1
xl2tpd[1]: result_code_avp: result code endianness fix for buggy Apple client. network=768, le=3
xl2tpd[1]: control_finish: Connection closed to 172.17.0.1, serial 1 ()
xl2tpd[1]: Terminating pppd: sending TERM signal to pid 727
xl2tpd[1]: result_code_avp: result code endianness fix for buggy Apple client. network=256, le=1
xl2tpd[1]: control_finish: Connection closed to 172.17.0.1, port 50124 (), Local: 5584, Remote: 6

尝试手机连接,迅速成功,收工!

家装设计初步规划 —— 智能家居

年中将至,准备在今年装修一下住的屋子。

一切以智能家居为前提,进行规划和设计。

前期看了不少帖子,目前总结的经验有以下几点:

  1. 留足电源插孔。
  2. 电路改造要布零火线回路
  3. 前期充分考虑软装的家具摆放位置
  4. TBD

网站恢复

2015年站点被挂马之后一气之下把博客撤下来了。

期间换了空间、换了vps,主要都在做其他事情,再也没想起来写blog。

周末突然有了心思,把备份的数据都翻了出来,花了一下午时间部署在了新的服务器上。

以后哪天有心思,还会再写写东西的。

近期也在考虑换个域名,花点时间折腾一下。

各位有缘再见。

 

在EFI Shell下刷新DELL PERC H200 Firmware

从Dell官方固件更新到了LSI的最新版,虽然理论上兼容性和稳定性都更好一些,但是毕竟不是DELL的官方版本,Ctrl+C的配置界面被屏蔽了,毫无办法。于是尝试刷回dell的bios,efi,和firmware.

尝试在windows版本的sas2flash执行-o -e 6参数,失败,提示该平台不支持此操作。估计这种清掉整个flash的操作权限级别太高了,windows这种高运行级别的搞不定。

用PE引导至dos工具箱,执行dos版的sas2flash,直接失败,提示初始化failure,LSI的FAQ还真有解释:这块板子不支持,请换别的板子尝试。

无奈只能尝试用EFI Shell来刷固件了。以前完全没有接触过,找能启动到EFI Shell的文件包就花了不少时间。Intel官网没有能方便地直接下载的连接,非常不人性化。

UEFI会读取启动介质的/EFI/BOOT/BOOTx64.efi文件,如果这个文件是shell,那么就进入命令行,如果是告诉系统加载Windows Boot Manager,那就进入系统启动流程了。

总之,找个支持UEFI的PE,写到U盘,替换EFI目录为自己的shell包。一般包含一个Apps目录来执行一些常用命令。

启动EFI Shell后,发现这货不会自己刷屏。敲一条命令刷到下面就看不见了,真是郁闷。cls命令只会把光标移到屏幕最上面,完全不管清屏的事,真不知道这code是谁维护的。

不过sas2flash.efi是可以执行的

#清空flash仅保留厂商信息
sas2flash.efi -o -e 6

#刷入原厂firmware和bios
sas2flash.efi -o -f dell.fw -b dellbios.rom

由于是盲操,等了大约5分钟,肯定刷完的时间,然后cls,执行sas2flash.efi -list看一下版本变没变过来,没问题重启。

Dell的BIOS设置界面回来了!

参考:

IBM ServeRAID M1015 Part 4: Cross flashing to a LSI9211-8i in IT or IR mode

———————————

后来发现EFI Shell不会刷屏是我机器UEFI的问题,而且华擎的板子自带了一个EFI Shell在启动选项里,都一个德行,不会刷屏。

所以我找到的EFI Shell应该是没有问题的,有需要的可以拿走。

EFI_SHELL64

通过Grub2手工引导CentOS7

处于某些原因重装了Windows系统,MBR原来的Grub2被覆盖了。需要修复grub2引导找回CentOS7

使用Live USB盘,启动系统手工重新安装grub2

mount /dev/sda2 /test
grub2-install root-directory=/test /dev/sda

重启会进入grub>界面,执行命令加载被引导的kernel和img

grub>insmod xfs #加载xfs文件系统

grub>set root=(hd0,msdos2)  #定位分区

grub>linux16 /vmlinuz-3.10.0-229.11.1.el7.x86_64 root=/dev/mapper/centos-root  #加载kernel并确认根文件系统/的位置,这里用了lvm

grub>initrd16 /initramfs-.3.10.0-229.11.1.el7.x86_64.img  #确认initrd的img文件位置

然后使用boot命令直接进入系统

socat端口转发实现穿透nat

家里的宽带一直分配内网地址,各种ddns长期处于失效状态,苦不堪言。

前一阵QNAP和花生壳合作,免费在NAS上提供了花生棒的服务(花生壳内网版),尝试了一把,真心好使!只可惜,免费用户只能做两条映射,共计1GB流量,而且线路只能选择电信。

最近在搞ESXi的实验,远程用vSphere Client连ESXi两个端口当然不够用,于是打算自己研究一下nat-ddns的实现。

搜了一下原理,其实特别简单。有一台服务器做中转,打通一条路径进行流量转发。我原以为服务器就解析一下地址然后P2P传输,看来不是。因为所有流量都被中转,所以才有了1GB的限制。

于是,核心就是必须有一台公网上的服务器,来做流量中转。这对于有VPS的同学们来说就是现成的资源。端口转发的工具一搜一大把,socat, netcat, rinetd等等…

其实哪一个都能实现功能,不过我这边路由器刷的Tomato系统刚好原生支持socat,因此就用这个命令了,支持ip、tcp、udp、ipv6、ssl….

 

#VPS端
#开启debug级别输出,不写日志直接打在stdout方便看
#vps设置30303端口监听,有请求则转发给30304端口
socat -d -d -d tcp-l:30303,reuseaddr,bind=0.0.0.0,fork tcp-l:30304,bind=0.0.0.0,reuseaddr,retry=10

 

#Router端
#开启debug级别输出
#路由器设置27777端口监听,有请求则转发给内网vm-win7主机的RDP端口
socat -d -d -d -v tcp:vpsname:30304,forever,intervall=5,fork tcp:vm-win7:3389

测试成功,由于vps在美国,远程桌面转发速度没有特别理想,但是基本可用。对于http和ssh这种开销小的,应该是没有问题了。

稍后会放RDP, SSH, HTTP的测试结果。

vSphere Client需要连接ESXi的443端口,测试这个没有成功。之前做过netstat检查,连接服务器只需要443,不知道是不是用到了ssl加密,所以还需要在socat上配置ssl。我觉得不应该,我只让它转发流量了,它就不应该管流量里面是什么。今晚再稍微做些测试,也许还有没发现的端口需要一起开启。



	

Windows对528B sector硬盘兼容性测试

由于对NAS的需求越来越多,QNAP-212P已经不能满足扩展的功能需求,开始考虑自己定制NAS软硬件系统。 出于扩展性考虑,首先入了一块磁盘扩展卡。DELL PERC H200,芯片是LSI SAS2008,刷成了LSI 9211-8i的firmware,由于前期测试暂时不用RAID,因此刷了IT模式的固件,当做HBA来使用。 测试了多块服务器换下来的硬盘,7.2K SATA,10K SAS,15K SAS,兼容性普遍很好,识别与操作都没有问题。 不过当我测试一块服务器的SAS SSD的时候,发现了问题。

系统可以识别到磁盘,并且提示进行初始化。但是不管选择GPT还是MBR,确认后都会受到I/O请求失败的报错。经过测试,各种软件均不能正常对该磁盘进行操作。换成Linux,fdisk也仅仅是能识别到名字(Ubuntu),但是不能完整识别所有信息,也不能格式化。

检查了一下,发现这块盘是528B sector,属于一种专有格式。但是普通磁盘都是512B的sector,怀疑是操作系统对该格式磁盘不兼容造成的。插回服务器重新格式化成512B sector,windows识别正常,使用也很顺利。

性能: 读取稳定在450M/s,写稳定在400M/s

 

安装CentOS7后恢复Windows引导项

以前装Linux系统引导工具还是Grub,安装完Linux会自动识别机器里的Win分区,自动添加引导。

这两天在物理机上尝试装CentOS7,发现它用的是Grub2,没有自动替我把引导项识别出来。

根据官网的tip,使用下列命令重新扫描引导。

#grub2-mkconfig -o /boot/grub2/grub.cfg

完工,重启即可

使用U盘安装新版Ubuntu时引导问题

这两天在部署新的测试机,想在旧笔记本上装几套系统。

很久没有用过U盘给物理机装Ubuntu了,用UltraISO写好U盘之后引导,发现无法进入安装或者live界面,提示:

gfxboot.c32:not a COM32R image    
boot:

尝试了很多命令不得解。后来去ubuntu论坛搜了一下,发现直接敲live就可以进入live界面,然后在live界面通过安装器进行分区和系统部署即可。

有人说是syslinux版本的问题,我看了一下,15.04是syslinux v4

换了一台有UEFI的电脑,无需人为干预顺利进入启动界面。大概是和Legacy BIOS有什么关系吧。

待查。。。