linux systemd管理网络服务
网络服务与端口对应简介
回到顶部一般主机上会同时运行着多个网络服务进程, 但是主机只有一个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文件中的端口设置, 除非你要架设一个地下网站。
关闭网络服务
回到顶部/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 Socketavahi-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 运作的实例
回到顶部预设的 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次阅读