创世神域

Nothing is impossible.

@Puteulanus6月前

06/2
22:30
学习心得

在 DO 的 Centos 7 上运行 OpenVZ 容器

首先安装 EPEL,openvz-release 里的有些软件包的依赖默认源没有:

yum install epel-release -y

然后安装 openvz-release:

yum localinstall -y https://download.openvz.org/virtuozzo/releases/openvz-7.0.3-479/x86_64/os/Packages/o/openvz-release-7.0.3-3.vz7.x86_64.rpm

导入 openvz-release 的 GPG key:

rpm --import http://repo.virtuozzo.com/vzlinux/security/VZLINUX_GPG_KEY

升级一下软件包,这一步很重要,特别 openvz-release 的版本得更新:

yum update -y

然后安装 OpenVZ 的内核和基础软件包:

yum install -y vzkernel prlctl prl-disp-service

装完 reboot 重启让系统用新内核跑起来。

OpenVZ 7(Virtuozzo) 要求 /vz 必须是 ext3 或者 ext4 的,重启之后首先把服务停下来:

systemctl stop vz

将原来 /vz 的东西备份:

mv /vz /vz_bak

建立挂载用的 ext4 镜像:

dd if=/dev/zero of=disk.img bs=10M count=1024

建立文件系统:

mkfs.ext4 -F disk.img

创建挂载点:

mkdir /vz

挂载镜像到 /vz:

mount -t ext4 -o loop disk.img /vz

复制原 /vz 目录内的文件到新目录:

cp -r /vz_bak/* /vz/

启动服务:

systemctl start vz

创建容器磁盘的时候需要一些内核模块,将他们加载:

modprobe ploop
modprobe pfmt_ploop1
modprobe pfmt_raw
modprobe pio_direct

查看一下哪些系统模版可用:

vzpkg list --available

安装 Centos 7 的系统模版:

vzpkg install template centos-7-x86_64

创建容器:

prlctl create test --vmtype ct

启动容器:

prlctl start test

在 DO 的 Centos 7 上运行 OpenVZ 容器

@Puteulanus6月前

05/24
14:53
学习心得

OSX 使用 Parallels Desktop 单机 LEDE 软路由

用了一段时间了,顺便记录一下。

跟 VRouter 其实是一个意思,但 VRouter 我死活启动不了,只能自己动手搞个了。

首先下载 LEDE x86 的镜像,解压(系统自带的解压双击就行,命令行下是用 gunzip),后缀名改为 hdd。

然后在 PD 里新建一个空白虚拟机,系统类型选择其他 Linux。

配置可以视情况分配,我是给的 256M 内存。记得将启动和关机设为“始终在后台准备就绪”,这样即使 PD 软件关闭之后或者电脑重启之后,虚拟机也会在后台运行。

删除默认的硬盘、CD驱动器、USB 等设备,添加一个新硬盘,选择刚刚解压出来的 hdd 文件。PD 会提示需要转换格式,确认转换。

保存之后创建虚拟机。

关闭虚拟机,然后在 PD 的软件设置中(注意不是虚拟机的设置)新建一个 host only 的网络,配置如图:

因为 LEDE x86 默认设置的 IP 地址是 192.168.1.1,如果家里网络是 192.168.1.x 网段的可能需要把 WiFi 先断开来避免冲突。

保存设置后进入新建的虚拟机的设置,把网络模式改为刚刚创建的网络。

保存后再次启动虚拟机,然后就可以在浏览器中访问 192.168.1.1 看到 LEDE 的网页了,默认密码为 koolshare。

首先修改网卡的地址,避免跟主机 IP 产生冲突。

保存之后关闭虚拟机,修改刚才新建的 host only 的网络中的 DHCP 设置为对应的网段,并且勾选“在系统偏好设置中显示”。

然后进入虚拟机设置,为虚拟机新增一张网卡,模式选择为桥接 WiFi 网卡。

然后重新打开虚拟机,访问新的 IP 地址进入管理界面。

修改默认 LAN 口的设置,在物理设置中取消 eth0 以外的所有勾选。

然后新建一个 WAN 接口,使用 DHCP 客户端模式,勾选 eth1 接口。

保存后确认 WAN 口获取到了上级路由器分配的 IP 地址:

在 Mac 的 系统偏好设置-网络 中,找到虚拟机的网络,在空白的路由器栏填上 LEDE 虚拟机的 IP 地址。

然后只需要在 Terminal 中执行 sudo route change default 192.168.66.1 ,将虚拟机设为默认网关,就可以临时以虚拟机为软路由访问网络了。

不过网关设置在网络发生变化(比如 WiFi 断开和重连之后)都会被更新,如果希望长期默认使用虚拟机软路由作为网关的话,可以修改系统网络设置中的服务顺序:

将创建的网络接口拖至第一位,即可将它作为默认网关。

OSX 使用 Parallels Desktop 单机 LEDE 软路由

@Puteulanus1年前

07/25
18:20
学习心得

新版 Bluemix 一键搭建 SS 脚本

2017.12.7 更新:

Coding 和 Bluemix 的连接好像已经不大稳定了,可以去 codenvy.io 部署,需要注册。

创建 Workspace 的时候选 Blank:

创建完会有一个 Terminal 窗口,注意新注册的账号的集群可能是德国的,执行的时候要加 de 参数。

感觉窗口小的话可以双击 Terminal 那个标签页,跑完和 Coding 那边是一样的。

2017.10.28 更新:

加了 bbr 参数,和地区的参数一个用法,比如悉尼地区的的话在命令后边加 au bbr 就行,不加默认不用。

2017.10.27 更新:

在面板上创建的部署,在 编辑YAML 中下图的位置插入一个 array ,名字“externalIPs”,成员 0 为节点的公共 IP,点击更新之后就可以使用容器本身设置的端口了,这个端口不受 NodePort 的范围限制,可以使用低位端口,比如 80 和 443。

脚本里创建的 SS 的端口改到 443 了。

2017.10.21 更新:

加了区域的参数,无参数直接执行默认美国南部,其他仨区域用参数 au、uk、和 de。

使用的时候简单加在命令后边,比如部署悉尼区域的话,写成这样:

bash <(curl -Ls http://url.cn/4CIc8M7) au

就行了。

可能因为 Bluemix 政策有调整,美国南部区域现在已经没法创建集群了。

KCP 的创建可以参考 这里 ,同理管理面板上也可以运行其他程序的镜像。

分割线。

Bluemix 把 Docker 停止使用了,老脚本彻底变成历史。。

新的 Kubernetes 现在新用户可以免费体验(属于 Lite 可以免费使用的范围),不知道以后会不会变,不过试了下感觉倒是真蛮好用的。。

在执行脚本之前,你需要有一个 Bluemix 账号,并且完成了 Kubernetes 集群的创建与部署,注意那个部署可能长达好几个小时,必须等节点状态变成就绪了才能开始跑脚本。

Read More →

新版 Bluemix 一键搭建 SS 脚本

@Puteulanus2年前

07/30
19:38
未分类

在Centos7上修改qcow2镜像

因为要在 OpenStack 的平台上批量部署服务,为了简化操作,需要自己先准备一个部署好了服务的 qcow2 镜像。比较简单的方法是使用模版镜像启动虚拟机,进行完修改之后再保存,不过本地上传速度相当悲剧,加上手上又没有独服能用,所以只好选在 vultr 使用 qemu 进行虚拟化。这里记录一下操作过程。

首先安装虚拟化工具:

yum install -y libvirt-client virt-manager virt-viewer guestfish libguestfs-tools virt-top virt-install

修改 qemu 启动用户,因为默认是 nobody 启动的,读 root 用户的文件的话会因为权限问题读不到。

编辑

/etc/libvirt/qemu.conf

找到:

#user="root"

#group="root"

去掉注释。

启动服务:

systemctl start libvirtd

然后创建子网配置:

cat << _EOF_ >default.xml
<network>
<name>default</name>
<bridge name="virbr0"/>
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254"/>
</dhcp>
</ip>
</network>
_EOF_

用 libvirt 创建一个虚拟子网:

virsh net-define ./default.xml

virsh net-autostart default

virsh net-start default

打开转发:

sysctl -w net.ipv4.ip_forward=1

echo net.ipv4.ip_forward = 1 >> "/etc/sysctl.conf"

sysctl -p

systemctl daemon-reload

安装 pip 与所需的依赖:

yum install -y python-devel python-setuptools

yum groupinstall -y "Development tools"

easy_install pip

安装 OpenStack 客户端:

pip install python-openstackclient

导入 rcFile 初始化配置:

source rcFile

列出初始的 image 列表:

openstack image list

这里选择 Centos 6.5 的镜像下载:

openstack image save --file centos_6.5-20150122-x86_64.qcow2 aceefa6f-7914-49df-839b-61bf6cc97694

下载完成之后先修改一下 root 密码,否则启动之后会出现无法登陆的情况:

export LIBGUESTFS_BACKEND=direct

virt-sysprep --root-password password:mypassword -a centos_6.5-20150122-x86_64.qcow2

然后编辑一下引导文件:

virt-edit centos_6.5-20150122-x86_64.qcow2 /etc/grub.conf

在 kernel /boot/vmlinuz… 那一行的后边加上

no_timer_check

否则 qemu 启动时检查计时器会出现无法引导的情况。Centos 7 的话引导文件是在 /etc/grub2.cfg ,需要修改两行 linux16 开头的引导命令。

查看 CPU 支持的模式:

qemu-x86_64 -cpu ?

命令会列出所有支持的模式,这里使用 kvm64

启动虚拟机:

virt-install --virt-type qemu --cpu kvm64 --ram 2048 --name centos_6.5 --disk path=centos_6.5-20150122-x86_64.qcow2,format=qcow2,device=disk,bus=virtio --network network=default,model=virtio --os-type=linux --nographics --import --vcpus 8

等到引导 log 刷完,使用之前修改的 root 密码登陆即可。

如果使用过程中需要断开与虚拟机的连接,可以按下 ctrl + ] 。重新连接至虚拟机则使用

virsh console centos_6.5

命令。

如果需要从外部进行登陆的可以开一个 screen ,执行:

socat TCP4-LISTEN:10022,reuseaddr,fork,su=nobody TCP4:192.168.122.231:22

将子网中的虚拟机的 ssh 端口转发到 vultr 的服务器的公网。

完成虚拟机中的服务部署的修改之后,首先 poweroff 虚拟机,然后使用

virt-sysprep -d centos_6.5

删除虚拟机内无用的数据,使用

virsh undefine centos_6.5

取消掉虚拟机

这时候 centos_6.5-20150122-x86_64.qcow2 这个镜像的修改就完成了。

使用

openstack image create -f shell --container-format bare --disk-format qcow2 --file centos_6.5-20150122-x86_64.qcow2 --tag centos_6.5 centos_6.5-20150122-x86_64_changed

将镜像重新上传回 OpenStack 的镜像库中。

然后就可以使用修改完成的镜像进行批量部署了。

有时候在修改虚拟机时可能出现磁盘空间不足的提示,这是因为初始镜像在制作时留下的剩余空间通常比较小,这时候就需要将虚拟机的磁盘大小进行一下变更了。

首先关闭虚拟机,然后查看一下文件系统详情:

virt-filesystems --long -h --all -a centos_6.5-20150122-x86_64.qcow2

创建一个新的磁盘文件:

qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 15G

使用创建的磁盘文件扩展分区:

virt-resize --expand /dev/sda1 centos_6.5-20150122-x86_64.qcow2 newdisk.qcow2

最后将镜像转回 qcow2 格式:

qemu-img convert -f raw -O qcow2 tmp.raw centos_6.5-20150122-x86_64_resized.qcow2

在Centos7上修改qcow2镜像

@Puteulanus3年前

02/26
06:09
学习心得

使用Coding的Web IDE创建bluemix的SS容器

2016/10/27 更新:增加了 kcptun ,端口 3306 。容器启动过程中会显示一些一言的句子避免等得无聊,启动完成后由 cowsay 显示主要信息。

kcptun 客户端启动命令示例:./client_darwin_amd64 -l 127.0.0.1:4443 -r 169.46.150.18:3306

Windows 用户可以用这个图形化的配置工具 https://github.com/xtaci/kcptun/issues/161

使用 kcptun 后我这儿油管能跑到 1.3M/s。

2016/10/26 更新:修正了 Coding 因为源错误无法安装 Docker 的问题,组织、空间、命名空间改为自动创建,增加 IP 地址与容器的绑定命令。简单说就是在点击邮件中的链接激活 bluemix 账号后就可以直接使用,无需再登陆 bluemix 的面板了。

 

前期回顾:https://www.puteulanus.com/archives/783

貌似是因为官方从 ibmnode 镜像里移除了 SSH 的缘故,导致在网页上创建容器之后连接 22 端口会出现无法连接的情况。由于 Bluemix 网页控制台只提供了极有限的功能支持,现在只能使用官方推荐的 cf 命令行工具来构建镜像并创建自己的容器。

最大的难题在于,cf 工具的 ic 插件依赖于 docker,而 docker 需要内核在 3.10 以上。几乎所有 OVZ 的 VPS 内核版本都是 2.6,包括 Cloud9 和 CodeAnyWhere。之前的解决办法是在按量的全虚拟化 VPS 上进行操作【如 vultr】。不过在全部试过一遍之后,终于还是找到了两家可以方便安装需要的环境的在线 IDE——Koding 和 Coding。Koding 内核版本是 3.13,而 Coding 则炫酷的直接上了 4.2。鉴于 Coding 在国内访问效果更好,而且可以免注册使用在线 IDE,就用它作为教程的平台了。

 

下面开始操作步骤。

打开 http://t.cn/RGNG40Y ,以游客的身份获得一个临时的在线 IDE 使用权。

展开位于下方的终端,执行 wget 'https://coding.net/u/tprss/p/bluemix-source/git/raw/master/start.sh' 下载脚本文件。

执行 bash start.sh ,并在提示输入 Email 时使用 Bluemix 的账号进行登录。脚本会自动安装所需的环境与工具,构建 SS 镜像并创建运行的容器。

脚本运行完后会在屏幕上打印出随机生成的 SS 密码,以及容器的 IP 地址。默认端口为 443,加密方式 aes-256-cfb。

 

注意几点:

1.Bluemix 给容器绑定公网 IP 的速度挺慢,我在脚本里延迟了 30 秒,如果最后输出的结果中还是没有公网 IP,可以去网页控制台查看容器的公网 IP,或者稍等一会儿自己执行 cf ic ps 查看。

2. 脚本适用于注册完毕 Bluemix 并且设置好了命名空间的账户,如果是新注册的账户,需要先在网页控制台尝试创建容器,照提示设定完命名空间之后才可以使用脚本。

3. 脚本创建容器时会申请一个新的公网 IP 并绑定容器,每个账户有两个免费公网 IP 的限额,所以一定要注意已申请 IP 需要是 0 或者 1,如果账户里已经有两个空闲的 IP 最好先用 cf ic ip release IP地址 释放掉然后再执行脚本,不然可能超出免费限额产生扣费。

4. 脚本主要是构建了一个镜像,使用镜像创建了一个容器,并申请了一个 IP 地址分配给它。如果在执行中途因为一些意外失败了,需要清除安装痕迹重新尝试的话,只需要删除容器、镜像、IP 就可以了。IP 地址可以执行 cf ic ip list 查看,使用 cf ic ip release IP地址 进行释放;镜像可以使用 cf ic images 进行查看,使用 cf ic rmi IMAGE_ID 进行删除;容器执行 cf ic rm -f ss 就能删掉了,如果出现错误提示的话可以去网页控制台删。

5. 脚本默认创建美国区域的容器,需要在英国区域创建的得自己改 cf login 的参数。

 

使用Coding的Web IDE创建bluemix的SS容器

@Puteulanus3年前

02/18
02:39
学习心得

Windows下搭建带有缓存与广告过滤功能的分流代理

之前折腾了一下基友送的软路由,把代理和DNS防污染查询都移到了上边。代理部分经过几天摸索踩了不少坑,包括Polipo莫名其妙的卡,adbyby和Privoxy过滤广告卡网等等。下边是已经使用了一段时间的解决方案。

首先,下载TcpRoute2

TcpRoute2是类似COW的分流代理,这里用它来完成核心的代理客户端及分流功能。

把配置文件末尾的example去掉,然后按照提示修改配置文件。

我的配置是:

addr="127.0.0.1:7070"
PreHttpPorts=[0,]
PreHttpsPorts=[0,]

[[UpStreams]]
Name="direct"
ProxyUrl="direct://0.0.0.0:0000"
DnsResolve=true
[[UpStreams.Whitelist]]
Path="https://raw.githubusercontent.com/GameXG/TcpRoute2/master/direct.txt"
UpdateInterval="24h"
Type="suffix"
[[UpStreams.Blacklist]]
Path="direct/blacklist.txt"
UpdateInterval="24h"
Type="suffix"

[[UpStreams]]
Name="SS-HK"
ProxyUrl="ss://aes-256-cfb:password@ip:port"
DnsResolve=false
Credit=0
Sleep=200
CorrectDelay=75
[[UpStreams.Whitelist]]
Path="ss-hk/whitelist.txt"
UpdateInterval="24h"
Type="suffix"
[[UpStreams.Blacklist]]
Path="ss-hk/blacklist.txt"
UpdateInterval="24h"
Type="suffix"

[[UpStreams]]
Name="SS-SG"
ProxyUrl="ss://aes-256-cfb:password@ip:port"
DnsResolve=false
Credit=0
Sleep=200
CorrectDelay=75
[[UpStreams.Whitelist]]
Path="ss-sg/whitelist.txt"
UpdateInterval="24h"
Type="suffix"
[[UpStreams.Blacklist]]
Path="ss-sg/blacklist.txt"
UpdateInterval="24h"
Type="suffix"

[[Hosts]]
Path="hosts.txt"
Type="base"

[[Hosts]]
Path="http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext"
Type="base"
UpdateInterval="24h"

因为是5.0版的时候写的配置,可能会有一些缺少的新特性的参数。我为直连、SS-HK以及SS-SG各自建立了一个文件夹,方便在需要时对黑白名单进行配置。yoyo的这个hosts是在源头对一些广告服务器进行屏蔽,这样这些广告的请求压根不会产生网络流量。

配置完成之后启动TcpRoute2Windows.exe并把它设为开机自动启动,TcpRoute2就开始监听7777端口了。

TcpRoute2和SS一样提供socks5代理,不过一些程序,特别是OSX上对socks5支持没HTTP代理那么好。所以在下面可以用Privoxy来做一层转化。

下载Privoxy,安装。

修改配置文件为:

listen-address 127.0.0.1:8117
forward-socks5 / localhost:7070 .

保存。之后运行Privoxy,这样Privoxy就开始监听8117端口提供HTTP代理了。

Privoxy是一个轻量级的代理软件,虽然可以使用规则对代理内容进行过滤(比如adbyby就是它的延伸版本),但实际测试中会有很严重的性能问题。所以这里只是单纯将它作为协议转换来使用,更加复杂的功能交给squid来完成。

下载squid for windows(XP比较方便的就只有预编译的2.7了,Win7或以上64位的可以下3.5的安装包),同时下载SoftPerfect RAM Disk。因为要加缓存,会对储存介质造成比较频繁的读写。用SoftPerfect RAM Disk建立一个RAM Disk可以防止长期读写对硬盘造成伤害,如果觉得无所谓的可以就用硬盘来做缓存目录。。

将squid文件夹移到C盘下,进入etc目录去掉配置文件的后缀。编辑squid.ini,找到:

#Default:
http_access deny all

改完:

#Default:
acl ads dstdom_regex "C:\squid\share\ads.txt"
http_access deny ads
http_access allow all

然后在配置文件尾部加上

header_access Via deny all
header_access X-Forwarded-For deny all
http_port 8118
cache_peer 127.0.0.1 parent 8117 0 no-query default
never_direct allow all
cache_dir ufs r:\ 120 16 256

保存,下载 广告过滤规则 并存为C:\squid\share\ads.txt。

header_access的两条作用是阻止squid将你的内网IP放在HTTP头中发送出去,cache_peer是上级代理,也就是Privoxy的HTTP代理的地址和端口,cache_peer后面的r:\和120是缓存目录的路径与大小。

使用cmd运行 C:\squid\sbin\squid -i 来安装squid的服务。然后使用SoftPerfect RAM Disk新建一个开机自动挂载的RAM Disk,大小130M,盘符为r。

新建一个批处理,内容为:

C:\squid\sbin\squid.exe -z
sc start Squid

并在SoftPerfect RAM Disk的工具→应用程序中添加这个批处理。因为缓存目录是RAM Disk,squid必须在内存盘挂载之后才可以启动。这个批处理负责在SoftPerfect RAM Disk挂载r盘之后,对它进行初始化,并启动squid服务。

最后,将 127.0.0.1:8118 设为IE浏览器的代理,大部分支持HTTP代理的软件就会自动读取IE浏览器的代理设置来使用代理了。

TcpRoute2会选择所有线路中最快的一条(或者直连)来进行连接,可以是多台上级SS选择最优线路,也可以是亚洲的主代理和搬瓦工的应急备用代理做故障转移。默认的直连白名单中包含了大量使用海外IP无法正常访问的国内网站(比如网易云音乐),如果在使用中出现不需要走代理的网站被走了代理,只需要将它添加进直连的白名单中就可以了。

yoyo的squid规则比hosts范围要大很多,使用代理时包括大部分国内网站的广告都会被过滤掉。而squid强大的缓存功能在内网会压根感觉不到延迟,开过一次的网站再次打开时加载速度会非常的快。

广告过滤也可以使用Adguard来完成,它支持设置上级代理以及开启自身的HTTP代理,只需要在squid与Privoxy之前再加一层HTTP代理转发就可以了。理论上它应该是比yoyo的规则更好用,不过我那台x86的软路由实在装不下.NET,只能作罢。

在目标网页无法显示的时候,会显示Privoxy的错误页。和我一样强迫症感觉那个页面丑Privoxy\templates\no-server-data 改完自己喜欢的萌化错误页模版就可以了。

Windows下搭建带有缓存与广告过滤功能的分流代理

@Puteulanus3年前

10/20
02:04
学习心得

Centos7 OVZ一键安装ocserv脚本

找到的几个都不能用,为了以后方便自己倒腾了一个OVZ的。

脚本中有大量代码来自几个其他教程或者一键脚本。

注意!这个脚本适合在新安装的Centos7 x64系统的OVZ上运行,它会直接禁用firewalld,清空原有iptables设置。要是不习惯用iptables或者iptables已经存了自己写的规则请不要运行脚本。

Hostwithlinux的256M内存OVZ测试运行通过,运行脚本前请把Tun打开。


#!/bin/bash

#密码设定
username="user"
password="password"
#端口设定
ssh_port=22
ac_port=20
ac_udp_port=5800

#ocserv安装
#版本设定
#ocserv版本
ocserv_version="0.10.9"
version=${1-${ocserv_version}}
libtasn1_version=4.7
# 安装源
yum install epel-release -y
# 安装iptables
yum install vim iptables-services -y
# 禁用firewalld
systemctl stop firewalld.service
systemctl disable firewalld.service
# 启用iptables
systemctl start iptables.service
systemctl enable iptables.service
# 安装依赖软件包
yum install -y gnutls gnutls-utils gnutls-devel readline readline-devel \
libnl-devel libtalloc libtalloc-devel libnl3-devel wget \
pam pam-devel libtalloc-devel xz libseccomp-devel \
tcp_wrappers-devel autogen autogen-libopts-devel tar \
gcc pcre-devel openssl openssl-devel curl-devel \
freeradius-client-devel freeradius-client lz4-devel lz4 \
http-parser-devel http-parser protobuf-c-devel protobuf-c \
pcllib-devel pcllib cyrus-sasl-gssapi dbus-devel policycoreutils gperf
#编译libtasn1
cd /usr/src
wget -t 0 -T 60 "http://ftp.gnu.org/gnu/libtasn1/libtasn1-${libtasn1_version}.tar.gz"
tar axf libtasn1-${libtasn1_version}.tar.gz
cd libtasn1-${libtasn1_version}
./configure --prefix=/usr --libdir=/usr/lib64 --includedir=/usr/include
make && make install
# 编译ocserv
cd /usr/src
wget -t 0 -T 60 "ftp://ftp.infradead.org/pub/ocserv/ocserv-${version}.tar.xz"
tar axf ocserv-${version}.tar.xz
cd ocserv-${version}
sed -i 's/#define MAX_CONFIG_ENTRIES.*/#define MAX_CONFIG_ENTRIES 200/g' src/vpn.h
./configure --prefix=/usr --sysconfdir=/etc
make && make install
# 复制配置文件
mkdir "/etc/ocserv"
cp "doc/sample.config" "/etc/ocserv/ocserv.conf"
cp "doc/systemd/standalone/ocserv.service" "/usr/lib/systemd/system/ocserv.service"
cp "doc/profile.xml" "/etc/ocserv/profile.xml"
# 创建证书
cd /root
certtool --generate-privkey --outfile ca-key.pem
cat << _EOF_ >ca.tmpl
cn = "puteulanus.com VPN"
organization = "puteulanus.com"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
_EOF_
certtool --generate-self-signed --load-privkey ca-key.pem \
--template ca.tmpl --outfile ca-cert.pem
certtool --generate-privkey --outfile server-key.pem
cat << _EOF_ >server.tmpl
cn = "puteulanus.com VPN"
organization = "puteulanus"
serial = 2
expiration_days = 3650
signing_key
encryption_key
tls_www_server
_EOF_
certtool --generate-certificate --load-privkey server-key.pem \
--load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem \
--template server.tmpl --outfile server-cert.pem
# 移动证书
mkdir -p /etc/ssl/{certs,private}
mv ca-cert.pem /etc/ssl/certs/
mv ca-key.pem /etc/ssl/private/
mv server-cert.pem /etc/ssl/certs/
mv server-key.pem /etc/ssl/private/
rm ca.tmpl server.tmpl -f
# 编辑配置文件
(echo "${password}"; sleep 1; echo "${password}") | ocpasswd -c "/etc/ocserv/ocpasswd" ${username}
sed -i "s#./sample.passwd#/etc/ocserv/ocpasswd#g" "/etc/ocserv/ocserv.conf"

sed -i "s#server-cert = ../tests/server-cert.pem#server-cert = /etc/ssl/certs/server-cert.pem#g" "/etc/ocserv/ocserv.conf"
sed -i "s#server-key = ../tests/server-key.pem#server-key = /etc/ssl/private/server-key.pem#g" "/etc/ocserv/ocserv.conf"
sed -i "s#ca-cert = ../tests/ca.pem#ca-cert = /etc/ssl/certs/ca-cert.pem#g" "/etc/ocserv/ocserv.conf"
sed -i 's/#enable-auth = "certificate"/enable-auth = "certificate"/g' "/etc/ocserv/ocserv.conf"
#sed -i "s/listen-clear-file = /#listen-clear-file = /g" "/etc/ocserv/ocserv.conf"

sed -i "s/max-same-clients = 2/max-same-clients = 8/g" "/etc/ocserv/ocserv.conf"
sed -i "s/max-clients = 16/max-clients = 32/g" "/etc/ocserv/ocserv.conf"

sed -i "s/tcp-port = 443/tcp-port = ${ac_port}/g" "/etc/ocserv/ocserv.conf"
sed -i "s/udp-port = 443/#udp-port = ${ac_udp_port}/g" "/etc/ocserv/ocserv.conf"

sed -i "s/default-domain = example.com/#default-domain = example.com/g" "/etc/ocserv/ocserv.conf"
sed -i "s/ipv4-network = 192.168.1.0/ipv4-network = 192.168.8.0/g" "/etc/ocserv/ocserv.conf"
sed -i "s/ipv4-netmask = 255.255.255.0/ipv4-netmask = 255.255.248.0/g" "/etc/ocserv/ocserv.conf"
sed -i "s/dns = 192.168.1.2/dns = 8.8.8.8\ndns = 8.8.4.4/g" "/etc/ocserv/ocserv.conf"
sed -i "s/run-as-group = daemon/run-as-group = nobody/g" "/etc/ocserv/ocserv.conf"
sed -i "s/cookie-timeout = 300/cookie-timeout = 86400/g" "/etc/ocserv/ocserv.conf"

sed -i 's$route = 10.10.10.0/255.255.255.0$#route = 10.10.10.0/255.255.255.0$g' "/etc/ocserv/ocserv.conf"
sed -i 's$route = 192.168.0.0/255.255.0.0$#route = 192.168.0.0/255.255.0.0$g' "/etc/ocserv/ocserv.conf"
sed -i 's$no-route = 192.168.5.0/255.255.255.0$#no-route = 192.168.5.0/255.255.255.0$g' "/etc/ocserv/ocserv.conf"

sed -i "s/isolate-workers = true/isolate-workers = false/g" "/etc/ocserv/ocserv.conf"

cat << _EOF_ >/usr/sbin/ocserv-client-cert
#! /bin/sh
#! /usr/bin/expect -f
certtool --generate-privkey --outfile \$1-key.pem
echo cn = "some random name" >client.tmpl
echo unit = "Puteulanus.com" >>client.tmpl
echo mail = "some random name" >>client.tmpl
echo uid = "`uuidgen`" >>client.tmpl
echo expiration_days = 365 >>client.tmpl
echo signing_key >>client.tmpl
echo tls_www_client >>client.tmpl
sed -i "1ccn = "\${1}"" client.tmpl
sed -i "3cemail = \${1}@abc.org" client.tmpl
certtool --generate-certificate --load-privkey \$1-key.pem --load-ca-certificate /etc/ssl/certs/ca-cert.pem --load-ca-privkey /etc/ssl/private/ca-key.pem --template client.tmpl --outfile \$1-cert.pem
openssl pkcs12 -export -inkey \$1-key.pem -in \$1-cert.pem -name "\$1 VPN Client Cert" -certfile /etc/ssl/certs/ca-cert.pem -out \$1.cert.p12
rm -f client.tmpl
exit 0
_EOF_
chmod +x /usr/sbin/ocserv-client-cert
# 路由表
#cat << _EOF_ >>/etc/ocserv/ocserv.conf
#route = 8.0.0.0/252.0.0.0
#route = 16.0.0.0/248.0.0.0
#route = 23.0.0.0/255.0.0.0
#route = 50.0.0.0/255.0.0.0
#route = 54.0.0.0/255.128.0.0
#route = 54.128.0.0/255.192.0.0
#route = 69.0.0.0/255.0.0.0
#route = 72.0.0.0/255.0.0.0
#route = 73.0.0.0/255.0.0.0
#route = 74.0.0.0/255.0.0.0
#route = 78.0.0.0/255.0.0.0
#route = 92.0.0.0/255.0.0.0
#route = 93.0.0.0/255.0.0.0
#route = 96.0.0.0/255.0.0.0
#route = 97.0.0.0/255.0.0.0
#route = 104.0.0.0/248.0.0.0
#route = 109.0.0.0/255.0.0.0
#route = 128.0.0.0/255.0.0.0
#route = 141.0.0.0/255.0.0.0
#route = 173.0.0.0/255.0.0.0
#route = 174.0.0.0/255.0.0.0
#route = 176.0.0.0/255.0.0.0
#route = 190.0.0.0/255.0.0.0
#route = 192.0.0.0/255.0.0.0
#route = 198.0.0.0/255.0.0.0
#route = 199.0.0.0/255.0.0.0
#route = 205.0.0.0/255.0.0.0
#route = 206.0.0.0/255.0.0.0
#route = 208.0.0.0/255.0.0.0
#route = 210.128.0.0/255.192.0.0
#route = 216.0.0.0/255.0.0.0
#route = 220.128.0.0/255.128.0.0
#_EOF_
# 打开转发
sysctl -w net.ipv4.ip_forward=1
echo net.ipv4.ip_forward = 1 >> "/etc/sysctl.conf"
sysctl -p
systemctl daemon-reload
# 设置iptables
cat << _EOF_ >/etc/sysconfig/iptables
*nat
-A POSTROUTING -j MASQUERADE
COMMIT
*filter
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -j ACCEPT
-A INPUT -p tcp -m tcp --dport ac_port -j ACCEPT
-A INPUT -p udp -m udp --dport ac_udp_port -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport ssh_port -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m limit --limit 10/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
COMMIT
_EOF_

sed -i "s/--dport ac_port/--dport ${ac_port}/g" "/etc/sysconfig/iptables"
sed -i "s/--dport ac_udp_port/--dport ${ac_udp_port}/g" "/etc/sysconfig/iptables"
sed -i "s/--dport ssh_port/--dport ${ssh_port}/g" "/etc/sysconfig/iptables"

systemctl reload iptables.service
# 设置开机启动
systemctl enable ocserv.service
systemctl start ocserv.service
chmod +x "/etc/rc.d/rc.local"
echo systemctl restart ocserv.service >> "/etc/rc.d/rc.local"

我这儿UDP丢成狗,所以我把UDP传输关掉了,全程TCP。

systemctl enable之后开机第一次启动总是会宕掉,没办法只能在rc.local又加了个restart。

route部分会对iOS设备造成未知影响,所以全部注释掉了。需要在Win客户端上实现内外分流的可以把注释去掉。

默认开启用户名密码和证书两种登陆方式,执行 ocserv-client-cert user 在当前目录生成指定用户的登陆证书。

isolate-workers貌似OVZ一般都是2.6的内核不支持,给禁用了。

安装使用的服务器证书是自签名的,需要使用自己购买的证书的话去 /etc/ssl/ 里替换相应的证书就行。

Centos7 OVZ一键安装ocserv脚本

@Puteulanus3年前

08/26
21:25
学习心得

Bluemix搭建SS教程

更新:使用网页面板创建的容器已无法使用SSH连接,请参照 新教程 的步骤在Coding的Web IDE里创建容器。

想了想还是写出来吧,虽然也没多少好写的。

先介绍下Bluemix。

Bluemix是IBM旗下的云空间,提供每月365 GB-小时的内存,以及两个免费IP,没有看到说限制流量。用它的容器功能可以轻松出免费的SS。

新注册的用户能得到30天的试用期,过期不绑定信用卡的话账号会被禁止登陆。用全球付的虚拟信用卡可以通过验证,而且验证的时候没有扣款,应该只对信息的真伪进行了验证,而不像PayPal会进行扣款验证。

注册和信用卡验证就不说了,主要是介绍下怎么使用容器。其实挺简单的。
Read More →

Bluemix搭建SS教程

@Puteulanus3年前

07/16
01:28
学习心得

dtcp——tcp转发调试工具

虚拟机因为分辨率的问题,开sokit字体显示极度蛋疼,搜了一下又没找到合适的替代品,干脆写了一个。

dtcp是debug tcp的缩写,功能类似于sokit的转发器,可以在客户端与服务器之间做中转,将通信内容详细的展示出来。

显示方式参照了sokit原文+16进制的形式,在多线程连接时可以使用-v详细模式显示每条信息所属的隧道,还有-t选项显示每条信息的时间。

使用-h或–help参数查看所有参数及其作用,其中-s或–srv【本地监听地址及端口】、-d或–dst【远程地址和端口】为必填项,本地不指定地址时默认监听0.0.0.0。

还有个并没有什么卵用的-b参数可以设定两头socket的buff大小。

项目放在Github,设计的基本功能已经实现完了,现在正在各种修bug,欢迎反馈问题。

dtcp——tcp转发调试工具

@Puteulanus4年前

04/5
22:26
学习心得

PHP监控Phantasien是否补货

才不是我要买=。=

之前获取两个领结的补货情况,直接用file_get_contents获取的网页。这次7个,感觉阻塞获取网页有点没效率了。。

Socket非阻塞模式代码参考的 这里 ,做了一些更改。

通知部分准备直接用现有的监控服务。网页会在检测到补货的时候404。只要在这个页面上加上监控宝或者D监控一类的就可以在补货的时候得到邮件/短信/微信的通知了。

知更鸟的代码高亮悄无声息的没了什么鬼,直接贴上来缩进全挂了。。

代码:

<?php
// 设定监控地址
$url_list = array(
'http://p-bandai.jp/phantasien/PHItem/PHTieRibbon/item-1000081400/',
'http://p-bandai.jp/phantasien/PHItem/PHTieRibbon/item-1000079639/',
'http://p-bandai.jp/phantasien/PHItem/PHTieRibbon/item-1000079779/',
'http://p-bandai.jp/phantasien/PHItem/PHTieRibbon/item-1000079643/',
'http://p-bandai.jp/phantasien/PHItem/PHTieRibbon/item-1000079644/',
'http://p-bandai.jp/phantasien/PHItem/PHTieRibbon/item-1000078613/',
'http://p-bandai.jp/phantasien/PHItem/PHTieRibbon/item-1000015407/',
);
// 发送请求
$timeout = 10;
$socket = array();
foreach($url_list as $url){
$url = parse_url($url);
$ip = gethostbyname($url['host']);
$port = ($url['scheme'] == 'https') ? 443 : 80 ;
$sh = stream_socket_client("${ip}:${port}", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
usleep(10);
if ($sh) {
$sockets[] = $sh;
$http_header = "GET ${url['path']} HTTP/1.1\n";
$http_header .= "Host: ${url['host']}\n";
$http_header .= "Accept: */*\n";
$http_header .= "Accept-Charset: *\n";
$http_header .= "\n";
fwrite($sh, $http_header);
} else {
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
echo "Stream failed to open correctly.";
exit;
}
}
// 接收返回
$result = array();
$read_block_size = 16384;

while (count($sockets))
{
$read = $sockets;
$n = stream_select($read, $w=null, $e=null, $timeout);
if (count($read))
{
foreach ($read as $r)
{
$id = array_search($r, $sockets);
$data = fread($r, $read_block_size);
if (strlen($data) == 0)
{
//echo "Stream {$id} closes at " . date('h:i:s') . ".";
fclose($r);
unset($sockets[$id]);
} else {
if (!isset($result[$id])) $result[$id] = '';
$data = explode("\n\r",$data,2);
$result[$id] .= $data[1];
}
}
} else {
echo "Time-out!";
break;
}
}
// 判断可购买数量
$can_buy = false;
$list = array();
foreach($result as $id => $html){
$html = explode('</head>',$html,2);
$html = $html[0];
preg_match('/ordermax_list = {(.|\n)+?"\w+":(?<n>\d+)/',$html,$n);
$n = $n['n'];
if((bool)$n){
$can_buy = true;
$list[] = $url_list[$id];
}
}

if($can_buy){
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
var_dump($list);
}

话说这个和上一个Heroku空间不能一起使用,或者说监控地址不能使用ngrok的,否则无法输出404的头。

PHP监控Phantasien是否补货