ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 我的阿里云服务器 18年10月底个人购买了一台阿里云服务器实例,配置如下: * CPU:2核 * 内存:4GB * 操作系统:Ubuntu 16.04 64位 * 公网IP:我知道 * 私有IP:只有我知道 ## MQTT服务的搭建 我打算在阿里云服务器上安装的MQTT服务器是[EMQTT](http://emqtt.com/) ,别称*EMQ*.据说是国内的一个MQTT开源项目,号称百万级分布式开源物联网MQTT消息服务器,我先信了,试试去! ### 1.获取EMQ下载地址 在本地电脑登录[EMQ的官网下载页面](http://www.emqtt.com/downloads),我选当前最新的[稳定版:emqtt-2.3.11发布于2018/07/23之Ubuntu16.04(64-bit)](https://www.emqx.io/static/brokers/emqttd-ubuntu16.04-v2.3.11.zip)点击下载.不用下载完,可以暂停,这里主要是为了获取该版本程序的下载地址,获取方法是 打开浏览器的下载列表,复制该版本程序的地址,以备云服务器安装emq是使用. ### 2.下载安装EMQ 1. 通过SSH远程登录云主机; 2. 用wget工具下载EMQ安装文件 ``` wget xxx/emqttd-ubuntu16.04-v2.3.11.zip ``` 注:这里的xxx/emqttd-ubuntu16.04-v2.3.11.zip是上节"1.下载EMQ"里获取的地址 3. 解压缩下载的zip文件 ``` unzip emqttd-ubuntu16.04-v2.3.11.zip ``` emq文件解压到目录emqttd里,如下: ``` root@iZm5e0mttckgaqhv4a4vu4Z:/home/qinbao/emqtt/emqttd# ls bin data erts-9.0 etc hook_lua lib log releases ``` > 注: Ubuntu系统一般都没有预装unzip解压工具,在输入unzip命令时系统会友好的提示你该如何安装,按提示安装就是了,如下: >``` >sudo apt-get install unzip >``` ### 3. 运行EMQ之MQTT服务器 ### 在emqttd目录下输入命令* ./bin/emqttd console *启动MQTT服务器 ``` root@iZm5e0mttckgaqhv4a4vu4Z:/home/qinbao/emqtt/emqttd# ./bin/emqttd console ... 此处省略一万字 ... starting emqttd on node 'emq@127.0.0.1' emqttd ctl is starting...[ok] emqttd hook is starting...[ok] emqttd router is starting...[ok] emqttd pubsub is starting...[ok] emqttd stats is starting...[ok] emqttd metrics is starting...[ok] emqttd pooler is starting...[ok] emqttd trace is starting...[ok] emqttd client manager is starting...[ok] emqttd session manager is starting...[ok] emqttd session supervisor is starting...[ok] emqttd wsclient supervisor is starting...[ok] emqttd broker is starting...[ok] emqttd alarm is starting...[ok] emqttd mod supervisor is starting...[ok] emqttd bridge supervisor is starting...[ok] emqttd access control is starting...[ok] emqttd system monitor is starting...[ok] emqttd 2.3.11 is running now Eshell V9.0 (abort with ^G) (emq@127.0.0.1)1> Load emq_mod_presence module successfully. dashboard:http listen on 0.0.0.0:18083 with 4 acceptors. mqtt:tcp listen on 127.0.0.1:11883 with 4 acceptors. mqtt:tcp listen on 0.0.0.0:1883 with 16 acceptors. mqtt:ws listen on 0.0.0.0:8083 with 4 acceptors. mqtt:ssl listen on 0.0.0.0:8883 with 16 acceptors. mqtt:wss listen on 0.0.0.0:8084 with 4 acceptors. mqtt:api listen on 0.0.0.0:8080 with 4 acceptors. (emq@127.0.0.1)1> ``` 如上显示MQTT服务器启动成功 服务器工作后,会监听四个端口,1883,8883,8083,18083,对应的服务参阅下表 | 端口号 | 服务类型 |-|- 1883 | MQTT协议端口 8883 | MQTT(SSL)端口 8083 | MQTT(WebSocket), HTTP API端口 18083 | Dashboard管理控制台端口 ### 配置系统环境变量 for emqttd ### 把命令emqttd添加到系统中,须设置系统环境变量: ``` > vim /etc/profile # emqtt export EMQPATH=/usr/local/emqttd export PATH=$EMQPATH/bin:$PATH > source /etc/profile ``` > 注意,EMQPATH须根据emqttd实际的安装位置确定 ### 4. 配置云服务器的端口1883 ### 由于MQTT服务器用的端口号是1883,须打开云服务器相应的端口1883,方法如下: 来到阿里云的管理控制台,给我的云服务器实例*添加安全组规则*(入方向),规则设置如下: | 授权策略 | 协议类型 | 端口范围 | 授权类型 | 授权对象 | 描述 | 优先级 | 创建时间 | 操作| |-|-|-|-|-|-|-|-|-| | 允许 | 自定义TCP|1883/1883|地址段访问|0.0.0.0/0|mqtt|1|xxx|xxx ### 4. 测试MQTT服务器 ### 本地电脑(windows系统)安装MQTT客户端软件MQTT.fx-1.5.0,设置连接参数: * Broker Address:云服务器的公网IP * Broker Port:1883 设置以上两个参数就行了,然后连接,连接成功后就可以发布和订阅主题了. 发布主题:如主题名为topic1,内容为hello world! 订阅主题:如主题为topic1,如果以上的主题topic1发布成功,在此能接受到该主题的内容* hello world! * 接收到主题为topic1,内容是hello world!的消息后,说明MQTT服务器成功搭建并运行; ###linux(ubuntu)下mqtt测试 安装http://mosquitto.org/download/ 1. 安装mosquitto sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa sudo apt-get update 2. 安装mosquitto客户端 ``` qb@qb-Lenovo-XiaoXin-310-15IKB:~$ mosquitto_pub The program 'mosquitto_pub' is currently not installed. You can install it by typing: sudo apt install mosquitto-clients qb@qb-Lenovo-XiaoXin-310-15IKB:~$ sudo apt^C qb@qb-Lenovo-XiaoXin-310-15IKB:~$ ``` ## FTP服务器的搭建 ## vsftpd是linux下的一款小巧安全易用、在各个linux发行版本中最受推崇的的FTP服务器软件. ### FTP服务器安装配置过程 ### 安装过程别人写的很详细了,直接参考[FTP的搭建和使用](https://help.aliyun.com/knowledge_detail/60152.html)就行了.大概的过程如下: 1. apt install vsftpd,其实在shell中输入vsftpd,没有安装的话会提示怎么安装,按提示安装就行了; 2. 配置文件* /etc/vsftpd.conf *,删除了不必要的注释,内容如下.配置FTP服务器能匿名访问,不能上传和新建文件夹,FTP的工作模式是被动模式,即FTP服务器(端口号21)与客户端的命令通道建立之后,客户端发送被动连接命令,此时FTP服务器发给客户端一个用于数据通道的端口范围,由pasv_min_port和pasv_max_port确定FTP服务器用于数据通道的端口地址: 3. 配置SSL/TLS安全FTP 终于来到重点了。首先我们了解一下FTPS的工作方式。 FTPS工作方式 为了提高整体安全性,我们有两种选择,一种是FTPS,相当于加密版的FTP。第二种是SFTP,也就是通过SSH文件传输协议加密从客户机到服务器的FTP连接。 SSL/TLS协议工作在传输层(TCP/IP)之上,应用层之下。因此它可以很容易的在诸如HTTP、POP3、IMAP4、SMTP和FTP等应用层协议上来实现。 SSL安全扩展至少有两种不同的初始化方法,一种是显式安全,另一种是隐式安全。 显示安全:为了建立SSL连接,显式安全要求FTP客户端在和FTP服务器建立连接之后发送一个特定命令,也就是AUTH SSL或者AUTH TLS,显式的告诉FTP服务器初始化对应的安全连接。这时默认的FTP端口就是21端口。 隐式安全:当FTP客户端连接到FTP时,隐式安全将会自动和SSL连接并自动建立安全。 配置SSL加密FTP数据传输 首先我们来查看Vsftpd是否支持SSL。 ``` [root@localhost ~]# ldd `which vsftpd` | grep libssl libssl.so.10 => /usr/lib/libssl.so.10 (0x008cd000) ``` 如果输出有 libssl.so.10 => /usr/lib/libssl.so.10 (0x008cd000) 类似的一行,那么Vsftpd就是支持SSL的。 接下来我们使用Openssl生成证书。 生成顶级CA的公钥和私钥文件,有效期10年(RSA 1024bits)。 ``` [root@localhost ~]# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/ssl/private/ssl-cert-snakeoil.key -out /etc/ssl/certs/ssl-cert-snakeoil.pem Generating a 1024 bit RSA private key ...............................................................++++++ ...........++++++ writing new private key to '/etc/vsftpd/vsftpd.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]: #国家 State or Province Name (full name) []: #省份 Locality Name (eg, city) [Default City]: #城市 Organization Name (eg, company) [Default Company Ltd]: #单位名称 Organizational Unit Name (eg, section) []: #部门 Common Name (eg, your name or your server's hostname) []:192.168.159.136 #域名/主机名/IP地址 Email Address []: #邮件地址 ``` 需要注意的是,域名/主机名/IP地址这块需要填写你主机的真实信息。 编辑Vsftpd的配置文件( /etc/vsftpd/vsftpd.conf),添加SSL支持。 ``` [root@localhost ~]# vim /etc/vsftpd/vsftpd.conf # 添加如下内容。 ssl_enable=YES #启用SSL支持 force_local_logins_ssl=YES #对本地用户登录启用ssl加密 force_local_data_ssl=YES #对本地用户数据传输启用ssl加密 rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem #RSA证书保存位置 rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key #RSA密钥文件保存位置 ssl_tlsv1=YES #启用TLS V1加密 ssl_ciphers=HIGH #启用高级加密方式,若不启用此项,会导致Filezilla报错 pam_service_name=vsftpd #不加这个linux下lftp无法连接 ``` 4. 本地用户登录所做的配置 在ftp服务端,添加一个用户,并为该用户创建本地的home工作目录, ``` useradd -m test #添加用户test,并创建其home工作目录/home/test passwd test #为用户test设置密码 ``` 从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报错。  要修复这个错误,可以用命令chmod a-w /home/test去除用户主目录的写权限,注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加下列两项中的一项: allow_writeable_chroot=YES > 特别注意,用本地用户访问FTP服务器时,一定要把/home/test的文件夹设置为只读!!! 5. 我的配置文件vsftpd.conf,实现匿名用户和本地用户的登录,匿名用户以明文方式传输,本地用户登录以tls加密传输.用浏览器,filezilla访问没问题,智服云的203C模块用于通过FTA服务器FOTA远程升级没问题(须以明文方式访问升级),以供参考 ``` # Example config file /etc/vsftpd.conf listen=YES #这里是YES,须注释掉listen_ipv6 #listen_ipv6=YES # # Allow anonymous FTP? (Disabled by default). anonymous_enable=YES # # Uncomment this to allow local users to log in. local_enable=YES # #write_enable=YES # local_umask=022 # #anon_upload_enable=YES # #anon_mkdir_write_enable=YES # #dirmessage_enable=YES # use_localtime=YES # #xferlog_enable=YES # #passive mode set by qinbao pasv_enable=YES pasv_min_port=4460 pasv_max_port=4463 pasv_promiscuous=YES pasv_address=这里填写FTP服务器的IP地址 # Make sure PORT transfer connections originate from port 20 (ftp-data). #port_enable=YES #connect_from_port_20=YES # #chown_uploads=YES #chown_username=whoever # #xferlog_file=/var/log/vsftpd.log # #xferlog_std_format=YES # #idle_session_timeout=600 # #data_connection_timeout=120 # #nopriv_user=ftpsecure # #async_abor_enable=YES # #ascii_upload_enable=YES #ascii_download_enable=YES # #ftpd_banner=Welcome to blah FTP service. # #deny_email_enable=YES #banned_email_file=/etc/vsftpd.banned_emails # #这里chroot_local_user=NO,若chroot_list_enable=YES,则文件chroot_list_file里的用户名不能切换至根目录 chroot_local_user=NO chroot_list_enable=YES # (default follows) chroot_list_file=/etc/vsftpd.chroot_list # #ls_recurse_enable=YES # #secure_chroot_dir=/var/run/vsftpd/empty # pam_service_name=vsftpd # # This option specifies the location of the RSA certificate to use for SSL # encrypted connections. rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key ssl_enable=YES force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=NO ssl_ciphers=HIGH # # Uncomment this to indicate that vsftpd use a utf8 filesystem. #utf8_filesystem=YES ``` > * 特别注意,一定要在云服务器上打开FTP所用的端口(端口20,21,被动模式下用于数据通道的pasv_min_port和pasv_max_port之间的端口),配置相应端口的**安全组规则 **. > * 还有,匿名用户的共享文件夹位于*/svr/ftp/pub*,其实匿名用户也是有用户名的,叫ftp,无密码. ### FTP服务器的测试 ### FTP服务器可以用匿名和本地用户登录,测试软件可以用浏览器或filezilla(linux和windows平台都有). 1. 匿名登录FTP服务器 * 浏览器输入*ftp://xxx.xxx.xxx.xxx*,正常的话可以看到相应的文件夹,即服务器端/svr/ftp/pub下的内容. 这里的匿名用户其实也是有用户名的,是ftp对应的用户组是ftp,在linux的用户组和用户那里(* /etc/passwd和/etc/group */)可以查到. * filezilla更简单. 2. 本地用户登录FTP服务器 目前我理解本地用户就是FTP服务器的本地用户. 用户名和密码为:test、test 服务器IP和port为:192.168.0.1:21 登录后转到profile文件夹,应该设置为只能访问该用户的home目录(如/home/test),不允许访问其它的目录,以保证FTP服务器系统安全 加密方式为tls * 通过软件工具filezilla访问ftp服务器 需要设置的项目:Host(ftp服务器ip),protocol(FTP),Encryption(Use explicit FTP over TLS if available),Login Type(Normal,即本地用户方式),用户名和密码. 以上设置后,连接登录即可. * 浏览器FTP地址格式为:ftp://用户名:密码@地址:端口/ (如果默认端口是21则不需要填写端口) 如1: ftp://test:test@192.168.0.1:21/profile 如2: ftp://192.168.0.1:21,若FTP服务器只支持本地用户登录,此时会弹出输入用户名和密码的对话框,输入即可访问 > 实践证明以上通过浏览器本地用户的方法不能访问ftp浏览器,可能是浏览器不支持tls的ftp访问. ## 参考文章 ## * [起始篇-简介与MQTT服务器](https://blog.csdn.net/relijin/article/details/73274739) * [初识emq](https://blog.csdn.net/qq_38250168/article/details/80848563) * [EMQ百万级MQTT消息服务(介绍和搭建)](https://blog.csdn.net/u011142688/article/details/79852284) * [EMQ官方文档](http://emqtt.com/docs/v2/install.html) * [如何安装和配置vsftpd与TLS在Debian 8(Jessie)](https://www.howtoing.com/setting-up-vsftpd-tls-on-debian-8-jessie/) * [史上最详细的vsftpd配置文件讲解](https://blog.csdn.net/weiyuefei/article/details/51564367)