linux systemd管理网络服务


网络服务与端口对应简介

回到顶部

系统的某些服务功能都是由对应的进程提供,进程则是由运行对应的程序而产生。 系统提供的网络服务也是有对应的进程提供! 只不过网络牵涉到TCP/IP概念,相对比较复杂。IP代表主机在因特网(Internet)上的门牌号码。
一般主机上会同时运行着多个网络服务进程, 但是主机只有一个ip,那么客户端是怎么找到对应的服务进程的呢?
其实每个网络服务进程会绑定一个端口号(port number),ip和端口号的组合就唯一标识了网络中的一个服务进程。
所以网络服务简单的理解为绑定网络端口的服务就是网络服务。
例如我的主机上同时运行着提供www服务的http进程,和提供ftp服务的ftp进程,
在浏览器中分别通过如下方式访问http服务进程和ftp服务进程:

http://192.168.1.121 ftp://192.168.1.121
这里仅以局域网为例,如果是internet,只需要把局域网ip改成对应的域名即可。
同样都是访问192.168.1.121这台主机,但是这两种方式访问的是同一台主机上面的两个不同的进程。
怎么找到对应的进程呢?就是通过端口号,http进程绑定在80端口,ftp进程绑定在21端口, 这样通过http://192.168.1.121访问主机的时候,就直接找到80端口即可,找到80端口也就找到了对应的服务进程了。ftp也同样如此。
每个提供网络服务的进程都会绑定一个网络端口,那么这些端口可以随便绑定吗? 是可以随便绑定的,只要服务器和客户端双方商量好即可,即双方协商好通信协议。
但是随着网络服务越来越多,如果每个服务进程都随便占用网络端口,就会出现混乱。
比如http服务进程在这台主机占用了80端口,在另一台主机占用了21端口,即使服务端事先和客户端商量好了,也会把客户端烦死。
为了统一整个因特网的端口号对应的网络服务,让所有的主机都能够使用相同的机制来请求或提供服务, 于是大家坐在一起商量,干脆约定好以后http就只占用80端口,ftp就只占用21端口。
这些约定放在一个文件中,这就是/etc/services文件:
              [root@initroot ~]# cat /etc/services
              ...省略...
              ftp 21/tcp ftp 21/udp ssh 22/tcp # The Secure Shell (SSH) Protocol
              ssh		22/tcp				# SSH Remote Login Protocol
              fsp fspd
              ...省略...
              http 80/tcp www www-http # WorldWideWeb HTTP
              http 80/udp www www-http # HyperText Transfer Protocol
              ...省略...

              # <daemon name> <port/封包协议> <该服务的说明>
            
第一栏为daemon名称、第二栏为该daemon所使用的端口号与网络数据封包协议, 封包协议主要分为可靠连接的TCP封包以及较快速但为非面向连接的UDP封包。 例如提供远程连接服务的ssh,使用的端口号就是22!使用数据传输协议为tcp
切记尽量不要修改/etc/services文件中的端口设置, 除非你要架设一个地下网站。

关闭网络服务

回到顶部

除了使用systemctl观察提供Linux系统基础操作环境的本地服务,网络服务才是在系统运维中要重点关注的。一般本地服务都不想要更改设置,保持默认的即可。
/etc/services文件是对服务和端口的一个约定性文件,如果查看当前系统中开启了哪些端口呢?通过netstat命令查看:

              [root@initroot ~]# netstat -tlunp
              Active Internet connections (only servers)
              Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
              tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      337/nginx: master p 
              tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1193/mysqld         
              tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      337/nginx: master p 
              tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      337/nginx: master p 
              tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1242/sshd           
              tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      26447/node          
              tcp6       0      0 :::80                   :::*                    LISTEN      337/nginx: master p 
              udp        0      0 0.0.0.0:68              0.0.0.0:*                           717/dhclient  
              udp        0      0 0.0.0.0:5353            0.0.0.0:*                           750/avahi-daemon: r
              udp        0      0 0.0.0.0:36540           0.0.0.0:*                           750/avahi-daemon: r      
              udp        0      0 172.31.47.31:123        0.0.0.0:*                           492/ntpd            
              udp        0      0 127.0.0.1:123           0.0.0.0:*                           492/ntpd            
              udp        0      0 0.0.0.0:123             0.0.0.0:*                           492/ntpd            
              udp6       0      0 :::123                  :::*                                492/ntpd            
            
如上表所示,系统至少开启了22, 443, 3000, 80, 8080,3306,5353, 36540这些端口。
5353和36540是由avahi-daemon进程开启! 使用systemctl观察一下avahi-daemon服务:
              [root@initroot ~]# systemctl list-units --all | grep avahi-daemon
              avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
              avahi-daemon.socket loaded active running Avahi mDNS/DNS-SD Stack Activation Socket
            
avahi-daemon的目的是在局域网络进行类似网芳的搜寻,这个服务可以协助你在局域网内随时了解即插即用的设备! 包括笔记本电脑等,只要连上你的区网,你就能够知道谁进来了。 可能不太需要这个服务,关闭吧:
              [root@initroot ~]# systemctl stop avahi-daemon.service
              [root@initroot ~]# systemctl stop avahi-daemon.socket
              [root@initroot ~]# systemctl disable avahi-daemon.service avahi-daemon.socket
              [root@initroot ~]# netstat -tlunp
              Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
              tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1340/sshd
              tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2387/master
              tcp6 0 0 :::555 :::* LISTEN 29113/vsftpdtcp6 0 0 :::22 :::* LISTEN 1340/sshd
              tcp6 0 0 ::1:25 :::* LISTEN 2387/master
            
一般来说,本地服务器至少需要25号端口,22号端口最好加上防火墙来管理远程联机登入。

两个 vsftpd 运作的实例

回到顶部

我们在上一章将 vsftpd 的 port 改成 555 号了。不过,因为某些原因,所以你可能需要使用到两个 端口,分别是正常的 21 以及特殊的 555 ! 这两个 port 都启用的情况下,你可能就得要使用到两 个配置文件以及两个启动脚本设置了!现在假设是这样:
预设的 port 21:使用 /etc/vsftpd/vsftpd.conf 配置文件,以及 /usr/lib/systemd/system/vsftpd.service 设置脚本;
特殊的 port 555:使用 /etc/vsftpd/vsftpd2.conf 配置文件,以及 /etc/systemd/system/vsftpd2.service 设置脚本。
我们可以这样作:
# 1. 先建立好所需要的配置文件

              [root@initroot ~]# cd /etc/vsftpd
              [root@initroot vsftpd]# cp vsftpd.conf vsftpd2.conf
              [root@initroot vsftpd]# vim vsftpd.conf
              #listen_port=555
              [root@initroot vsftpd]# diff vsftpd.conf vsftpd2.conf
              128c128
              < #listen_port=555
              ---
              > listen_port=555
            
# 注意这两个配置文件的差别喔!只有这一行不同而已!
# 2. 开始处理启动脚本设置
              [root@initroot vsftpd]# cd /etc/systemd/system
              [root@initroot system]# cp /usr/lib/systemd/system/vsftpd.service vsftpd2.service
              [root@initroot system]# vim vsftpd2.service
              [Unit]
              Description=Vsftpd second ftp daemon
              After=network.target
              [Service]
              Type=forking
              ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf
              [Install]
              WantedBy=multi-user.target# 重点在改了 vsftpd2.conf 这个配置文件喔!
            
# 3. 重载 systemd 的脚本配置文件内容
              [root@initroot system]# systemctl daemon-reload
              [root@initroot system]# systemctl list-unit-files --all | grep vsftpd
              vsftpd.service enabled
              vsftpd2.service disabled
              vsftpd@.service disabled
              vsftpd.target disabled
              [root@initroot system]# systemctl status vsftpd2.service
              vsftpd2.service - Vsftpd second ftp daemon
              Loaded: loaded (/etc/systemd/system/vsftpd2.service; disabled)
              Active: inactive (dead)
              [root@initroot system]# systemctl restart vsftpd.service vsftpd2.service
              [root@initroot system]# systemctl enable vsftpd.service vsftpd2.service
              [root@initroot system]# systemctl status vsftpd.service vsftpd2.service
              vsftpd.service - Vsftpd ftp daemon
              Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled)
              Active: active (running) since Wed 2015-08-12 22:00:17 CST; 35s ago
              Main PID: 12670 (vsftpd)
              CGroup: /system.slice/vsftpd.service
              └─12670 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
              Aug 12 22:00:17 study.centos.initroot systemd[1]: Started Vsftpd ftp daemon.
              vsftpd2.service - Vsftpd second ftp daemon
              Loaded: loaded (/etc/systemd/system/vsftpd2.service; enabled)
              Active: active (running) since Wed 2015-08-12 22:00:17 CST; 35s ago
              Main PID: 12672 (vsftpd)
              CGroup: /system.slice/vsftpd2.service
              └─12672 /usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf
              [root@initroot system]# netstat -tlnp
              Active Internet connections (only servers)
              Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
              tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1340/sshd
              tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2387/master
              tcp6 0 0 :::555 :::* LISTEN 12672/vsftpd
              tcp6 0 0 :::21 :::* LISTEN 12670/vsftpd
              tcp6 0 0 :::22 :::* LISTEN 1340/sshd
              tcp6 0 0 ::1:25 :::* LISTEN 2387/master
            
很简单的将你的 systemd 所管理的 vsftpd 做了另一个服务!未来如果有相同的需求,同样的方法作一遍即可!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读