创世神域

Nothing is impossible.

@Puteulanus2月前

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 容器

@Puteulanus2月前

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 软路由

@Puteulanus12月前

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年前

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容器

@Puteulanus2年前

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转发调试工具

@Puteulanus3年前

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是否补货

@Puteulanus3年前

04/2
19:27
学习心得

在Heroku上运行签到站

2015年5月22日更新:

1.使用www.tunnel.org.cn新加坡节点作为ngrok服务器

2.增加cron脚本使用的搜图服务避免抽风

3.在每轮循环中访问Heroku地址,避免搜图抽风时需要执行的程序不执行

4.运行脚本增加每小时重启ngrok的功能,增强稳定性

5.替换需要登录的OSC仓库为Github

注意:

由于之前的ngrok服务已经失效,ngrok地址改为 https://名字.phiui.com

脚本只是辅助防休眠,自己给Heroku地址加个云监控更靠谱

由于自动休眠的存在,算是非稳定服务,而且本身Heroku自己的地址有些地方访问很慢甚至被墙,不建议作为提供公众服务的网站使用

 

最近啃了几个Heroku的buildpack,对它的环境稍稍有了些了解,试着改了改官方的buildpack-php,加上了ngrok和防休眠。

Heroku使用git部署代码,最方便的解决方案是在Cloud9上部署应用。

先来说说主要的坑吧,看教程的可以跳到下面去。

Heroku因为不限流量和原生支持https,早年貌似被大量挂过代理,导致现在一些地方访问和Openshift一样是被墙的。我修改了官方的 heroku-buildpack-php ,在安装脚本中加入了ngrok(参考的 heroku-buildpack-ngrok ),使用 Tunnel 的服务让网站出口变为国内。这样好处是,国内访问基本没问题了,而且不使用Heroku自己的Web服务可以顺便避开官方对每个IP在一段时间第一次访问投放的广告。坏处也有,没法绑定自己的域名了,只能使用Tunnel的二级域名。

Heroku不像Openshift可以直接把代码传到空间里去,代码的储存和运行是分离的。Web应用没有访问的话1小时会自动休眠,可以靠Web访问唤醒。休眠的时候实际上运行环境是已经被删除掉了的,在唤醒时会从代码储存空间拉取代码重新部署。所以Heroku实际上是介于本地可写和本地不可写之间,一方面临时文件什么的存在本地完全没有问题,另一方面如果是重要的配置文件存在运行空间中的,一旦应用休眠或者后期有更改重新git push了代码的话,文件就丢失了。

为了防止应用休眠,我在buildpack的服务脚本加了一段循环,每隔三分钟以应用的Url为参数访问一次Bing搜图。这样主要是避免Heroku过滤掉自己访问自己的流量。Bing搜图会把应用主页当成原图去请求,用heroku logs可以看到每次访问的IP还不一样。

应用创建完可以用heroku run bash登录到运行空间查看上面的文件,不过这也算是个坑,实际上查看的应该是类似运行空间的镜像的东西,你做的修改同样不会被保存。其实还有貌似buildpack在部署的时候貌似和运行也不是一个环境,这个是在啃别人的buildpack的时候学着写的。

嗯还有个,MySQL的Add-on要绑定信用卡才能用。这个没办法靠应用内搭建的方法来解决,毕竟运行空间的数据终究是临时的,要是在应用内自己运行MySQL服务一旦应用重启整个数据库就没了。。
Read More →

在Heroku上运行签到站