Nagios + openldap auth + apache 2.4

Esta vez, vamos a integrar la authenticación de usuarios de nuestro nagios con nuestro openLDAP.

Primero de todo, habilitamos los módulos ldap / authnz_ldap

a2enmod authnz_ldap
a2enmod ldap

Modificamos el fichero de sites del nagios:

#nano /etc/apache2/sites-available/nagios.conf

Y lo dejamos tal que:

# SAMPLE CONFIG SNIPPETS FOR APACHE WEB SERVER
#
# This file contains examples of entries that need
# to be incorporated into your Apache web server
# configuration file. Customize the paths, etc. as
# needed to fit your system.

ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"


# SSLRequireSSL
Options ExecCGI
AllowOverride None
"<"IfVersion >= 2.3>

AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL "ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)"
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user


"<"IfVersion < 2.3>
Order allow,deny
Allow from all
AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user


Alias /nagios "/usr/local/nagios/share"


# SSLRequireSSL
Options None
AllowOverride None
"<"IfVersion >= 2.3>

AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user



"<"IfVersion < 2.3>
Order allow,deny
Allow from all
AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user



Ahora modificamos el nagios para que acepte los usuarios:

/
#nano /usr/local/nagios/etc/cgi.cfg

Y dejamos las siguientes líneas así:


authorized_for_system_information=*
authorized_for_configuration_information=*
authorized_for_system_commands=*
authorized_for_all_services=*
authorized_for_all_hosts=*
authorized_for_all_service_commands=*
authorized_for_all_host_commands=*

Reiniciamos apache + nagios y a probar !!!!!!!!

Error “Disallowed key characters in global data.” pnp4nagios

Esta vez, instalando el pnp4nagios en un debian 8, me encontré este error a la hora de visualizar las graficas del nagios:

“Disallowed key characters in global data.”

tras googlear un rato y mirar las coockies / buscar la función, encontré el error en el fichero:

/usr/local/pnp4nagios/lib/kohana/system/libraries/Input.php


public function clean_input_keys($str)
{
$chars = PCRE_UNICODE_PROPERTIES ? '\pL' : 'a-zA-Z';
if ( ! preg_match('#^['.$chars.'0-9:_.\-/@]++$#uD', $str))
{
exit('Disallowed key characters in global data.');
}

return $str;
}

Hemos de dejar la línea donde se mirar los carácteres especiales, tal cual.

Custom APP pickup asterisk 11

Aquí tenemos otra entrada, que ha sido un marrón con todas las de la ley.

Asterisk es un producto que me encanta, pero a medida que crece en volumen, su comportamiento es “errático”…. es decir, a medida que crece en extensiones / usuarios o intentas hacer algo “multitenant”, te vas llevando sorpresa tras sorpresa, pero durante el camino a migrar a otra solución, tienes que ir parcheando y salir del paso como puedas.

También he de decir que, me desagrada muchísimo los paneles tipo freepbx / elastix y derivados, ya que limitan muchísimo sus funcionalidades.

Estos días, me pasó que tenía que habilitar en una empresa, más de 64 grupos de pickup a “ciegas” y corregir que el default del “features” se comporta de manera errática; intentas capturar una extensión de tu grupo y, en función de las alineaciones estelares, posición de la luna o si pasa algún cometa cerca, acabas capturando algo que no toca y, “capturas” también el cabreo del cliente.

En esta pbx, tengo dividida las extensiones de la siguiente manera:

Compras:
200
201
202
203
204
205
..
220

Facturación:
230
231
232
233
234
235
236
..
250

Contabilidad:
260
261
262
263

Formación:
270
271
272
273

y así un número ‘N’ de departamentos.

me hice una BBDD con ello, tipo

tabla: extensionesempresa
id | extension | departamento
-----------------------------
1 200 compras
2 201 compras
3 202 compras
4 203 compras
5 204 compras
..
40 320 administracion
41 321 administracion
..
..
N

Luego en el func_odbc, la consulta

[uverdepartamento]
dsn=asterisk
readsql=select departamento from extensionesempresa where extension='${ARG1}'

[ucontarextensiones]
dsn=asterisk
readsql=select count(extension),extension from extensionesempresa where departamento='${ARG1}'


Y ahora el código de app_pickup custom

[app_pickup]
exten => _*8,1,NoOP(.... custom pickup ..........)
exten => _*8,n,Set(empresa=${ODBC_uverdepartamento(${CALLERID(num)})})
exten => _*8,n,NoOP(... la empresa es ${empresa} ...........)
exten => _*8,n,Set(HASH(uno)=${ODBC_ucontarextensiones(${empresa})})
exten => _*8,n,NoOP( ${HASH(uno)} )
exten => _*8,n,Set(variable=${HASH(uno)})
exten => _*8,n,Set(exteninicial=${CUT(variable,\,,1)})
exten => _*8,n,Set(numextensions=${CUT(variable,\,,2)})
exten => _*8,n,NoOP(.... ${exteninicial} ${numextensiones} ...... )
exten => _*8,n,NoOP(.... bucle while ..............................)
exten => _*8,n,Set(contador=1)
exten => _*8,n,Set(extenIni=${exteninicial})
exten => _*8,n,While($[${contador} < ${numextensions}]) exten => _*8,n,NoOP(extenIni: ${extenIni} contador: ${contador} ...)
exten => _*8,n,GotoIf($["${DEVICE_STATE(SIP/${extenIni})}"="RINGING"]?pickup)
exten => _*8,n,Set(extenIni=$[${extenIni} + 1])
exten => _*8,n,Set(contador=$[${contador} + 1])
exten => _*8,n,EndWhile
exten => _*8,n(pickup),NoOP(.... hacemos el pickup a ${extenIni}........)
exten => _*8,n(pickup),Set(PICKUPMARK=${extenIni})
exten => _*8,n(pickup),Set(GLOBAL(PICKUPMARK)=${extenIni})
exten => _*8,n(pickup),PickupChan(SIP/${extenIni})
exten => _*8,n,Hangup

En la primera parte, sacamos el departamento:

exten => _*8,1,NoOP(.... custom pickup ..........)
exten => _*8,n,Set(empresa=${ODBC_uverdepartamento(${CALLERID(num)})})
exten => _*8,n,NoOP(... la empresa es ${empresa} ...........)

Luego sacamos la extensión inicial y contamos las extensiones que tiene el departamento:

exten => _*8,n,Set(HASH(uno)=${ODBC_ucontarextensiones(${empresa})})
exten => _*8,n,NoOP( ${HASH(uno)} )
exten => _*8,n,Set(variable=${HASH(uno)})
exten => _*8,n,Set(exteninicial=${CUT(variable,\,,1)})
exten => _*8,n,Set(numextensions=${CUT(variable,\,,2)})

Con el While hacemos el bucle y miramos si la extensión está en “RINGINNG” mediante la función “devstate”… si es así, usamos la función PickupChan.

Y ya la tenemos funcionando 😉

Automatizar añadir varias máquinas debian al ldap

Esta vez, tenía que automatizar la entrada anterior y añadir varias máquinas al ldap para login.

Como no me hacía especial ilusión modificar todos los ficheros a mano, tenemos al amigo bash + sed.

al lío:


#!/bin/bash

# ########################
# ### by craem ###########
# ########################
# ########################

function instala_paquetes(){
echo "------------------------------------------------------------"
echo "aptitude -y install libnss-ldap libpam-ldap ldap-utils sudo "
aptitude -y install libnss-ldap libpam-ldap ldap-utils sudo
}

function modifica_ficheros(){
echo "--- modificamos fichero nsswitch.conf -----------------------"
sed -ie 's/compat/ldap compat/g' /etc/nsswitch.conf
echo "--- modificamos el fichero common-session -------------------"
echo "session required pam_mkhomedir.so skel=/etc/skel umask=0022" >> /etc/pam.d/common-session
echo "--- reiniciamos el servicio nscd ----------------------------"
/etc/init.d/nscd restart
echo "--- modificamos el sudoers ----------------------------------"
echo "%admin_users ALL=(ALL) ALL" >> /etc/sudoers
echo "--- modificamos el fichero common-auth ----------------------"
echo "auth required pam_access.so" >> /etc/pam.d/common-auth
echo "--- modificamos el access.conf ------------------------------"
echo "-:ALL EXCEPT root (admin_users):ALL EXCEPT LOCAL" >> /etc/security/access.conf
echo "--- modificamos el fichero ldap.conf ------------------------"
sed -ie 's/#BASE dc=example,dc=com/BASE dc=craem,dc=net/g' /etc/ldap/ldap.conf
echo "--- modificamos el ldap.conf --------------------------------"
echo "URI ldap://ldap.craem.net" >> /etc/ldap/ldap.conf
echo "--- fin del script ------------------------------------------"

}
instala_paquetes
modifica_ficheros

Debian client login ldap server

otra entrada que es un apunte.

En esta ocasión, vamos a hacer en nuestros servers, que el login vaya centralizado contra nuestro ldap.

Primero de todo, instalamos las dependencias:


root@pbxshared:/etc/asterisk# apt-get install libpam-ldap nscd


aptitude -y install libnss-ldap libpam-ldap ldap-utils

instalamos y nos pide la url del ldap:


LDAP server URI
ldap://mi.serverldap.com


Distinguished name of the search base:
dc=exemple,dc=local


LDAP version to use:
3


Configuring libpam-ldap
his option will allow password utilities that use PAM to change local passwords.
The LDAP admin account password will be stored in a separate file which will be made readable to root only.
If /etc is mounted by NFS, this option should be disabled.
Allow LDAP admin account to behave like local root?

YES


Database requires login
YES


Configuring libpam-ldap
cn=manager,dc=example,dc=net


Configuring libpam-ldap
mipassword

Ahora editamos el fichero /etc/nsswitch.conf y dejamos tal cual:

passwd: ldap compat
group: ldap compat
shadow: ldap compat

gshadow: files

hosts: files dns
networks: files

protocols: db files
services: db files
ethers: db files
rpc: db files

netgroup: nis

Editamos el fichero /etc/pam.d/common-session y añadimos al final:

session required pam_mkhomedir.so skel=/etc/skel umask=0022

reiniciamos el servicio nscd

/etc/init.d/nscd restart

Instalamos sudo si no está..

apt-get install sudo

Y modificamos el visudo


#visudo

añadimos el grupo que podrá hacer sudo su

# User privilege specification
root ALL=(ALL:ALL) ALL
%admin_users ALL=(ALL) ALL

Admin_users es el grupo LDAP donde se encuentren nuestros usuarios.

ahora vamos a reestringir a un grupo de ldap el login al server. Editamos el fichero /etc/pam.d/common-auth y añadimos:

auth required pam_access.so

Editamos el fichero /etc/security/access.conf y añadimos el grupo al cual permitiremos acceso, añadiendo al final:

-:ALL EXCEPT root (admin_users):ALL EXCEPT LOCAL

Kamailio 4.x Debian Jessie

Estos días estoy liado con el tema del sipproxy Kamailio….. un gran software y potente donde los haya.

Empezamos con que disponemos de un debian jessie limpito; instalamos las dependencias:


apt-get install git-core gcc flex bison libmysqlclient-dev make libssl-dev libcurl4-openssl-dev libxml2-dev libpcre3-dev mysql-server

Y ahora descargamos el source de kamailio:


root@sipproxy:/usr/src# wget -c http://www.kamailio.org/pub/kamailio/4.2.2/src/kamailio-4.4.4_src.tar.gz
root@sipproxy:/usr/src# tar -zxvf kamailio-4.4.4_src.tar.gz

Preparamos para compilar:

#make cfg

Editamos el fichero /usr/src/kamailio-4.4.4/modules.lst y modificamos:

.
.
# the list of extra modules to compile
include_modules=db_mysql
.
.

Guardamos y vamos a compilar:

#make install

Una vez compilado, tendremos los ficheros en /usr/local/etc/kamailio.

Creamos un usuario para el mysql / kamailio:

mysql> grant all privileges on kamailio.* to 'kamailio'@'%' identified by 'kamailio' with grant option;

Modificamos el kamctrlc para que use mysql (en mi caso) y lo dejamos tal que:


DBENGINE=MYSQL

## database host
DBHOST=localhost

## database name (for ORACLE this is TNS name)
DBNAME=kamailio

# database path used by dbtext, db_berkeley or sqlite
# DB_PATH="/usr/local/etc/kamailio/dbtext"

## database read/write user
DBRWUSER="kamailio"

## password for database read/write user
DBRWPW="kamailio"

## database read only user
DBROUSER="kamailio"

## password for database read only user
DBROPW="kamailio"

ahora creamos las bbdd:

root@monaca:/usr/local/etc/kamailio# /usr/local/sbin/kamdbctl create
MySQL password for root:
INFO: test server charset
INFO: creating database kamailio ...
INFO: granting privileges to database kamailio ...
INFO: creating standard tables into kamailio ...
INFO: Core Kamailio tables succesfully created.
Install presence related tables? (y/n): y
INFO: creating presence tables into kamailio ...
INFO: Presence tables succesfully created.
Install tables for imc cpl siptrace domainpolicy carrierroute
userblacklist htable purple uac pipelimit mtree sca mohqueue
rtpproxy? (y/n): y
INFO: creating extra tables into kamailio ...
INFO: Extra tables succesfully created.
Install tables for uid_auth_db uid_avp_db uid_domain uid_gflags
uid_uri_db? (y/n): y
INFO: creating uid tables into kamailio ...
INFO: UID tables succesfully created.
root@monaca:/usr/local/etc/kamailio#

preparamos el kamailio para que arranque y crearemos el init.d

root@monaca:/usr/src/kamailio-4.4.4/pkg/kamailio/deb/precise# cp kamailio.init /etc/init.d/kamailio


root@monaca:/usr/src/kamailio-4.4.4/pkg/kamailio/deb/precise# cp kamailio.default /etc/default/kamailio

Editamos el fichero /etc/default/kamailio

#
# Kamailio startup options
#

# Set to yes to enable kamailio, once configured properly.
RUN_KAMAILIO=yes

# User to run as
USER=kamailio

# Group to run as
GROUP=kamailio

# Amount of shared and private memory to allocate
# for the running Kamailio server (in Mb)
#SHM_MEMORY=64
#PKG_MEMORY=8

# Config file
CFGFILE=/usr/local/etc/kamailio/kamailio.cfg

# Enable the server to leave a core file when it crashes.
# Set this to 'yes' to enable Kamailio to leave a core file when it crashes
# or 'no' to disable this feature. This option is case sensitive and only
# accepts 'yes' and 'no' and only in lowercase letters.
# On some systems it is necessary to specify a directory for the core files
# to get a dump. Look into the kamailio init file for an example configuration.
#DUMP_CORE=yes

Creamos el fichero pid, usuarios:

adduser --quiet --system --group --disabled-password --shell /bin/false --gecos "kamailio" --home /var/run/kamailio kamailio

Copiamos el init.d

cp /usr/src/kamailio-4.4.4/pkg/kamailio/deb/precise/kamailio.init /etc/init.d/kamailio
mkdir -p /var/run/kamailio
chmod 755 /etc/init.d/kamailio
chown kamailio:kamailio /var/run/kamailio

y ahora para que arranque con el systcl, añadimos el siguiente fichero /etc/systemd/system/kamailio.service


[Unit]
Description=Kamailio SIP Server

[Service]
Type=forking
PIDFile=/var/run/kamailio.pid
ExecStart=/usr/local/sbin/kamctl start
ExecRestart=/usr/local/sbin/kamctl restart
ExecStop=/usr/local/sbin/kamctl stop

[Install]
WantedBy=multi-user.target

Enjoy your kamailio server 😉

Servidor syslog centralizado debian jessie

Desde hace tiempo, me gusta centralizar los logs en una sola máquina…. por ejemplo, donde tengo el nagios.

la máquina base es una debian jessie pelada y instalamos el syslog-ng:

apt-get install syslog-ng

Y ahora modificamos el fichero /etc/syslog-ng/syslog-ng.conf

options { chain_hostnames(yes); flush_lines(0); use_dns(no); use_fqdn(no);
owner("root"); group("adm"); perm(0640); stats_freq(0);
create_dirs(yes); bad_hostname("^gconfd$");
};

########################
# Sources
########################
# This is the default behavior of sysklogd package
# Logs may come from unix stream, but not from another machine.
#
source s_src {
system();
internal();
};

# If you wish to get logs from remote machine you should uncomment
# this and comment the above source line.
#
#source s_net { tcp(ip(127.0.0.1) port(1000)); };

source syslog_udp {
udp(port(514));
};

.
.
.
.
.
# Debian only
destination d_ppp { file("/var/log/ppp.log"); };

# Destí logs Mikrotiks
destination clientslogs {
file("/var/log/logscraem/$YEAR$MONTH$DAY/$HOST.auth");
};

.
.
.
.
log {
source(syslog_udp);
destination(clientslogs);
};

Nos crearemos un directorio por día y un fichero por dispositivo.

Reiniciamos el syslog-ng y listo.

Upgrade zarafa 7.2.x a 7.2.4.29

Otra entrada que es un apunte.

Hace dos años aprox, actualicé mi server de correo zarafa a a 7.2 Beta, por unos problemas con la 7.2.1 y allí se quedó.

Hace unos meses, decidí volver a actualizar el server… prefiero actualizar el zarafa, ya que instalar de nuevo y migrar el sql / certificado, es muy pesado.

Primero de todo, descargamos la última versión disponible:

cd /usr/src

wget -c https://download.zarafa.com/community/final/7.2/7.2.4.29/zcp-7.2.4.29-debian-7.0-x86_64-opensource.tar.gz

Y extraemos los archivos:

# tar -zxvf zcp-7.2.4.29-debian-7.0-x86_64-opensource.tar.gz
# cd zcp-7.2.4.29-debian-7.0-x86_64-opensource

Ahora empieza el follón……

Primero de todo, nos hacemos una copia de todos los ficheros situados en:

/etc/zarafa
/usr/share/zarafa-webaccess/

Y ahora vamos a actualizar de la siguiente manera:

dpkg --auto-deconfigure -i *.deb

Dará bastantes errores, pero seguimos adelante cuando acabe el dpkg y corregimos los errores de dependencias:

#apt-get -f install
#dpkg --auto-deconfigure -i *.deb

Ahora reestablecemos los ficheros de la copia de seguridad en /usr/share/zarafa-webaccess y modificamos el seguiente fichero:

root@zeus:/etc/zarafa# nano dagent.cfg

Y cambiamos las siguientes líneas:

server_socket = file:///var/run/zarafa

Y ahora en server.cfg

root@zeus:/etc/zarafa# nano server.cfg

Y cambiamos la línea:

local_admin_users = root vmail zarafa

Reiniciamos los servicios de zarafa/apache y listo.

NAT 1:1 Mikrotik + firewall

Otra entrada que es un apunte.

Estos días he tenido que aplicar nat 1:1 con los routers mikrotik y proteger máquinas con el firewall del router…. a priori es sencillo, pero el tema del firewall se me atascó un poco.

Imaginamos que tenemos una conexión a internet con un NAT GLOBAL, un /29 para repartir entre nuestros servicios. Para hacerlo más sencillo, aplicaremos el nat 1:1

Nuestro proveedor nos entrega la subred 1.1.1.0/29 y como gateway, hemos de usar la 1.1.1.1…. asignaremos a nuestro server de correo la 1.1.1.2 y deberá tener permitido ICMP, WWW y HTTPS

Empezamos:

/ip address
add address=1.1.1.1/29 comment=wan interface=outside network=1.1.1.0
add address=192.168.1.254/24 interface=inside network=192.168.41.0
add address=1.1.1.2/29 comment="nat to 192.168.1.2" interface=outside network=1.1.1.0

El interfaz externo, lo llamaremos outside, el interno inside y el rango local de la lan: 192.168.1.0/24

Asignaremos la ip pública en el outside y la ip del mailserver también.

Ahora añadimos las reglas del firewall para permitir el tráfico deseado:

/ip firewall filter
add chain=forward comment="ip 2" connection-mark=ip_2 protocol=icmp
add chain=forward comment="ip 2" connection-mark=ip_2 port=25 protocol=tcp
add chain=forward comment="ip 2" connection-mark=ip_2 port=80 protocol=tcp
add chain=forward comment="ip 2" connection-mark=ip_2 port=443 protocol=tcp
add chain=forward comment="ip 2" connection-mark=ip_2 port=53 protocol=udp
add action=drop chain=forward comment="ip 2" connection-mark=ip_2

La última línea es importante… si no la incluyes y tu server es un windows, te lo dejarán como un colador xDDDD.

Seguimos con las reglas mangle para identificar las ip’s:

/ip firewall mangle
add action=mark-connection chain=prerouting comment="ip 2" dst-address=1.1.1.2 log-prefix=ip_2 new-connection-mark=ip_2 \
passthrough=no
add action=mark-connection chain=prerouting comment="ip 2" new-connection-mark=publicas passthrough=no src-address=\
192.168.1.2

Y ahora el NAT en cuestión:

/ip firewall nat
add action=dst-nat chain=dstnat comment="nat to 1.1.1.2" dst-address=1.1.1.2 in-interface=outside to-addresses=\
192.168.1.2
add action=src-nat chain=srcnat comment="nat to 1.1.1.2" out-interface=outside src-address=192.168.1.2 to-addresses=\
1.1.1.2

Y con ésto, ya tenemos todo hecho ;).

el proceso es:

– Asignamos la IP al interfaz público.
– Añadimos las reglas de firewall, marcando los paquetes.
– Aplicamos el nat.

Cisco ASA 8.2 to 9.x :: migrando :: parte 4

Seguimos migrando….

Ahora toca añadir ssh para acceder a la config desde el exterior… los pasos:


asa(config)#username pix password password privilege 15
asa(config)#aaa authentication ssh console LOCAL
asa(config)#crypto key generate rsa
WARNING: You have a RSA keypair already defined named .

Do you really want to replace them? [yes/no]: yes
Keypair generation process begin. Please wait...
asa(config)#ssh 1.1.1.0 255.255.255.0 outside

Y ahora ordenamos los nats….. en las configs anteriores no estaba del todo claro:

suponemos que tenemos los servers siguientes:

server11, server12 y server13 y hemos de abrir varios puertos con cada uno de ellos:


object network srv-192.168.0.13_3389
host 192.168.0.13
description server13_3389
object network srv-192.168.0.12_21
host 192.168.0.12
description server12_21
object network srv-192.168.0.12_20
host 192.168.0.12
description server12_20
object network srv-192.168.0.12_20_udp
host 192.168.0.12
description server12_20
object network srv-192.168.0.11_80
host 192.168.0.11
description server11_80
object network srv-192.168.0.11_443
host 192.168.0.11
description server11_443
object network srv-192.168.0.11_110
host 192.168.0.11
description server11_110
object network srv-192.168.0.11_143
host 192.168.0.11
description server11_143
object network srv-192.168.0.11_587
host 192.168.0.11
description server11_587

access-list outside_in extended permit tcp any object server13 eq 444
access-list outside_in extended permit tcp any object server13 eq 3389
access-list outside_in extended permit tcp any object server12 eq ftp
access-list outside_in extended permit tcp any object server12 eq ftp-data
access-list outside_in extended permit udp any object server12 eq 20
access-list outside_in extended permit tcp any object server11 eq www
access-list outside_in extended permit tcp any object server11 eq https
access-list outside_in extended permit tcp any object server11 eq pop3
access-list outside_in extended permit tcp any object server11 eq imap4
access-list outside_in extended permit tcp any object server11 eq 587

object network srv-192.168.0.13_444
nat (inside,outside) static interface service tcp 444 444
object network srv-192.168.0.13_3389
nat (inside,outside) static interface service tcp 3389 3389
object network srv-192.168.0.12_21
nat (inside,outside) static interface service tcp ftp ftp
object network srv-192.168.0.12_20
nat (inside,outside) static interface service tcp ftp-data ftp-data
object network srv-192.168.0.12_20_udp
nat (inside,outside) static interface service tcp ftp-data ftp-data
object network srv-192.168.0.11_80
nat (inside,outside) static interface service tcp www www
object network srv-192.168.0.11_443
nat (inside,outside) static interface service tcp https https
object network srv-192.168.0.11_110
nat (inside,outside) static interface service tcp pop3 pop3
object network srv-192.168.0.11_143
nat (inside,outside) static interface service tcp imap4 imap4
access-group outside_in in interface outside

Es bastante más engorroso, pero supongo que tendrá una explicación 😉