创世神域

Nothing is impossible.

@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镜像

@Puteulanus7月前

02/26
06:09
学习心得

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

前期回顾: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容器

@Puteulanus8月前

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下搭建带有缓存与广告过滤功能的分流代理

@Puteulanus12月前

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脚本

@Puteulanus1年前

08/26
21:25
学习心得

Bluemix搭建SS教程

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

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

先介绍下Bluemix。

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

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

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

Bluemix搭建SS教程

@Puteulanus1年前

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

@Puteulanus1年前

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

@Puteulanus1年前

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上运行签到站

@Puteulanus2年前

02/1
23:15
学习心得

10.10解决WiFi不稳定问题

更新10.10之后,开始频繁出现盒盖休眠之后开盖搜不到WiFi、只搜到我的WiFi连上了却上不了网一类的情况,刚开始以为是个例没在意,后来才知道WiFi不稳定是很多人更新10.10之后都遇到了的。

再后来看到 这篇帖子 ,因为自己用不到AirDrop所以毫不犹豫的禁用了awdl0,然后就把这事忘了。

直到这两天又开始出现这问题,这才想起之前设置之后好像WiFi问题的确没出现过了。至于为啥现在又出现了,怎么想也只有一个可能——前几天更新10.10.2又给我打开了。。开terminal一看,果然awdl0又是active状态。

果断执行

sudo ifconfig awdl0 down

又给禁用回去了。

网上说10.10.2已经解决了WiFi的问题,我是完全没觉得,不知道是不是个例。如果和我症状一样的朋友可以试试这个方法。

要重新启用awdl0也很简单,执行

sudo ifconfig awdl0 up

就行了。

10.10解决WiFi不稳定问题