SSH反向连接及Autossh

简介

接触Linux恐怕对SSH再熟悉不过了,还有scp,sftp各种方便的功能,一般的使用都需要ip:port(如果不是默认22的话),但有些情况比较特殊,就是想连接一台内网主机(比如公司内网,当然你肯定做不了Port Forwarding,除非你想在公司防火墙上拆个洞)。稍懂一点网络的童鞋会明白,Internet上去主动连接一台内网是不可能的,一般的解决方案分两种,一种是端口映射(Port Forwarding),将内网主机的某个端口Open出防火墙,相当于两个外网主机通信;另一种是内网主机主动连接到外网主机,又被称作反向连接(Reverse Connection),这样NAT路由/防火墙就会在内网主机和外网主机之间建立映射,自然可以相互通信了。但是,这种映射是NAT路由自动维持的,不会持续下去,如果连接断开或者网络不稳定都会导致通信失败,这时内网主机需要再次主动连接到外网主机,建立连接。

环境

A要控制B

A主机:外网,ip:123.123.123.123,sshd端口:2221

B主机:内网,sshd端口:2223

无论是外网主机A,还是内网主机B都需要跑ssh daemon

一、使用SSH方式连接

1.1 首先在B上执行

$ ssh -NfR 1234:localhost:2223 [email protected] -p2221

这句话的意思是将A主机的1234端口和B主机的2223端口绑定,相当于远程端口映射(Remote Port Forwarding)。

这里每次需要输入A主机user1的登陆密码,后面会讲到解决办法。

1.2 这时在A主机上sshd会listen本地1234端口

$ ss -ant
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port
LISTEN     0      128               127.0.0.1:1234                     *:*

1.3 像平时一样连接到A主机的1234端口就可以控制内网B主机了

$ ssh localhost -p1234

二、使用Autossh方式

一开始提到,这种反向连接(Reverse Connection)不稳定,可能随时断开,需要内网主机B再次向外网A发起连接,这时需要个“朋友”帮你在内网B主机执行这条命令。它就是Autossh。

在此之前还要解决之前的一个问题,那就是每次内网主机B连接外网主机A时都需要输入密码,这个问题ssh本身是提供另外一种验证方式——通过密钥验证用户身份,实现自动登录。

2.1 在内网B主机上生产公钥和私钥

$ ssh-keygen
...(一直按Enter,最后在~/.ssh/下生成密钥)
$ ls ~/.ssh/
id_rsa id_rsa.pub known_hosts

2.2 复制B主机上生成的id_rsa.pub公钥到外网A主机上,并将内容加入到~/.ssh/authorized_keys中

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

试下,内网B主机连接外网A主机,就不再输入密码验证了

补充:今天了解到ssh-copy-id这个命令,上面这个操作就变的简单了

$ ssh-copy-id [email protected]

2.3 再来看看Autossh的用法

$ autossh -M 5678 -NR 1234:localhost:2223 [email protected] -p2221

比之前的命令添加的一个-M 5678参数,负责通过5678端口监视连接状态,连接有问题时就会自动重连,去掉了一个-f参数,因为autossh本身就会在background运行。

三、终极方案:当重启内网B主机,谁来自动Autossh呢,加入daemon吧

以daemon方式执行,相当于root去执行autossh, ssh,这时刚才普通用户目录下的.ssh/authorized_keys文件会不起效。有两种办法解决,一种是用autossh的参数指定.ssh路径;另外一种是以普通用户身份执行daemon,下面是第二种方式。

/bin/su -c '/usr/bin/autossh -M 5678 -NR 1234:localhost:2223 [email protected] -p2221' - user1

autossh还有很多参数,用来设置重连间隔等等。

将上面命令放入下面各启动方式中,根据自己系统自己配置:

  • SysV:/etc/inid.d/autossh

  • Upstart: /etc/init/autossh.conf

  • systemd: /usr/lib/systemd/system/autossh.service

用啥ngrok,用ssh解决大局域网反向端口转发问题

自从家里换了联通光纤后,联通就在我家宽带出口前搭了一个路由器,我家也彻底沦为192.168.1.0/24段的局域网了,带来的问题就是在外网无法访问家里的路由器。这对于刷了LEDE,有时候需要从外网直接管理使用路由器的我,觉得难受极了。周末有空,干脆解决这个问题。

在这之前,了解过一个ngrok项目,用于将局域网内的某一个地址的端口,映射到公网。但是研究了一下该软件,发现其在LEDE的源中,并不包含,我又是个懒的去编译的程序员,因此想看看有没有其他办法。

研究一下,发现其实程序员必备的SSH就有这个功能。SSH一共支持三种端口转发:

  • 本地端口转发:就是客户端方的某个端口和服务器某个端口相连,这样访问客户端该端口,就相当于访问服务器端某个端口

  • 远程端口转发:还是把客户端方的某个端口和服务器某个端口相连,只不过反向的,访问服务器端某个端口,就相当于访问到了客户端该端口

  • 动态转发:SOCKS5代理模式,不多说了

更具体一些,可以参见这篇文章:https://blog.twofei.com/528/

回到我的需求,我是希望访问VPS的某个端口,就相当于访问路由器的指定端口。比如我访问VPS的2222,就相当于访问路由器的22端口。所以是第二种:远程端口转发

SSH做起来非常简单,首先,修改VPS端/etc/ssh/sshd_config加入GatewayPorts yes。据说,不这样外网无法访问转发的端口,未验证。然后路由器一条命令搞定:

ssh -f -NR "*:2222:localhost:22" user@vps  

这样子,访问VPS的2222端口,就直接访问到了路由器

进化一:持久

用ssh命令有个问题,因为各种因素,它可能会莫名挂掉,网络不好啦,网络干扰啦,网络xxx啦,总归都是网络问题。因此,我们得祭出神奇autossh。在LEDE的包中,默认就有,安装之,爱死LEDE。在这之前,自己搞定SSH的密钥登录哦,否则autossh起来,也会卡在输入密码。 autossh在LEDE的配置文件是/etc/config/autossh,配置一下

config autossh 'ssh'  
    option gatetime '0'
    option monitorport '20000'
    option poll '600'
    option ssh '-p 22 -NR *:2222:localhost:22 user@vps'

然后开启autossh

进化二:隐藏

在我家的运营商,我发现了一个问题,如果你ssh启动一段时间后,到目的地址的网络丢包就开始大量出现。思来想去,把ssh塞到ssr-tunnel中不就完事了。

先建立一个到VPS的22端口的ssr-tunnel隧道

ssr-tunnel -c /var/etc/shadowsocksr.json -l 2222 -L VPS:22 -f /tmp/ssr-tunnel.pid >> /tmp/ssr-tunnel.log  

这样,访问本机的2222端口,就相当于走ssr流量访问远端的22端口。把autossh的配置稍微改一下,让其访问本机2222端口

config autossh 'ssh'  
    option gatetime '0'
    option monitorport '20000'
    option poll '600'
    option ssh '-p 2222 -NR *:2222:localhost:22 vpsuser@localhost'

为了让ssr-tunnel隧道保持运行,需要搞个监控。不需要很复杂,放到crontab里就可以了

ps | grep [s]sr-tunnel || `ssr-tunnel -c /var/etc/shadowsocksr.json -l 2222 -L vps:22 -f /tmp/ssr-tunnel.pid >> /tmp/ssr-tunnel.log`  

进化三:多射

映射了第一个端口,你就想再来一个。什么aria2映射出来,就可以做外网离线下载。其实也蛮简单的,因为autossh支持多端口映射

config autossh 'ssh'  
    option gatetime '0'
    option monitorport '20000'
    option poll '600'
    option ssh '-p 2222 -NR *:2222:localhost:22 -NR *:6800:localhost:6800 vpsuser@localhost'

这样就把aria2的6800也映射出来了

就这样,结束了.

related post: http://briteming.blogspot.com/2016/04/ngrok.html

SSH的三种端口转发(Port forwarding)/ 隧道协议概要

用SSH有一段时间了,自认为对ssh的操作还是有一定的了解。而今天我要介绍的是ssh的三种端口转发(隧道协议、Tunnel、Port forwarding)功能的使用与它们的使用场合。

为什么要用ssh的端口转发功能,我想大家一定明白(不明白也无所谓,既然来到了这里,你肯定是想把它弄明白的!)。一来是为了安全(数据加密传输);二来是为了突破(穿越)某些防火墙对某些主机的访问限制。

据我所知,SSH一共提供了 3 种端口转发,分别是本地转发(-L参数)、远程转发(-R参数)和动态转发(-D参数)。接下来我就一一介绍这几种不同的转发方式的使用。我尽量简明扼要地叙述主题重点,让人一看就学会(回忆起)该如何操作。

本文用到的一些“术语”和约定

既然提到转发,就应该明白:这是三台主机之间要合作干的事。不然为何不两台主机直连,而要通过第三者转发?
本地主机:形式为IP或域名,你当前正在使用的这台机器;
远程主机:形式与本地主机一样。这里的“远程”并不是指实际的距离有多远,准确地说是“另一台”;

本地转发

本地转发,顾名思义(有点)就是把本地主机端口通过待登录主机端口转发到远程主机端口上去。

本地转发通过参数 -L 指定,格式:-L [本地主机:]本地主机端口:远程主机:远程主机端口。加上ssh待登录主机,这里就有了三台主机。

举例:ssh -L 50000:www.google.com:80 user@host。例中本地主机、远程主机和待登录主机分别用颜色红绿蓝标识。

当成功执行上面的命令之后,访问本地的50000端口,就等同于访问 www.google.com 的 80 端口。但和直接访问有着本质的区别:这次是通过登录主机来安全转发数据的,没有人知道你和远程主机之间传输了何种数据。就算你不能和远程主机建立连接(而登录主机能访问),那就能突破(绕过)(防火墙的)限制。

但本例其实举得不够好。就算你能访问 www.google.com,你却依然不能其它主机,甚至是 google域 的另一台主机,比如 plus.google.com。想要更全面的端口转发功能,还需动态转发。

远程转发

远程转发是指把登录主机端口通过本地主机端口转发到远程主机。
远程转发通过参数 -R 指定,格式:-R [登录主机:]登录主机端口:远程主机:远程主机端口。

举例:ssh -R 0.0.0.0:8080:localhost:80 user@host。

当成功执行上面的命令之后,访问登录主机的 8080 端口就相当于访问 localhost:80!

不要小看这个例子,它可是有相当有用。我书读得多,不会骗你 ????
设想这样一种情况(其实这种情况太普遍了):你在本机开发了一个web应用,想拿给别人测试,但现在你却处在内网,外网是无法直接访问内网的主机的,怎么办!?很多人可能会说,找台有公网IP的主机,重新部署一下就行了。这样可行,但太麻烦。然而自从你了解了ssh的远程转发之后,一切都变得简单了。只需在本地主机上执行一下上面例子的命令即可实现外网访问内网的web应用,相信我,我经常就这样干,屡试不爽。这简直是太好了,awesome! 让你从此对ssh爱不释手。

动态转发

相对于本地转发和远程转发的单一端口转发模式而言,动态转发有点更加强劲的端口转发功能,即是无需固定指定被访问目标主机的端口号。这个端口号需要在本地通过协议指定,该协议就是简单、安全、实用的 SOCKS 协议。FQ(你懂的)就靠她了!

动态转发通过参数 -D 指定,格式:-D [本地主机:]本地主机端口。相对于前两个来说,动态转发无需再指定远程主机及其端口。它们由通过 SOCKS协议 连接到本地主机端口的那个主机(peer,比如最常见的浏览器)指定(此属协议内容,无需深究)。

举例:ssh -D 50000 user@host。

当成功执行上面这个命令后。通过协议告诉你要访问的远程主机及端口,然后你与目标主机之间的数据就通过登录主机安全地传输了。

最常见的用途:FQ(大家都懂的)。在浏览器中设置代理类型为 SOCKS(5),主机及端口:127.0.0.1:50000。然后 gg/ytb/tt/fb 等就一丝不挂地摆在眼前了!

ssh 隐藏版本号

在openssh的源码文件中。

出现有一个sshd.c的文件,用vi sshd.c打开这个文件,找到这一条语句:

snprintf(buf, sizeof buf, “SSH-%d.%d-%.100sn”, major, minor, SSH_VERSION);

将其修改成:

snprintf(buf, sizeof buf, “goodbye”);

然后再使用下面使命令安装openssh

./configure -prefix=/opt/ssh -sysconfdir=/etc/ssh
make
make install

安装完成之后,执行下面命令:

/opt/ssh/sbin/sshd

然后,你在其他机器上使用如下命令:

telnet SSH服务器IP地址 22

此时就只显示goodbye啦。

以上操作在Redhat EL AS4中测试过,不过在安装openssh时需要一些库文件支持,以上只是个人的做法,仅供参考。

Centos 7搭建、配置和使用Http代理(Squid服务器)

一、前言

最近搞了一台腾讯云内网服务器(把公网带宽调到了0Mbps),为了使内网服务器也能连上外网,稍微折腾了一下下Http代理。

本文以Squid代理服务器为栗子,简单介绍一下基本用法

二、安装Squid服务器

首先,在一台能同时连接公网和内网服务器的服务器上安装Squid代理服务器

yum install squid -y

然后就安装完了,是不是很简单呢(鬼才懒得编译呢)

三、配置Squid服务器

主要需要配置的是三个部分:

1、配置允许使用代理的IP地址

#此处使用10.0.0.0/16代表的是,整个10.0.x.x IP段都能使用(x代表任意255内的数字)
acl localnet src 10.0.0.0/16

#如果是限定单个IP使用,则是10.0.0.1/32
acl localnet src 10.0.0.1/32

2、配置允许访问的IP列表

第一个步骤是将10.0.0.0/16整个IP段命名标记为localnet,现在要将localnet添加进允许使用的列表中

#此处代表允许访问的列表包括localhost、manager、localnet三个IP段
http_access allow localhost manager localnet

3、配置Squid监听地址

这个步骤是为了进一步加强安全措施,防止代理服务器被滥用(盗用)

#最简便的规则,监听所有IP的3128端口,不安全,不建议使用
http_port 0.0.0.0:3128

#仅监听内网IP的3128端口,相对安全,建议使用
http_port 10.0.0.1:3128

四、使用代理

1、yum代理

#编辑/etc/yum.conf文件
vim /etc/yum.conf

#查找并修改或追加以下语句(将10.0.0.1修改为你的Squid配置的监听地址或服务器的IP):

proxy=http://10.0.0.1:3128/ 

2、wget代理

#编辑/etc/wgetrc文件
vim /etc/wgetrc

#查找并修改或追加以下语句(将10.0.0.1修改为你的Squid配置的监听地址或服务器的IP):

http_proxy=http://10.0.0.1:3128/
ftp_proxy=http://10.0.0.1:3128/

3、环境变量

#编辑/etc/profile文件
vim /etc/profile

#查找并修改或追加以下语句(将10.0.0.1修改为你的Squid配置的监听地址或服务器的IP):

http_proxy=http://10.0.0.1:3128/
ftp_proxy=http://10.0.0.1:3128/

export http_proxy
export ftp_proxy

squid+stunnel为docker配置代理服务器

目地

为k8s的docker服务提供http/https代理,解决docker无法pull gcr.io/google_containers 谷歌镜像问题

环境

  • GCE ubuntu 16.04
  • k8s集群机器 ubuntu16.04

简要步骤

一、GCE 搭建squid正向http/https代理服务器

1. 直接使用apt-get install 安装

apt-get install squid3 -y

注意:配置文件在/etc/squid或/etc/squid3下,根据系统不同可能会有一点差异,由于这里进行快速安装,不需要暴露端口给外部使用,也不需要密码,所以配置文件我这里保持默认

二、GCE 安装stunnel代理服务器

1. stunnel主要用来在GCE和k8s机器上代理的数据传输进行加密,否则明文传输很快会被GFW拦截.注意stunnel分为服务端和客户端,GCE上安装服务端,在k8s集群上安装客户端

2. 直接使用apt-get install 安装服务端

apt-get install stunnel4 -y

如果遇到

  • 正试图覆盖 /etc/ppp/ip-down.d,它同时被包含于软件包 resolvconf 1.78ubuntu2
  • dpkg-deb:错误:子进程 粘贴 被信号(断开的管道) 终止了

使用dpkg强制覆盖安装:

cd /var/cache/apt/archives
dpkg -i --force-overwrite xxx.deb

编辑配置文件 vim /etc/stunnel/stunnel.conf

client = no #是否为客户端 这里是服务端填写no
[squid]
accept = 65501
connect = 127.0.0.1:3128 #本地squid服务地址
cert = /etc/stunnel/stunnel.pem #下一步生成的证书地址

openssl生成证书,用户stunnel加密解密

openssl genrsa -out key.pem 2048
openssl req -new -x509 -key key.pem -out cert.pem -days 1095
cat key.pem cert.pem >> /etc/stunnel/stunnel.pem

注意:创建证书时,系统会要求您提供一些国家/地区信息,可随便输入,但是当被要求输入“Common Name”时,您必须输入正确的hostname或IP地址(VPS),我这里输入的ip地址。

通过配置/etc/default/stunnel4文件启用自动启动,vim /etc/default/stunnel4

#将ENABLED更改为1:

ENABLED=1

重新启动Stunnel使配置生效,使用以下命令:

/etc/init.d/stunnel4 restart

三、K8S 集群机器分别搭建stunnel

1. 安装步骤几乎和上面相同

2. scp或其他方法把证书拷贝到k8s集群中

3. 配置文件不同(注意不要#号,systemctl status stunnel4.service)

cert = /etc/stunnel/stunnel.pem #和服务端完全相同的证书
client = yes #声明为客户端
[squid]
accept = 127.0.0.1:65502 #本地代理的端口,即为http/https代理地址
connect = {GCE_IP}:65501 #GCE 服务端ip和端口

四、浏览器SwitchyOmega代理穿透GFW

1. 配置添加http代理127.0.0.1:65502 即可

五、docker添加http/https代理请参考官方文档

https://docs.docker.com/engine/admin/systemd/#start-manually

openresty通过lua增加随机traceid

在没有引入zipkin(或者阿里的鹰眼,百度的华佗)这种trace系统的时候,排查问题的一般思路都是按照请求链路来寻找问题源。因此如果能在请求链路中有一个唯一的标识就最好了,而在nginx/openresty做接入层的架构中,可以通过lua脚本生成一个随机traceid。

随机数的生成原理,都是先初始化一个随机数种子,由于伪随机数的特性,种子的随机性就显得格外重要,而一般种子的生成都是通过时间的倒序来选取

lua 随机数生成方法

首先我们看下通常lua的随机数生成方法

math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6)))
math.random(m,n)

通过时间字符串的逆序初始化随机种子,这里注意到有个sub函数做了截断,是因为

math.randomseed will call the underlying C function srand which takes an unsigned integer valueLua will cast the value of the seed to this format. In case of an overflow the seed will actually become a bad seed, without warning

所以需要避免出现高类型向低类型转换的溢出问题

common 方法的问题

但上面的方法有个问题,就是os.time()函数返回的是秒(10位整数), 所以在做web请求的traceid时很容易就出现重复,影响问题追踪的效率,而lua如果要以毫秒为单位的时间来初始化随机种子,需要引入socket等外部模块,对于openresty来说一般都是封装好的,不方便去做这种定制

利用openresty 与lua生成traceid

幸运的是,nginx-lua中有个函数ngx.now会返回一个浮点数(当然在lua中统一为number类型),3位小数即为毫秒位,所以问题就变得简单了

access_by_lua_block {
    math.randomseed(tonumber(tostring(ngx.now()*1000):reverse():sub(1,9)))
    local randvar = string.format("%.0f",math.random(1000000000000000000,9223372036854775807))
    ngx.req.set_header("traceid", randvar)
}

通过ngx.now()*1000拿到毫秒数据转换为字符串取反,这样毫秒数据的变化才能显出效果; unsigned int(64bit机器下为4byte) 最大值为10位数,我们取前9位避免数据溢出带来的转换问题; lua在显示大于64bit的数据时会自动用科学技术法表示,所以我们需要通过string.format函数来将其转换为19位数字,然后通过ngx.req.set_header添加到请求头中去。

samba安装及配置说明

amba是为了跨平台(windows及Linux)的文件共享而产生的网络文件系统,有了Samba,window用户可以像访问本地磁盘一样访问局域网(or 远端)Linux系统的磁盘,当然Linux用户也可以直接去访问windows系统的磁盘。

关于samba的详细介绍可以参考鸟哥的Linux 及 Samba Wiki

1、Centos samba安装与启动

我们以Linux系统安装Samba Server 为例,Samba目前的版本为4.6版本,centos用户可以直接yum install samba, 启动也十分简单,service smb start (centos6) or systemctl start smb (centos7)

2、samba 配置

yum安装完samba之后,在/etc/samba/下面有samba的配置文件,一般会有一个smb.conf.example 配置实例,里面有各个配置项的详细解释

[global]
#workgroup 配置成和windows机器的工作组相同的名字
workgroup = WORKGROUP
server string = Samba Server
#netbios name 是用来设置局域网别名(不同于hostname),如果不用nmb服务的话,这个没有用处
netbios name = tjwq024113
#这2个选项用来设置字符集,防止出现乱码(window与Linux编码通常不一样)
dos charset = cp950
unix charset = UTF8
##
ntlm auth = no
lanman auth = no
client ntlmv2 auth = yes
##日志的配置
log file = /var/log/samba/log.%m
max log size = 50
##安全模式,4.6之后没有share模式(不需要鉴权)了,因此需要设置一个密码
security = user
passdb backend = tdbsam
##局域网内的browser配置,没有多少用处
domain master = yes
local master = yes
os level = 33
preferred master = yes

####下面是共享文件夹的配置
#pan设置了共享的名称,访问的时候用\servershare来访问,而不是\serverdatasamba
[share]
#备注
comment = samba share 
#共享文件夹路径
path = /data/samba
browseable = yes
#设置客户端的写权限
writable = yes
#用于客户端新建文件(夹)的权限设置
create mask = 0664
directory mask = 0775
#需要注意这里的user必须设置成用户登录共享文件夹的用户,不要用%U,%U是客户端的用户
valid users = work
#设置是否公开,因为security设置了user 模式,所以这个配置无效了就
public = yes

然后需要创建samba用户,因为我们使用TDB数据库,所以用pdbedit来新建一个用户

$pdbedit -a -u samba  #-a add user option, -u specify a username

配置文件修改完后,需要用testparm来测试配置文件语法

然后用smbclient测试文件加可否正常访问

$testparm
$smbclient -L //server -Uwork

3、windows挂载samba共享磁盘

windows 用户想要访问Linux共享的磁盘,需要 win+R 弹出运行窗口,然后输入\server\share敲回车键,根据提示输入密码,则在网络那里就可以看到共享的磁盘了。

当然右键点击并选择映射网络驱动器的话,还可以将其挂载,这样就可以像本地磁盘一样使用了。

samba安装配置使用

samba,连接Unix阵营和Windows系统的桥梁。在类Unix系统中安装samba服务端,让windows系统像访问共享文件夹一样访问类Unix系统中的指定文件夹。

samba,桑巴舞蹈也是它呢!给一个软件起了这样性感的名字,想想是不是醉了。

有了这个小家伙,解决了我们局域网多个系统互相访问文件的大麻烦。下面是全过程。

1. 安装samba,apt-get 推荐我安装samba4.

[html] view plain copy

  • sudo apt-get install samba4

安装时遇到错误:

[plain] view plain copy

  • /var/lib/dpkg/info/samba4.postinst: 14: /var/lib/dpkg/info/samba4.postinst: /usr/share/samba/setoption.pl: Permission denied
  • dpkg: error processing samba4 (–configure):
  • subprocess installed post-installation script returned error exit status 126
  • Errors were encountered while processing:
  • samba4
  • E: Sub-process /usr/bin/dpkg returned an error code (1)

应该是我的dpkg有问题,源于上一次的apt-get upgrade中途被我人工阻断。

解决的办法是删掉/var/lib/dpkg/info这个文件夹并重新创建它。

[html] view plain copy

  • cd /var/lib/dpkg
  • sudo mv info info.bak
  • sudo mkdir info

重新install就可以了。

2. 在/home下创建文件夹用以共享

[html] view plain copy

  • home$ sudo mkdir share
  • home$ sudo chmod 777 share

创建一个文件在share文件夹中,一会用它作为访问成功与否的标志。

3. 修改smb的配置文件

之前可以先做个备份

[html] view plain copy

  • home$ sudo cp /etc/samba/smb.conf /etc/samba/smb-bk.conf
  • home$ sudo vim /etc/samba/smb.conf

找到security = user这一句,如果被注释了,就放开注释。

在其后增加一句:username map = /etc/samba/smbusers

在文件的最后增加下面语句:

[html] view plain copy

  • [Share]
  • comment = Shared Folder
  • path = /home/share
  • public = yes
  • writeable = yes
  • valid users = friend
  • create mask = 0700
  • directory mask = 0700
  • force user = nobody
  • force group = nogroup
  • available = yes
  • browseable = yes

上面设置了文件的路径和可用的用户为friend。

再搜索[global]

在workgroup = workgroup下面增加如下:

[html] view plain copy

  • display charset = UTF-8
  • unix charset = UTF-8
  • dos charset = cp936

保存并退出。

4. 增加friend账户

[html] view plain copy

  • home$ sudo useradd friend

为friend设置smb密码

[html] view plain copy

  • home$ sudo smbpasswd -a friend
  • New SMB password:
  • Retype new SMB password:
  • Added user friend.

5. 新建smbusers文件并增加一行语句

[html] view plain copy

  • home$ sudo vim /etc/samba/smbusers
  • friend = “network username”

6. 重启smbd

[plain] view plain copy

  • home$ sudo service smbd restart

查看smbd监听端口

home$ sudo netstat -tlnp | grep smb
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      5224/smbd       
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      5224/smbd   

7. 在windows中测试

命令行输入\my ip

就可以访问了。

文件共享服务Samba

介绍

SMB:Server Message Block服务器消息块,IBM发布,最早是DOS网络文件共享协议

SAMBA的功能:

  • 共享文件和打印,实现在线编辑
  • 实现登录SAMBA用户的身份认证
  • 可以进行NetBIOS名称解析
  • 外围设备共享

Samba介绍

相关包:

Samba 提供smb服务
Samba-client 客户端软件
samba-common 通用软件
cifs-utilssmb客户端工具
samba-winbind和AD相关

相关服务进程:

smbd提供smb(cifs)服务TCP:139,445
nmbdNetBIOS名称解析UDP:137,138
主配置文件:/etc/samba/smb.conf
帮助参看:man smb.conf
语法检查:testparm[-v] [/etc/samba/smb.conf]
客户端工具:smbclient,mount.cifs

Samba服务器配置

Samba服务的配置文件在/etc/samba/smb.conf里 来看一下文件的内容,包了几个部分

#全局设置:
[global]    #服务器通用或全局设置的部分

#特定共享设置:
[homes]     #用户的家目录共享
[printers]  #定义打印机资源和服务
[sharename] #自定义的共享目录配置

#在配置文件中的宏定义
宏定义:
    %m 客户端主机的NetBIOS名
    %M 客户端主机的FQDN
    %H 当前用户家目录路径
    %U 当前用户用户名
    %g 当前用户所属组
    %h samba服务器的主机名
    %L samba服务器的NetBIOS名
    %I 客户端主机的IP
    %T 当前日期和时间
    %S 可登录的用户名

#全局的服务配置
workgroup       指定工作组名称
server string   主机注释信息
netbios name    指定NetBIOS名
interfaces      指定服务侦听接口和IP
hosts allow     可用“,” ,空格,或tab分隔,默认允许所有主机访问,也可在每个共享独立配置,如在[global]设置,将应用并覆盖所有共享设置
hosts deny      拒绝指定主机访问
config file=/etc/samba/conf.d/%U    用户独立的配置文件
Log file=/var/log/samba/log.%m      不同客户机采用不同日志
max log size=50                     日志文件达到50K,将轮循rotate,单位KB
Security                            三种认证方式:
    share:  匿名(CentOS7不再支持)
    user:   samba用户(采有linux用户,samba的独立口令)
    domain:使用DC(DOMAINCONTROLLER)认证
passdb backend = tdbsam             密码数据库格式

管理samba用户

#添加samba用户
smbpasswd  -a <user>    #该用户必须是Linux内存在的系统用户,同时为用户添加账户和密码
pdbedit -a -u <user>

#修改用户密码
smbpasswd  <user>

#删除用户和密码:
smbpasswd –x <user>
pdbedit –x  –u <user>

#查看samba用户列表:
/var/lib/samba/private/passdb.tdb
pdbedit   –L –v         #查看本机的Samba账户

#查看samba服务器状态
smbstatus

设定共享目录

#每个共享目录应该有独立的[ ]部分,选项内容为
[共享名称]      远程网络看到的共享名称
comment         注释信息
path            所共享的目录路径
public          (能否匿名访问)能否被guest访问的共享,默认no,和guest ok 类似
browsable       是否允许所有用户浏览此共享,默认为yes,no为隐藏共享文件
writable=yes    可以被所有用户读写,默认为no
read only=no    和writable=yes等价,如与以上设置冲突,放在后面的设置生效,默认只读
write list      三种形式:用户,@组名,+组名,用,分隔
    如writable=no,列表中用户或组可读写,不在列表中用户只读
valid users 特定用户才能访问该共享,如为空,将允许所有用户,用户名之间用空格分隔

实现Samba文件共享

在进行操作前请确保已经安装了Samba软件包,如未安装执行如下命令yum install samba

#创建Samba共享的用户和组,并将wang用户添加至admin组中
useradd -s /sbin/nologin wang
useradd -s /sbin/nologin ymd
groupadd admin
groupmems -g admin -a wang

#设定samba用户和密码
smbpasswd -a wang
smbpasswd -a ymd

#创建共享目录
mkdir  /app/share
chgrp admin /app/share

#设定samba配置文件sma.conf
#编辑/etc/samba/smb.conf
[share]
path = /app/share       #共享文件夹的路径
write list = @admin     #可写的列表,未在列表当中的为只读

#重新启动samba服务
service smb restart

#客户端访问测试
yum -y install cifs-utils  #客户端工具包
#登录访问
[root@centos7 ~]#smbclient  //172.18.18.18/share -U wang%centos
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.23-41.el6]
smb: > ls
  .                                   D        0  Mon Oct 16 07:21:08 2017
  ..                                  D        0  Mon Oct 16 07:20:38 2017
  samba                               N        0  Mon Oct 16 07:21:08 2017

        40185208 blocks of size 1024. 37987148 blocks available

挂载cifs文件系统

同样也需要安装户端工具包cifs-utils,这里不再赘述

#进行手动挂载
[root@centos7 ~]#mount -o username=wang,password=centos //172.18.18.18/share /mnt/smb
#进行查看
[root@centos7 ~]#cd /mnt/smb/
[root@centos7 /mnt/smb]#ls
samba  yan.pubkey

#开机自动挂载
编辑/etc/fstab文件,可以用文件代替用户名和密码的输入
//172.18.18.18/share    /mnt/smb     cifs    credentials=/etc/smb.txt      0 0

#编辑用户密码文件
vim /etc/smb.txt
    username=wang
    password=centos

#为了防止密码泄露更改权限
chmod  600 /etc/smb.txt

多用户挂载

SAMBA共享默认只支持同时用一个用户挂载SMB共享 CentOS7中可启用多用户挂载功能客户端挂载samba共享目录后,在客户端登录的不同用户访问同一个samba的挂载点,可获得不同权限

#Samba服务器配置
vim /etc/samba/smb.conf
[smbshare]
path=/app/share
write list= @admins

#Samba服务器创建账户及设定共享目录权限,与上面创建的用户一致,这里不再进行重新创建和设置
#同时需要在客户端也需要创建相同的账号

#samba客户端启用多用户挂载

vim  /etc/smb.txt
    username=ymd
    password=centos

chmod 600 /etc/smb.txt

#以多用户的方式挂载
vim /etc/fstab
//172.18.18.18/share    /mnt/smb     cifs    multiuser,credentials=/etc/smb.txt      0 0

mount -a 

#在客户端上进行测试
#默认是以挂载时的用户进行访问的
[root@centos7 ~]#cd /mnt/smb/
[root@centos7 /mnt/smb]#touch aaa
touch: cannot touch ‘aaa’: Permission denied    #与设定的相符,ymd账号只有读 的权限

#切换成wang用户进行测试
su - wang 
cifscreds add  172.18.18.18
[wang@centos7 ~]$ cd /mnt/smb/
[wang@centos7 smb]$ touch aaa
[wang@centos7 smb]$ ls
aaa  samba  yan.pubkey                          #能够创建文件,有读写权限

多用户实现了特定的用户的特定权限

这里还要进行说明,也可以再全局设定中指定子配置文件来对不同的用户进行设定

#在global内添加如下内容
[global]
config file  = /etc/samba/conf.d/%U

#在自己指定的配置目录写创建与用户同名的子配置文件
#那么在进行指定的用户连接时就可以,读取相应的配置文件

至此Samba文件共享的服务完毕,如有错误还望批评指正,敬请谅解!

公司内部Samba 服务器架设

一、需求

在公司内部打造一个文件管理系统,其作用域仅仅在公司内部,支持在线对文件的修改和保存操作等,同时也要注意权限问题。

二、策划

目前设立四个群组:运维、开发 、测试和普通,当然所对应的对文件的访问权限也是不一致的,运维具有最高权限,其次才是开发、测试和普通

三、安装与部署

3.1 利用yum安装samba服务器

[root@localhost ~]# yum install -y samba

3.2 利用groupadd建立用户组

[root@localhost ~]# groupadd management

[root@localhost ~]# groupadd development

[root@localhost ~]# groupadd test

[root@localhost ~]# groupadd user

[root@localhost ~]#

3.3 新建用户并且指定群组

[root@localhost ~]# cat /etc/group | egrep "management|development|test|^user:"

management:x:1001:

development:x:1002:

test:x:1003:

user:x:1004:

[root@localhost ~]#

[root@localhost ~]# useradd D17040009 -g 1001

[root@localhost ~]# useradd D17040010 -g 1002

[root@localhost ~]# useradd D17040011 -g 1003

[root@localhost ~]# useradd D17040012 -g 1004

3.4 新建文件夹并且配置ACL权限

[root@localhost home]# mkdir sam

[root@localhost sam]# mkdir management development test user

[root@localhost sam]# setfacl -m g:development:rwx development/

[root@localhost sam]# setfacl -m g:management:rwx management/

[root@localhost sam]# setfacl -m g:management:rwx development/

[root@localhost sam]# setfacl -m g:management:rwx tset/

[root@localhost sam]# setfacl -m g:management:rwx test/

[root@localhost sam]# setfacl -m g:management:rwx user/

[root@localhost sam]# setfacl -m g:development:rwx test/

[root@localhost sam]# setfacl -m g:development:rwx user/

[root@localhost sam]# setfacl -m g:test:rwx test

[root@localhost sam]# setfacl -m g:test:rwx user

[root@localhost sam]# setfacl -m g:user:rwx user

3.5 修改配置文件

[root@localhost sam]# cat /etc/samba/smb.conf

# See smb.conf.example for a more detailed config file or

# read the smb.conf manpage.

# Run 'testparm' to verify the config is correct after

# you modified it.

[global]

# workgroup = SAMBA

workgroup = WORKGROUP

security = user

passdb backend = tdbsam

printing = cups

printcap name = cups

# load printers = yes

load printers = no

cups options = raw

log file = /var/log/samba/log.%m

max log size = 50

passdb backend = smbpasswd

username map = /etc/samba/smbusers

[smb]

comment = 5M1330

path = /home/sam

writable = yes

browseable = yes

available = yes

#[homes]

# comment = Home Directories

# comment = 5M1330 Directories

# path = /home/vsftpd

# admin user = root

# valid users = %S, %D%w%S

# valid user = @management,@development,@test,@user

# browseable = yes

# writable = yes

# read only = no

# inherit acls = Yes

# guest ok = no

#[printers]

# comment = All Printers

# path = /var/tmp

# printable = Yes

# create mask = 0600

# browseable = No

#[print$]

# comment = Printer Drivers

# path = /var/lib/samba/drivers

# write list = root

# create mask = 0664

# directory mask = 0775

四、测试

4.1 登陆用户:D17040009 所属组:management

未分类

4.2 登陆用户:D17040010所属组:development

未分类

4.3 登陆用户:D17040011所属组:test

未分类

4.4 登陆用户:D17040012所属组:user

未分类

五、系统维护和故障排除

5.1 无法连接samba服务器

  • 尝试ping一次查看网络能否ping通
  • 查看firewall配置
  • 重启samba服务尝试

5.2 无法创建文件

  • 查看服务器selinux配置
  • 重启samba服务尝试

5.3 新建用户并且加入群组无法访问应该访问的位置

  • 删除用户再次新建