New post:"Tip: opening and closing ports needed by a systemd service"
This commit is contained in:
		
					parent
					
						
							
								68d5553181
							
						
					
				
			
			
				commit
				
					
						779cf42d25
					
				
			
		
					 1 changed files with 49 additions and 0 deletions
				
			
		|  | @ -0,0 +1,49 @@ | ||||||
|  | --- | ||||||
|  | categories: | ||||||
|  | - Linux | ||||||
|  | comments: true | ||||||
|  | date: 2015-10-18 16:54:25+0200 | ||||||
|  | layout: page | ||||||
|  | tags: | ||||||
|  | - Linux | ||||||
|  | - systemd | ||||||
|  | title: 'Tip: opening and closing ports needed by a systemd service' | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | Recently I've been testing out murmur, [http://wiki.mumble.info/wiki/Main_Page](Mumble's) server component. Murmur requires specific ports being open to operate, and when using it I would open them manually, and close them after the session had been completed. | ||||||
|  | 
 | ||||||
|  | I found it pretty tedious: I wanted to wrap it into a single call to the service, so I could enable my user (via ``sudoers``) to be able to start and stop the service without worrying about elevating permissions to start and stop the firewall. After reading a bit [systemd's documentation](http://www.freedesktop.org/software/systemd/man/systemd.service.html) I found about ``ExecStartPre`` and ``ExecStopPost`` that would work perfectly for the job. | ||||||
|  | 
 | ||||||
|  | It was easier said than done, though. That is because I, following the [guide on the Mumble wiki](http://wiki.mumble.info/wiki/Install_CentOS7), had set up a separate user to run the Murmur service, causing permission errors when adjusting the firewall: | ||||||
|  | 
 | ||||||
|  | ````syslog | ||||||
|  | firewall-cmd[20897]: Authorization failed. | ||||||
|  | firewall-cmd[20897]: Make sure polkit agent is running or run the application as superuser. | ||||||
|  | ```` | ||||||
|  | 
 | ||||||
|  | I didn't feel comfortable to give this user control the firewall. However, the systemd documentation mentioned a ``PermissionsStartOnly`` option for units, which is described as | ||||||
|  | 
 | ||||||
|  | > Takes a boolean argument. If true, the permission-related execution options, as configured with User= and similar options (see systemd.exec(5) for more information), are only applied to the process started with ExecStart=, and not to the various other ExecStartPre=, ExecStartPost=, ExecReload=, ExecStop=, and ExecStopPost= commands. If false, the setting is applied to all configured commands the same way. Defaults to false. | ||||||
|  | 
 | ||||||
|  | Exactly what I needed! And thus, I amended the unit file as follows: | ||||||
|  | 
 | ||||||
|  | ````systemd | ||||||
|  | 
 | ||||||
|  | [Unit] | ||||||
|  | Description=Mumble Server (Murmur) | ||||||
|  | Requires=network-online.target | ||||||
|  | After=network-online.target mariadb.service time-sync.target | ||||||
|  | 
 | ||||||
|  | [Service] | ||||||
|  | User=murmur | ||||||
|  | Type=forking | ||||||
|  | PIDFile=/run/murmur/murmur.pid | ||||||
|  | PermissionsStartOnly=true | ||||||
|  | ExecStartPre=/usr/bin/firewall-cmd --add-service=murmur | ||||||
|  | ExecStart=/usr/local/murmur/murmur.x86 -ini /etc/murmur.ini | ||||||
|  | ExecStopPost=/usr/bin/firewall-cmd --remove-service=murmur | ||||||
|  | 
 | ||||||
|  | [Install] | ||||||
|  | WantedBy=multi-user.target | ||||||
|  | ```` | ||||||
|  | A ``systemctl daemon-reload`` afterwards, I was set! Now the service opens and closes the port when it is started or stopped, respectively. | ||||||
		Reference in a new issue