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.vbird 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次阅读