月度归档:2017年09月

ZeroMQ简介研究与应用分析

一、什么是ZeroMQ

1、ZMQ是一个简单好用的传输层,像框架一样的socket library.

2、ZMQ是一个消息处理队列。

3、与RabbitMQ相比,ZMQ并不像一个传统意义上的消息服务器,更像是一个底层的网络通讯库,在socket API之上做了一层封装,将网络通讯,进程通讯和线程通讯抽象成统一的API接口

以下是ZMQ的官方简介

ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It's fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems. ZeroMQ is from iMatix and is LGPLv3 open source.

大概意思是:ZMQ看起来像一个可嵌入网络通讯库,但更像一个并发性框架。它可以使socket携带原子信息跨各种传输进程,tcp和多播。你可以连接socket n-n模式,像扇出,发布-订阅,任务分配和请求-应答。当异步I / O模式给你可伸缩的多核应用程序,构建为异步消息处理的任务。

二、总结非常不错的

ZeroMQ研究与应用分析

http://www.cnblogs.com/rainbowzc/p/3357594.html

1  ZeroMQ概述

ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。

2  系统架构

2.1总体架构

ZeroMQ几乎所有的I/O操作都是异步的,主线程不会被阻塞。ZeroMQ会根据用户调用zmq_init函数时传入的接口参数,创建对应数量的I/O Thread。每个I/O Thread都有与之绑定的Poller,Poller采用经典的Reactor模式实现,Poller根据不同操作系统平台使用不同的网络I/O模型(select、poll、epoll、devpoll、kequeue等)。主线程与I/O线程通过Mail Box传递消息来进行通信。Server开始监听或者Client发起连接时,在主线程中创建zmq_connecter或zmq_listener,通过Mail Box发消息的形式将其绑定到I/O线程,I/O线程会把zmq_connecter或zmq_listener添加到Poller中用以侦听读/写事件。Server与Client在第一次通信时,会创建zmq_init来发送identity,用以进行认证。认证结束后,双方会为此次连接创建Session,以后双方就通过Session进行通信。每个Session都会关联到相应的读/写管道, 主线程收发消息只是分别从管道中读/写数据。Session并不实际跟kernel交换I/O数据,而是通过plugin到Session中的Engine来与kernel交换I/O数据。

图1总体架构

2.2所处层次

ZeroMQ不是单独的服务或者程序,仅仅是一套组件,其封装了网络通信、消息队列、线程调度等功能,向上层提供简洁的API,应用程序通过加载库文件,调用API函数来实现高性能网络通信。

图2所处层次

2.3消息模型

ZeroMQ将消息通信分成4种模型,分别是一对一结对模型(Exclusive-Pair)、请求回应模型(Request-Reply)、发布订阅模型(Publish-Subscribe)、推拉模型(Push-Pull)。这4种模型总结出了通用的网络通信模型,在实际中可以根据应用需要,组合其中的2种或多种模型来形成自己的解决方案。

2.3.1   一对一结对模型

最简单的1:1消息通信模型,可以认为是一个TCP Connection,但是TCP Server只能接受一个连接。数据可以双向流动,这点不同于后面的请求回应模型。

2.3.2   请求回应模型

由请求端发起请求,然后等待回应端应答。一个请求必须对应一个回应,从请求端的角度来看是发-收配对,从回应端的角度是收-发对。跟一对一结对模型的区别在于请求端可以是1~N个。该模型主要用于远程调用及任务分配等。Echo服务就是这种经典模型的应用。

图3请求回应模型

2.3.3   发布订阅模型

发布端单向分发数据,且不关心是否把全部信息发送给订阅端。如果发布端开始发布信息时,订阅端尚未连接上来,则这些信息会被直接丢弃。订阅端未连接导致信息丢失的问题,可以通过与请求回应模型组合来解决。订阅端只负责接收,而不能反馈,且在订阅端消费速度慢于发布端的情况下,会在订阅端堆积数据。该模型主要用于数据分发。天气预报、微博明星粉丝可以应用这种经典模型。

图4发布订阅模型

2.3.4   推拉模型

Server端作为Push端,而Client端作为Pull端,如果有多个Client端同时连接到Server端,则Server端会在内部做一个负载均衡,采用平均分配的算法,将所有消息均衡发布到Client端上。与发布订阅模型相比,推拉模型在没有消费者的情况下,发布的消息不会被消耗掉;在消费者能力不够的情况下,能够提供多消费者并行消费解决方案。该模型主要用于多任务并行。

图5 推拉模型

2.4通信协议

提供进程内、进程间、机器间、广播等四种通信协议。通信协议配置简单,用类似于URL形式的字符串指定即可,格式分别为inproc://、ipc://、tcp://、pgm://。ZeroMQ会自动根据指定的字符串解析出协议、地址、端口号等信息。

3  工作流程

图6 基本流程

4  性能分析

目前,市面上类似的产品不少,主要有4种:MSMQ(微软产品)、ActiveMQ(Java)、RabbitMQ(Erlang)、ZeroMQ(C++)。除ZeroMQ外,其它3款产品都是一个单独服务或者进程,需要单独安装和运行,且对环境有一定依赖。其中,MSMQ在非Windows平台下安装非常复杂,ActiveMQ需要目标机器上已经安装了Java,RabbitMQ需要Erlang环境。而ZeroMQ是以库的形式存在,由应用程序加载、运行即可。但是ZeroMQ仅提供非持久性的消息队列。

图7是来自于Internet的性能测试数据。显示的是每秒钟发送和接受的消息数。整个过程共产生1百万条1K的消息,测试环境为Windows Vista。从测试数据可以看出,ZeroMQ的性能远远高于其它3个MQ。

但是测试数据仅供参考,因为缺少必须的环境参数和性能指标,比如:CPU参数、内存参数、消息模型、通信协议、极限时消耗CPU百分比、极限时消耗内存百分比等。

图7性能测试

5  应用场景

应用ZeroMQ的Push-Pull模型实现联众游戏服务器的“热插拔”、负载均衡和消息派发。按照如图8部署服务器,Push端充当Gateway,作为一组游戏服务器集群最上层的一个Proxy,起负载均衡的作用,所有Gameserver作为Pull端。当一个请求到达Push端(Gateway)时,Push端根据一定的分配策略将任务派发到Pull端(Gameserver)。以联众某款游戏A为例,游戏A刚上线时,预计最大同时在线人数是10W,单台Gameserver并发处理能力为1W,需要10台Gameserver,由于游戏A可玩性非常好,半个月后最大同时在线人数暴增到50W,那么不需要在某天的凌晨将Gateway和Gameserver停机,只需要随时在机房新添加40台Gameserver,启动并连接到Gateway即可。

ZeroMQ中对Client和Server的启动顺序没有要求,Gameserver之间如果需要通信的话,Gameserver的应用层不需要管理这些细节,ZeroMQ已经做了重连处理。

图8应用场景

6  总结

6.1简单

1、仅仅提供24个API接口,风格类似于BSD Socket。

2、处理了网络异常,包括连接异常中断、重连等。

3、改变TCP基于字节流收发数据的方式,处理了粘包、半包等问题,以msg为单位收发数据,结合Protocol Buffers,可以对应用层彻底屏蔽网络通信层。

4、对大数据通过SENDMORE/RECVMORE提供分包收发机制。

5、通过线程间数据流动来保证同一时刻任何数据都只会被一个线程持有,以此实现多线程的“去锁化”。

6、通过高水位HWM来控制流量,用交换SWAP来转储内存数据,弥补HWM丢失数据的缺陷。

7、服务器端和客户端的启动没有先后顺序。

6.2灵活

1、支持多种通信协议,可以灵活地适应多种通信环境,包括进程内、进程间、机器间、广播。

2、支持多种消息模型,消息模型之间可以相互组合,形成特定的解决方案。

6.3跨平台

支持Linux、Windows、OS X等。

6.4多语言

可以绑定C、C++、Java、.NET、Python等30多种开发语言。

6.5高性能

相对同类产品,性能卓越。

 

来源: https://blog.csdn.net/ice_grey/article/details/49688257

支付概述

支付系统设计需要对支付领域有一定的了解。这一系列的文章介绍点轻松的内容,首先介绍支付活动,其次是支持这些支付活动的国内支付体系组成,之后是介绍支付体系各个玩家的实际运作情况。 当然,这里仅做简单的介绍,而非对观点的考证,目的是为支付系统设计提供背景知识。 支付领域涉及的主要概念,包括市场、交易、货币、银行等。相关的概念和实体,是随着社会活动发展的需要而逐步诞生,教科书上都有详细的介绍,这里简单复习下:

  1. 最早的交易是以物易物的。
  2. 市场使得产品具有了交易价值,是推动产品向商品转换的场所。在市场上, 产品转换为商品。
  3. 货币出现后,改变了交易的流程。 从以贝壳等为代表的实物货币,发展到以金子为代表的商品货币,直到现在各国自己发行法定货币的信用货币阶段。
  4. 银行的出现也是必然的,它是合理利用社会资源、归集利用闲散资金的中介服务机构。

交易与支付

对交易最直观的描述,是“一手交钱、一手交货” 。这句话形象地描述了在市场上支付和交易的关系。我们以一个个体——小明,以及一个公司——老熊公司为例来分析交易和支付的活动。 老熊公司销售各种玩具,小明打算从老熊公司买一些玩具。 小明第一次从老熊公司购买产品,双方都不知道对方的底细,他们采用“一手交钱一手交货”的形式。 在这个交易过程中:

  1. 小明从老熊公司买玩具,玩具从产品变成商品,进入交易。 这就是支付存在的前提,即存在买卖的交易。
  2. 玩具从老熊公司转换到小明手里, 这就完成了商品所有权的转移。这个转移也导致了小明和老熊公司形成了债权和债务关系。
  3. 小明通过现金或者其他方式来完成支付,清偿了这个债务。
  4. 小明拿到玩具,玩具从商品变为消费品,交易过程完成。
concept-overview-exchange
concept-overview-exchange

在这个过程中,交易的存在是支付发生的前提,债权和债务关系的形成导致支付偿返的出现,使用支付方式让交易完成。 支付的目的是清偿债权和债务关系。这种基于买卖的交易,参与的主体是商家和消费者。他们之间是一种买和卖的交易类型。

随着小明和老熊公司越来越熟悉,小明从老熊公司拿货越来越多,双方建立了牢固的信用关系。 当小明资金周转不过来的时候,老熊公司也允许小明延后付款;当小明资金充裕而老熊生产跟不上的时候,小明也会先付款后拿货。 “赊购”、“赊销” 这种行为,是在小明和老熊公司建立信用的基础上发展出来的。这时候,老熊公司和小明的关系,就不仅仅是交易关系了, 同时双发也建立了稳固的信任关系。更进一步,当小明从老熊公司赊购的时候, 由于资金量大,小明可以考虑分期偿返资金,同时也支付利息。而这对老熊公司来说,并不是一件好事,玩具生产是需要前期的大量资金投入。 这时,银行就成为一个必要的中介。 小明从直接和老熊公司打交道,变成双方以银行为中介,建立借贷关系。小明通过抵押或者其他方式,从银行获取资金,以后以分期付款的方式来偿返这笔资金。这就形成了一种靠信用维持的金融型关系。 在这种情况下,商家和消费者之间的债权和债务关系,就转变为他们和银行之间的债权和债务关系,相对于上一种的单重债务清偿关系,我们称这种交易活动中的多方间债务清偿关系为多种债务清偿关系。

concept-overview-mul
concept-overview-mul

 

清结算

那小明如何偿返这一笔贷款? 当然,对大多数人来说,工资是主要收入。小明每个月拿到工资后,从中提取出一部分资金出来用于偿返这笔贷款。这个工作也是通过银行来完成的。此外,老熊公司也是需要资金的来发工资、购买原材料等,这也使得老熊公司和银行间也需要建立支付关系。 如果我们假定只有一家银行来协助小明和老熊公司完成这些事情。这些资金都存放在银行中,银行给小明、老熊公司都开设了账户。当小明需要给老熊公司付款时,银行不需要把钱在小明和老熊公司之间搬运,只需要在各自的账户上记录下资金的增减即可。 这种通过银行内账户间的划转而实现债务关系清偿,就形成了结算。 这种结算方式提升了资金清偿的效率,减少结算过程中资金在途占用的时间,提高了资金使用率。

concept-overview-st
concept-overview-st

进一步, 如果小明和老熊公司的银行账户不是同一个开户行,而是在不同的银行中, 这就需要进行跨行清算。在上述例子中,如果小明的账户开户行是A行, 而老熊公司的账户的开户行是B行。小明通过A行来交钱。

  1. A行检查小明的账户是否足以支付这一笔支出,如果足够,会首先从小明账户上扣款。
  2. A行通知B行,老熊账户会增加一笔钱。B行按照这个指令在老熊账户上登记一笔收入。
  3. 这过程中,A行的资金并不会直接打到B行,而是到了一定时间(每天凌晨),开始执行清分,计算应该付给B行的钱,并扣除应该从B行这边来接收的钱,最后计算出来出来支付(收到)给B行的资金,完成清分。
  4. A行将清分结果对交易数据进行净额轧差,提交并完成资金划拨给B行,这就完成了清算。
concept-overview-cl
concept-overview-cl

 

如果有很多银行,每个银行都需要和对方执行清结算,这个很烦。于是,国家成立专门的机构来做这个事情,这就是央行,以及后来的银联。国内的支付清算体系,将在下文中详细介绍。

支付方式

我们回到小明和老熊公司的交易处理。小明可以使用多种支付方式来清偿债权债务关系。如果把时间拉回到3千年前,小明要从老熊这边获取一个玩具,他得需要用自己生产的东西,比如一只公鸡,来做交换,这就是最早的以物易物的支付方式。 当然,一只公鸡能换什么样的玩具,不是我们关注的重点。我们关心的是货币出现后的各种支付方式。

  1. 现金货币支付: 这是最初级和简单的形式。小明用手头的人民币来购买老熊公司的玩具。
  2. 转移支付方式: 小明要买的玩具很贵,小明手头没有足够的现金,于是,他可以考虑将他的汽车抵押给银行或者其他典当机构,用来买玩具。等手头资金足够后,再归返贷款。这种采用借贷或者抵押的方式来延期清偿债务关系,形成了转移支付。
  3. 账户划转的支付结算方式: 小明和老熊在银行都有账户,小明可以委托银行将账户上的等值数据的金额划拨给老熊账户进行债务关系清偿。这种通过银行的中间环节将清偿关系变成银行间账户划拨的结算关系,是现代信用社会中常用的一种支付方式。
  4. 第三方支付支持的中介担保支付方式:如果小明和老熊公司没有打过交道,小明不知道老熊公司是否能提供合适的玩具,而老熊又担心小明是否能够按时支付。 这时候,第三方支付平台就充当支付中介的作用。 小明先把钱给支付平台,支付平台拿到钱后,通知老熊公司发货,小明拿到玩具并确认是他想要的玩具后,通知平台支付给老熊公司。 这种方式是目前网上支付的一种主要方式,即第三方支付支持的中介担保支付方式。

支付工具

除了直接使用货币支付外,不管小明使用哪一种支付方式来执行支付,他都需要一个工具来辅助执行。最常见的是银行卡,通过POS机或者其他的刷卡设备,发送指令给银行,执行支付,实现债权债务清偿,完成货币资金的转移。 支付工具是由银行或者其他支付机构发行的,能够发起支付指令,用于债务清偿或者资金转移的证件,比如支票、汇票、本票、银行卡等。随着互联网的发展,又有一些新的支付工具和支付方式出现。在金融机构中,支付工具一般分为三类:贷记支付工具、借记支付工具、通用支付工具。

贷记工具
贷记工具一般指在支付结算中,结算的资金被划入银行应收账户上的支付工具。

  1. 汇兑:或者说汇款,一般指企业(汇款人)委托银行将其款项支付给收款人的结算方式。汇款是比较特殊的贷记工具,实际记账时应该根据资金的进出分别记录在应收账户或者资产负债上。
  2. 委托收款:是指收款人委托银行向付款人收取款项的结算方式。委托收款分邮寄和电报划回两种,由收款人选用。前者是以邮寄方式由收款人开户银行向付款人开户银行转送委托收款凭证、提供收款依据的方式‚后者则是以电报方式由收款人开户银行向付款人开户银行转送委托收款凭证‚提供收款依据的方式。
  3. 托收承付: 是指根据购销合同由收款人发货后委托银行向异地购货单位收取货款,购货单位根据合同核对单证或验货后,向银行承认付款的一种结算方式。
  4. 定期贷记: 指付款行依据当事各方事先签订的协议,定期向指定收款行发起的批量付款业务。一般工资、保险的定期发放用这种方式。

借记工具
在支付结算过程中,结算资金转移反映在银行账户上是债务的减少,这些工具被定义为借记工具。

  1. 银行汇票: 汇款人将款项存入当地出票银行,由出票银行签发的,由其在见票时,按照实际结算金额无条件支付给持票人或收款人的票据。适用于先收款后发货或钱货两清的商品交易。
  2. 银行本票: 由银行签发的,承诺自己在见票时无条件支付确定的金额给收款人或者持票人的票据。
  3. 支票:是指发票人签发的委托银行等金融机构于见票时支付一定金额给收款人或其他指定人的一种票据。

通用工具

  1. 商业汇票:是出票人签发的,委托付款人在指定日期无条件支付确定的金额给收款人或者持票人的票据。
  2. 银行卡,包括借记卡和贷记卡。
  3. 电子支付,包括网上支付、移动支付等。

支付体系

我国经过多年的发展和建设,已经基本形成比较完善的支付体系。 了解国内支付体系,对支付系统设计有重要的指导作用。下文我们将详细描述国内的支付体系。


感谢您对本文的关注,如需要及时收到凤凰牌老熊的最新作品,或者有相关问题探讨,请扫码关注“凤凰牌老熊”的微信公众号,在公众号里留言或者回复,可以尽快处理,谢谢。

本文欢迎转载,转载时请注明本文来自 微信公众号“凤凰牌老熊”。

来源: http://blog.lixf.cn/essay/2017/04/01/concept-01-overview/

linux远程监视主机会话

构建简单的 shell 脚本,实时观察主机用户行为

用户可以使用 3270 终端模拟器访问 z/OS® 主机。在这篇文章中,将学习如何构建简单的 UNIX® 或 Linux® shell 脚本,利用该脚本通过第二个终端模拟器实时查看主机用户的一举一动。用户通常通过 3270 终端模拟器 —— 例如 IBM Personal Communications(PCOMM 是一个主机通信和终端模拟包,提供了 3270、5250 和 VT 模拟功能,提供 SNA 应用程序支持、集成,以及 SNA 和 TCP/IP 连接)—— 连接主机(System z™)。如果这些用户与支持团队在一个地点,那么支持人员就能容易地帮助他们解决问题。

但是,现在的用户通常分布在不同的地方。有的是在家里工作的员工,有的是参加在线培训课程(instructor-led online,ILO)的学员,所以想通过查看用户的屏幕来帮助他们解决问题通常是不现实的。

在这篇文章中,将学习如何构建一个在 UNIX 或 Linux 上运行的简单 shell 脚本,由这个脚本可以进入 3270 终端模拟器的用户会话(3270 终端模拟器会话是访问 z/OS 主机会话的入口)。通过该脚本,能够运行第二个终端模拟器,用这个模拟器可以实时地看到用户的一举一动。

首先来看看终端模拟的工作方式。

终端模拟会话的工作方式

终端模拟器通常用 TCP/IP 连接主机。根据 IP 地址和端口号来区分会话,IP 地址指定了参与会话的计算机,端口号则表示计算机上的程序。主机上用来侦听终端模拟器的 telnet 端口是端口 23。

图1.端口和 IP 地址

端口和 IP 地址图 1 显示了两台连接到主机的 PC。主机使用 IP 地址 9.1.2.3 和端口 23。第一台 PC 有两个 PCOMM 实例 — 一个运行在端口 5000 上,另一个运行在端口 5025 上。第二台 PC 上运行了一个实例,运行在端口 5000 上。因为每个通信都包含源 IP 地址和源端口,所以主机能够区分这三个不同的连接。

选择的操作系统:Knoppix

如果没有使用 UNIX 或 Linux 系统,我建议使用 Knoppix。这个 Linux 版本可以直接从光盘上运行,所以可以在任何 PC 上运行它,甚至不需要使用 PC 的硬盘。在只有 256MB 内存的老 PC 上也能运行。

在 Knoppix 启动后,单击启动命令行窗口的图标,如图 2 所示:

图 2. Knoppix 命令行图标

Knoppix 命令行图标要成为系统管理员,请运行 sudo bash 命令。每次打开新的命令行窗口时都要重新运行它。

多数网络都使用 DHCP 协议自动分配 IP 地址。要检查是否拥有 IP 地址,请运行以下命令: ipconfig eth0。如果没有 IP 地址,就会被分配一个地址以及路由器的地址。要启动网络功能,请运行以下命令:

ipconfig eth0 <computer's IP address>
route add default gw <router's IP address>

要检验到主机的连接,请运行以下命令: telnet <mainframe's IP address>。如果能够工作,可以使用 Ctrl-] 退出终端或启动另一个命令行窗口。如果有必要,可以运行 sudo bash

监视单个用户的连接

这一节介绍:

  • 如何设置使用管道的单一代理
  • 命令在设置期间做了什么
  • 如何添加监视 tap

使用管道的单一代理

第一步是创建一个代理。我们并不直接连接主机,而是让用户连接到运行 Knoppix 或其他版本 Linux 的 PC,然后让这台计算机连接到主机(如图 3 所示):

图3. 用户通过代理连接

用户通过代理连接以 root 用户身份运行以下命令:

mknod pc2mf p
mknod mf2pc p
cat pc2mf | nc <mainframe IP> 23 | tee tap | tee mf2pc &
cat mf2pc | nc -l -p 2300 | tee mf2pc &

现在用 3270 终端模拟器在 2300 端口上连接到运行 Linux 的计算机 — 应该被重定向到主机。连接完成之后,应该停止第三行、第四行执行的所有命令。除非后台运行其他命令,否则可以使用下面的命令执行:

kill %1
kill %2

工作方式

前两行命令创造一对先进先出(FIFO)管道。

mknod pc2mf p 
#For the stream going from PC to mainframe

mknod mf2pc p 
#For the stream going from mainframe to PC

第三行:

cat pc2mf | nc <mainframe IP> 23 | tee tap | tee mf2pc &

复杂一些。它包含四个命令,这四个命令通过管道连接在一起。这意味着第一个命令的输出是第二个命令的输入;第二个命令的输出是第三个命令的输入;第三个命令的输出是第四个命令的输入。这有点像在 JCL 作业中使用 PASS 关键字将一个作业步骤的输出传递给另一个作业作为输入:

  • cat pc2mf 从管道读入从 PC 到主机的数据流。
  • nc <ip address> 23 打开到主机的 TCP 连接,并将管道的输出发送到该连接。
  • 主机的输出然后进入下一部分,tee taptee 命令的功能是作为 T 管道,将输入(主机的输出)发送到下一条命令和称为 tap 的文件。后面在监视的时候将使用这个文件。
  • tee mf2pc 将主机的输出发送到 mf2pc 管道。它的末尾有一个 & 符号,告诉计算机在用户执行其他操作的时候,在后台运行该命令。

第四行与第三行类似:

cat mf2pc | nc -l -p 2300 | tee mf2pc &
  • cat mf2pc 命令读取从主机到终端模拟器的流。
  • nc -l -p 2300 命令侦听 TCP 端口 2300。如果程序(例如终端模拟器)连接到该端口,就会通过该连接得到来自主机的流。发送到该连接的任何内容都会转到下一个程序……
  • tee pc2mf 则将内容放到第三行命令要检索的管道内。

图 4 演示了这个过程。

图 4. 简单代理

简单代理

添加监视 tap

来自主机的输出还要发送到称为 tap 的文件内。因为流的格式是 EBCDIC 而非 ASCII,所以在 Linux 上没有方便的方法可以查看它。但是,在停止代理之后,可以运行下面这些命令重新启动一个可以从另一个 3270 终端模拟器访问的 tap:

rm -f tap
mknod tap p
cat pc2mf | nc <mainframe IP> 23 | tee tap | tee mf2pc &
cat mf2pc | nc -l -p 2300 | tee mf2pc &
cat tap | nc -l -p 2301 &

前两行删除现有的 tap 文件,并用另一个 FIFO 管道代替它。第三和第四行运行简单代理,就像前面的代码示例中做的那样。最后一行读取来自 tap 的信息,并将信息发送到 nc -l -p 2301,它将侦听 TCP 端口 2301。如果程序(例如终端模拟器)连接到端口 2301,就会通过连接得到主机截取的流。但是,它发送回来的内容会被发送到执行该命令的命令提示符。图 5 演示了安装了该 tap 的代理。

图 5. 带有监视 tap 的简单代理

带有监视 tap 的简单代理

使用同一个 TCP 端口的多个连接

前面的解决方案能够工作,但是它要求每个用户连接到不同的端口,还需要手动分配端口。更好的解决方案应该能用一个 TCP 端口服务多个用户。清单 1 的解决方案使用了称为 proxy.sh 的 shell 脚本:

清单 1. Shell 脚本 proxy.sh 支持一个端口上的多个连接
#! /bin/sh

# Run another nc to listen for the next connection
nc -l -p 2300 -c ./proxy.sh &

# Create a pipe for the tap
tap=/tmp/proxy.sh.$$
mknod $tap p

# Start the tap connection
cat $tap | nc -l -p $$ &
echo Connection from `date` tapped at port $$ >> taplist

# Because this script is executed by nc, the input and output
# are already the TCP connection to the user. Use nc to connect
# to the mainframe
nc <mainframe's IP address> 23 | tee $tap

chmod +x proxy.sh 将脚本设为可执行,并用 nc -l -p 2300 -c ./proxy.sh 执行脚本。每次用户连接代理上的端口 2300 时,用户都会连接到主机,并打开一个新端口来监视用户。

为了得到端口的值,要查询文件 taplist。该文件中将包含连接和端口的日期和时间。如果您希望监视的连接之后再没有生成用户连接,那么该连接就是文件的最后一行。

第一行

第一行 #! /bin/sh 告诉操作系统,本文件是脚本文件,需要用 /bin/sh 程序(也称为 shell)解释。其他以 # 字符开始的行是注释,执行时将被忽略。

侦听连接

在使用命令行参数 -l -p <port> -c <command> 执行 nc 时,nc 将一直等待,直到在该端口上接收到连接,然后执行指定的命令。来自 TCP 连接的流是命令的标准输入,命令的标准输出通过 TCP 连接发送回去。

因为 nc 在接收到连接并执行 proxy.sh 时会停止侦听端口,所以脚本做的第一件事是启动另一个 nc 实例继续作同样的事: nc -l -p 2300 -c ./proxy.sh &。& 表示这个命令将在后台执行,在完成之前不会停止脚本。

创建 tap

因为可能同时运行这个脚本的多个实例,所以需要为每个实例创建独立的 FIFO 管道。为了区分不同的管道,脚本使用了 $$,它指的是当前的进程 ID(也称为 pid)。同时运行的对同一个脚本的多个调用将使用不同的进程 ID。

# Create a pipe for the tap
tap=/tmp/proxy.sh.$$
mknod $tap p

第一行是个注释。第二行将变量 tap 的值设为 /tmp/proxy.sh.<pid>。实际上是管道的文件名。

在第三行,$tap 由前一行生成的变量的值代替。这与启动作业的用户在 JCL 作业中使用 &SYSUID 类似。

tap 连接

下一步是创建用来监视用户的 tap 连接。

# Start the tap connection
cat $tap | nc -l -p $$ &
echo Connection from `date` tapped at port $$ >> taplist

第一行还是注释。第二行与前面创建的单连接代理中的 tap 类似,不过有两个区别:

  • 管道的名称是 $tap
  • 用来监视用户的端口号不能是常数,因为脚本会同时在多个实例中运行。一次只有一个进程能侦听特定端口。所以监视用户需要连接到与 proxy.sh 实例的 pid 相同的端口号。

这个解决方案带来一个新问题。监视器如何知道要连接的端口号?第三行就是用来解决这一问题的。echo 命令接受从命令行得到的参数,并将参数写进输出。>> taplist 部分将命令的输出附加到文件 taplist 末尾。

多数消息都是这样写入 taplist 的,但有两个部分将进行解释:`date`$$。 如果 shell 脚本的某一部分用单引号(也称为重单符)括起来,那么将执行这个部分并将结果放在该命令行内。在上面的代码中,`date` 执行 date 命令,报告当前日期和时间,然后将得到的日期和时间放在消息内。$$ 的功能同往常一样:pid,也作为监视用户的端口号。

主机连接

脚本的最后一部分连接到主机。因为脚本的输入和输出已经连接到用户的终端模拟器,所以这一部分就非常简单。

# Because this script is executed by nc, the input and output
# are already the TCP connection to the user. Use nc to connect
# to the mainframe
nc <mainframe's IP address> 23 | tee $tap

在在线培训课程中使用代理

要在在线培训课程上使用这个系统,请在网络上配置一个 Knoppix 代理,然后让学员连接到代理。教师随后可以根据需要打开任意多个终端模拟器实例以监视学员的活动,并最小化它们。

如果学员练习时发现问题,教师可以通过查看相应的终端模拟器了解学员的操作。每次学员按回车时,他的终端模拟器输出就会与教师的模拟器同步。如果教师不知道哪个终端模拟器窗口与该学员对应,可以要求学员输入特定形式的关键字,然后查看哪个窗口显示了该关键字。

图 6. 带有监视 tap 的代理

带有监视 tap 的代理

PowerDNS和MariaDB安装配置教程

 

自建PowerDNS免费DNS服务器-PowerDNS和MariaDB安装配置教程

很长时间以来DNS服务器一直不被人重视,但是直到DNSPOD、CloudXNS这样的第三方DNS服务器出现后,大家才开始发现原来DNS服务也是非常重要,一个好的DNS服务器不仅可以加快域名解析速度,还可以在网站宕机后智能切换到备用服务器上。

一般来说,我们常用的免费DNS服务提供的A、CNAME、MX、TXT等解析功能足够我们使用了,但是如果你想使用IPv6、PTR、RP、RRSIG、SOA、SPF等解析记录,并随时控制自己的域名DNS解析,又或者你自己搭建一个DNS服务器提供给其它用户使用,这时你就需要一台自建DNS服务器了。

自建DNS服务器也不是很复杂,成本并不需要太高,只要一个VPS主机、PowerDNS软件、外加一个域名即可。PowerDNS是一种高性能的免费DNS域名服务器程序,可与多个后端兼容。PowerDNS可以使用BIND配置文件,与MariaDB,MySQL,Oracle,PostgreSQL和许多其他数据库整合。

如果想用网页来实现对PowerDNS的管理,还可以安装MariaDB数据库和Poweradmin,直接在浏览器修改域名DNS解析记录,方便又快捷。其它自建DNS服务器和免费DNS服务,可以看看:

  • 1、VestaCP自建DNS服务器和邮局服务器教程-DNS server和Mail Server设置方法
  • 2、本地DNS:
  • 3、第三方DNS服务汇总:十大免费DNS域名解析服务-稳定,可靠,好用的免费DNS服务

自建PowerDNS免费DNS服务器-PowerDNS和MariaDB安装配置教程

一、安装前准备:MariaDB数据库安装与配置

1、PowerDNS官网:

  • 1、官方网站:https://www.powerdns.com/

2、PowerDNS可以与MariaDB,MySQL,Oracle,PostgreSQL等整合,这里我们选择轻量级的数据库MariaDB来安装。VPS主机要求最少是512MB内存,本文以Ubuntu 14.04 64bit作为操作演示。

3、安装MariaDB,执行以下命令:

1
2
3
4
5
6
7
apt-get update && apt-get upgrade -y
 
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db #导入MariaDB存储库的密钥
 
add-apt-repository 'deb http://ftp.kaist.ac.kr/mariadb/repo/5.5/ubuntu trusty main'  #添加MariaDB APT存储库
 
apt-get -y install libaio1 libdbd-mysql-perl libdbi-perl libmariadbclient18 libmysqlclient18 libnet-daemon-perl libplrpc-perl mariadb-client-5.5 mariadb-client-core-5.5 mariadb-common mysql-common mariadb-server mariadb-server-5.5 mariadb-server-core-5.5  #安装MariaDB软件包和依赖关系

4、在安装过程中,系统将提示您为MariaDB root用户设置密码。

为MariaDB root用户设置密码

5、回车后,再次确认你的密码。

为MariaDB root确认密码

6、安装好了MariaDB,执行以下命令对MariaDB进行相关的配置:

1
mysql_secure_installation

7、系统将提示您使用MariaDB安装期间创建的MariaDB root用户密码进行身份验证,然后会提示你是否修改Root密码,直接选择否。

PowerDNS是否修改密码

8、接下来建议禁用匿名用户;建议root不用于管理远程数据库服务器;如果你想试验MariaDB,你可以保留测试数据库。否则直接删除它。全部按ENTER回车。

PowerDNS全部默认选择是

9、操作命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
root@freehao123:~# mysql_secure_installation
 
/usr/bin/mysql_secure_installation: 379: /usr/bin/mysql_secure_installation: find_mysql_client: not found
 
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
 
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
 
In order to log into MariaDB to secure it, we'll need the current
 
password for the root user.  If you've just installed MariaDB, and
 
you haven't set the root password yet, the password will be blank,
 
so you should just press enter here.
 
Enter current password for root (enter for none):
 
OK, successfully used password, moving on...
 
Setting the root password ensures that nobody can log into the MariaDB
 
root user without the proper authorisation.
 
You already have a root password set, so you can safely answer 'n'.
 
Change the root password? [Y/n] n
 
 ... skipping.
 
By default, a MariaDB installation has an anonymous user, allowing anyone
 
to log into MariaDB without having to have a user account created for
 
them.  This is intended only for testing, and to make the installation
 
go a bit smoother.  You should remove them before moving into a
 
production environment.
 
Remove anonymous users? [Y/n]
 
 ... Success!
 
Normally, root should only be allowed to connect from 'localhost'.  This
 
ensures that someone cannot guess at the root password from the network.
 
Disallow root login remotely? [Y/n]
 
 ... Success!
 
By default, MariaDB comes with a database named 'test' that anyone can
 
access.  This is also intended only for testing, and should be removed
 
before moving into a production environment.
 
Remove test database and access to it? [Y/n]
 
 - Dropping test database...
 
 ... Success!
 
 - Removing privileges on test database...
 
 ... Success!
 
Reloading the privilege tables will ensure that all changes made so far
 
will take effect immediately.
 
Reload privilege tables now? [Y/n]
 
 ... Success!
 
Cleaning up...
 
All done!  If you've completed all of the above steps, your MariaDB
 
installation should now be secure.
 
Thanks for using MariaDB!

10、把InnoDB日志文件大小增加到64MB,有助调试数据库问题。(可选)命令如下:

1
2
3
4
5
service mysql stop  #停止MariaDB服务
 
rm -f /var/lib/mysql/ib_logfile*  #删除任何现有的日志文件
 
nano /etc/mysql/my.cnf #打开配置文件

11、然后按CTRL + W搜索文件。在搜索字段中输入InnoDB,按ENTER键跳转到InnoDB部分。输入:innodb_log_file_size = 64M。

PowerDNS删除日志文件

12、按CTRL + X,按Y保存文件,然后按ENTER确认,最后再次启动MariaDB服务。命令如下:

1
2
3
innodb_log_file_size = 64M
 
service mysql start

二、在MariaDB中创建PowerDNS数据库

1、本文直接使用MySQL shell来创建管理MariaDB,如果你觉得麻烦的话,你也可以直接安装一个PHPMyAdmin,然后就可以在浏览器中创建数据库了。

2、MySQL shell将创建数据库名为powerdns,用户名为powerdns_user,你需要根据你自己的需要来替换,执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
mysql -u root -p #使用MariaDB root用户进行身份验证
 
CREATE DATABASE powerdns; #创建数据库
 
GRANT ALL ON powerdns.* TO 'powerdns_user'@'localhost' IDENTIFIED BY 'freehao123pass'; #创建一个名为“powerdns_user”的新用户并授予对数据库的访问权限,注意替换freehao123pass为你自己的密码
 
FLUSH PRIVILEGES; #刷新权限以更新用户设置
 
USE powerdns; #进入powerdns数据库
 
CREATE TABLE domains (
 
id INT auto_increment,
 
name VARCHAR(255) NOT NULL,
 
master VARCHAR(128) DEFAULT NULL,
 
last_check INT DEFAULT NULL,
 
type VARCHAR(6) NOT NULL,
 
notified_serial INT DEFAULT NULL,
 
account VARCHAR(40) DEFAULT NULL,
 
primary key (id)
 
); #添加域表
 
CREATE UNIQUE INDEX name_index ON domains(name); #设置唯一索引
 
CREATE TABLE records (
 
id INT auto_increment,
 
domain_id INT DEFAULT NULL,
 
name VARCHAR(255) DEFAULT NULL,
 
type VARCHAR(6) DEFAULT NULL,
 
content VARCHAR(255) DEFAULT NULL,
 
ttl INT DEFAULT NULL,
 
prio INT DEFAULT NULL,
 
change_date INT DEFAULT NULL,
 
primary key(id)
 
); #创建记录表
 
CREATE INDEX rec_name_index ON records(name);
 
CREATE INDEX nametype_index ON records(name,type);
 
CREATE INDEX domain_id ON records(domain_id); #设置索引
 
CREATE TABLE supermasters (
 
ip VARCHAR(25) NOT NULL,
 
nameserver VARCHAR(255) NOT NULL,
 
account VARCHAR(40) DEFAULT NULL
 
); #创建supermasters表
 
quit; #退出

三、PowerDNS安装与配置方法

1、安装PowerDNS,执行以下命令:

1
2
3
apt-get install -y pdns-server pdns-backend-mysql
 
#apt-get -f purge -y mysql-client

2、执行命令后,会询问是否自动配置MysqL,选择:否,稍后我们会手动配置MysqL。

PowerDNS是否手动配置

3、接下来就是创建MariaDB配置文件,写入刚刚我们创建好的MysqL数据库、用户名和密码了。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rm /etc/powerdns/pdns.d/*
 
nano /etc/powerdns/pdns.d/pdns.local.gmysql.conf
 
#注意替换上面你创建的数据库、用户名和密码
 
# MySQL Configuration file
 
launch=gmysql
 
gmysql-host=localhost
 
gmysql-dbname=powerdns
 
gmysql-user=powerdns_user
 
gmysql-password=freehao123pass

4、操作如下图:

PowerDNS设置数据库连接

5、执行命令:service pdns restart,重启PowerDNS。

PowerDNS重启DNS服务器

6、执行:netstat -tap | grep pdns,看看PowerDNS是否成功运行,dig @127.0.0.1 看看有没有输出。

PowerDNS测试是否正常

7、如果有如下内容输出的话,就表示一切正常了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
root@freehao123:~# dig @127.0.0.1
; <<>> DiG 9.9.5-3ubuntu0.13-Ubuntu <<>> @127.0.0.1
 
; (1 server found)
 
;; global options: +cmd
 
;; Got answer:
 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46482
 
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
 
;; WARNING: recursion requested but not available
 
;; OPT PSEUDOSECTION:
 
; EDNS: version: 0, flags:; udp: 2800
 
;; QUESTION SECTION:
 
;.				IN	NS
 
;; Query time: 12 msec
 
;; SERVER: 127.0.0.1#53(127.0.0.1)
 
;; WHEN: Sun Mar 05 13:18:22 UTC 2017
 
;; MSG SIZE  rcvd: 29
 
root@freehao123:~#

四、安装PowerDNS管理工具:Poweradmin

1、Poweradmin是PowerDNS的基于Web的DNS管理工具,它完全支持所有DNS域名解析类型,功能非常强大。先要安装好Apache和PHP及相应的模块,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apt-get install -y apache2 gettext libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php-pear php5-imap  php5-ming php5-mysql php5-xmlrpc php5-mhash php5-mcrypt
 
pear install DB #安装所需的PEAR模块
 
#如果pear提示版本太低,可以按以下安装
 
#curl -o go-pear.php http://pear.php.net/go-pear
 
#curl -o go-pear.php http://pear.php.net/go-pear.phar
 
#php go-pear.php
 
pear install pear/MDB2#mysql
 
php5enmod mcrypt #启用Mcrypt
 
service apache2 restart #启动Apache

2、接下来就是下载安装Poweradmin。

1
2
3
4
5
6
7
8
9
10
11
cd ~
 
wget https://github.com/downloads/poweradmin/poweradmin/poweradmin-2.1.6.tgz #下载压缩的Poweradmin文件
 
tar xvzf poweradmin-2.1.6.tgz
 
mv poweradmin-2.1.6 /var/www/html/poweradmin #将poweradmin目录移动到Apache Web目录
 
touch /var/www/html/poweradmin/inc/config.inc.php #创建配置文件
 
chown -R www-data:www-data /var/www/html/poweradmin/ #授予Apache用户对该目录的所有权

3、配置Poweradmin。用浏览器打开:http://your_server_ip/poweradmin/install/,打开配置页面,选择英文。

Poweradmin使用英文

4、直接点击到下一步。

Poweradmin直接下一步

5、这一步是填写你刚刚创建好的MysqL数据库,包括数据库名、用户名、密码等。

Poweradmin填写MysqL信息

6、再下一步就是填写你的Poweradmin信息了,用户名与密码保持与你的MysqL一致,填写参考下图:

Poweradmin设置账号密码

7、验证数据库是否正确。

Poweradmin验证成功

8、最后一步就是看到程序写入配置文件的提示了,就表示已经安装Poweradmin成功了。

Poweradmin成功安装

9、如果安装失败,请执行:touch /var/www/html/poweradmin/inc/config.inc.php,然后重装打开安装界面再一次安装。

Poweradmin完成安装

五、Poweradmin使用方法

1、首先按照上面的方法安装好了Poweradmin后,你需要先删除安装目录才能进入到Poweradmin后台。

1
rm -rf /var/www/html/poweradmin/install/

2、安装完成后,如果想到编辑配置文件,请执行以下命令:

1
nano /var/www/html/poweradmin/inc/config.inc.php

3、访问:http://your_server_ip/poweradmin/,使用你刚刚创建好的Poweradmin用户名和密码登录。

Poweradmin登录

4、这里你就可以看到Poweradmin的管理界面了,点击 Add Master Zone,添加一个域名用于DNS解析。

Poweradmin添加域名解析

5、这里你就可以直接输入域名添加绑定到Poweradmin了。

Poweradmin绑定域名

6、完了点击上方的List Zones。

Poweradmin列出域名

7、这时你就可以看到你刚刚添加的域名了,点击域名前面的编辑按钮。

Poweradmin重新编辑

8、这一步就是域名DNS记录管理页面了,和我们平时使用的DNS服务差不多,添加域名前缀,然后设定A、CNAME、AAAA等记录。(点击放大)

Poweradmin修改DNS解析记录

六、设置glue 记录正式启用DNS服务器

1、按照上面的方法我们已经成功配置好了一台免费DNS服务器,绑定在Poweradmin的域名是:freehao123.org,我们需要先域名注册商那里设置好域名的glue 记录。以NameCheap为例,进入到域名列表。

设置glue 记录进入域名列表

2、选择域名下面的“高级DNS”。

设置glue 记录选择高级DNS

3、然后把页面往下拉,找到注册个人NS服务器选项,点击添加Name Server,添加NS1.freehao123.org和NS2.freehao123.org这样的记录,设置好Poweradmin服务器的IP地址。

设置glue 记录添加NS

4、NS服务器前缀你可以自己设置,前提是你需要保持与上文中配置Poweradmin一致。(点击放大)

设置glue 记录所有记录

5、添加好了glue 记录后,你就可以进入到域名的NS域名管理部分,将NS服务器设置为NS1.freehao123.org和NS2.freehao123.org了。

设置glue 记录设置新的NS服务器

6、测试DNS服务器是否正常。先在DNS服务器上使用Dig命令,看看有没有数据输出:dig dns.freehao123.org A @127.0.0.1。

设置glue 记录解析生效

7、有的话表示正常,待DNS解析生效后,你就可以在本地测试你的PowerDNS是否正常运行了

PowerDNS是否正常运行

七、PowerDNS安装配置小结

1、PowerDNS总得安装配置思路就是先安装好Apache、MysqL、PHP等,然后利用MysqL与PowerDNS来安装Poweradmin管理工具,从而实现网页管理PowerDNS的DNS记录。

2、PowerDNS使用的NS服务器域名需要作glue 记录,一般像国外的Godaddy、Name.com、Namecheap等域名注册商都是可以支持的,其它的如果你发现没有这个功能可能就是要联系客服了。

文章出自:免费资源部落 部分内容参考自digitalocean 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。

来源: https://www.freehao123.com/powerdns/