方案1 : samba
简介
Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。
在此我们仅使用samba的nmbd服务,即名字解析和浏览服务
安装apt install samba
apt install samba
配置
启动配置
安装samba后,可以通过安装信息看到,samba的开机启动服务配置文件为
/lib/systemd/system/samba-ad-dc.service
/lib/systemd/system/nmbd.service
/lib/systemd/system/smbd.service
本来我想的是使用命令行启动,但是我看了下service文件,发现samba的三个守护进程是相互独立的,所以对于nmbd 守护进程的配置,还是使用系统默认的方式
- 设置开机启动
systemctl enable nmbd
- 启动nmdb
systemctl start nmbd
- 重新启动nmbd
systemctl restart nmbd
- 查看nmbd的状态
systemctl status nmbd
nmbd配置
samba的默认配置文件位于/etc/samba/smb.conf
,netbios name
字段用于设置设备在网络上的名称
[global]
## Browsing/Identification ###
# Change this to the workgroup/NT-domain name your Samba server will part of
workgroup = WORKGROUP
# netbios name should be device name or dns name or hostname
netbios name = isrv-1000
设置完后需要重启nmbd
验证
Linux:
~# nmblookup isrv-1000
192.168.20.130 isrv-1000<00>
Windows: in cmd.exe
C:\Users\xxxx> ping isrv-1000
正在 Ping isrv-1000 [192.168.20.130] 具有 32 字节的数据:
来自 192.168.20.130 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.20.130 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.20.130 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.20.130 的回复: 字节=32 时间<1ms TTL=64
192.168.20.130 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
方案2 : Avahi
Avahi是一个采用DNS Service Discovery(DNS SD,RFC 6763中单独指定的Zeroconf技术)和Multicast DNS(mDNS,协议发布为RFC 6762) 鉴别技术来进行网络零配置,可以配合DNS使用,在局域网络中没有DNS服务器时,可替代DNS
Avahi的功能是针对Zeroconf 技术和mDNS规范,samba则是NETBIOS规范的实现
Avahi被广泛的使用,很多网络服务程序的依赖,包括samba在内,我在近期的几个分布式编解码的方案中都有发现这个程序,用于设备发现和设备网络的自动配置
目前Windows系统中仅有win10支持Avahi,所以仅能在win10下进行域名解析,这里提出这个方案仅作为未来的替换方案,或可作为分布式系统中节点的设备发现和网络配置方案
安装
sudo apt-get install avahi-daemon avahi-utils
使用
在Linux中
# 启动daemon
>>> avahi-daemon
# 设置名字
>>> avahi-set-host-name -v zhangbin-ubuntu
Server version: avahi 0.6.32-rc; Host name: alex-ubuntu.local
Host name successfully changed to zhangbin-ubuntu.local
在Windows10中测试
C:\Users\zb>ping zhangbin-ubuntu.local
正在 Ping zhangbin-ubuntu.local [fe80::250:56ff:fe27:5f94%19] 具有 32 字节的数据:
来自 fe80::250:56ff:fe27:5f94%19 的回复: 时间<1ms
来自 fe80::250:56ff:fe27:5f94%19 的回复: 时间<1ms
来自 fe80::250:56ff:fe27:5f94%19 的回复: 时间<1ms
来自 fe80::250:56ff:fe27:5f94%19 的回复: 时间<1ms
fe80::250:56ff:fe27:5f94%19 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
在Windows10中的浏览器中测试(在此用curl代替),我在ubuntu上用node启动了一个http服务器,在Windows中使用http://zhangbin-ubuntu.local:8888/ 进行访问
$ curl -i http://zhangbin-ubuntu.local:8888/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 33 0 33 0 0 12 0 --:--:-- 0:00:02 --:--:-- 12HTTP/1.1 200 OK
Content-Type: text/plain
charset: utf-8
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS
Date: Wed, 04 Nov 2020 09:58:47 GMT
Connection: keep-alive
Transfer-Encoding: chunked
{"id":"0036",name:"jack",arg:123}
测试时使用的node脚本
>>> cat test.js
/*
* @Author: zb
* @Date: 2020-11-04 15:17:03
* @Last Modified by: zb
* @Last Modified time: 2020-11-04 15:17:21
*/
var http = require("http");
function onRequest(request, response){
console.log("Request received.");
var str='{"id":"0036",name:"jack",arg:123}';
response.writeHead(200,{"Content-Type":'text/plain','charset':'utf-8','Access-Control-Allow-Origin':'*','Access-Control-Allow-Methods':'PUT,POST,GET,DELETE,OPTIONS'});
//response.writeHead(200,{"Content-Type":'application/json','Access-Control-Allow-Origin':'*','Access-Control-Allow-Methods':'PUT,POST,GET,DELETE,OPTIONS'});
//response.write("Hello World 8888\n");
response.write(str);
response.end();
}
http.createServer(onRequest).listen(8888);
avahi其他
>>> avahi-resolve-host-name -h
avahi-resolve-host-name [options] [-n] <host name ...>
avahi-resolve-host-name [options] -a <address ... >
-h --help Show this help
-V --version Show version
-n --name Resolve host name
-a --address Resolve address
-v --verbose Enable verbose mode
-6 Lookup IPv6 address
-4 Lookup IPv4 address
一个设备存在多个网卡或者虚拟网卡时,优先返回