Added implicit accounting when explicit addresses are specified

Only odd IP addresses can now explicitly be set, so that the next
even address can be used as the local one.
This commit is contained in:
Nikos Mavrogiannopoulos
2015-02-10 11:05:41 +01:00
parent 2e757cedb2
commit 952d6adc9c
9 changed files with 300 additions and 5 deletions

View File

@@ -144,7 +144,8 @@ int get_ipv4_lease(main_server_st* s, struct proc_st* proc)
if (proc->config.explicit_ipv4) {
/* if an explicit IP is given for that client, then
* don't do any IP accounting */
* do implicit IP accounting. Require the address
* to be odd, so we use the next even address as PtP. */
ret =
inet_pton(AF_INET, proc->config.explicit_ipv4, SA_IN_P(&network));
@@ -153,6 +154,11 @@ int get_ipv4_lease(main_server_st* s, struct proc_st* proc)
return -1;
}
if (((uint8_t*)SA_IN_P(&network))[3] % 2 == 0) {
mslog(s, NULL, LOG_ERR, "we only assign odd IP addresses: %s", proc->config.explicit_ipv4);
return ERR_NO_IP;
}
proc->ipv4 = talloc_zero(proc, struct ip_lease_st);
if (proc->ipv4 == NULL)
return ERR_MEM;
@@ -308,7 +314,8 @@ int get_ipv6_lease(main_server_st* s, struct proc_st* proc)
if (proc->config.explicit_ipv6) {
/* if an explicit IP is given for that client, then
* don't do any IP accounting */
* do implicit IP accounting. Require the address
* to be odd, so we use the next even address as PtP. */
ret =
inet_pton(AF_INET6, proc->config.explicit_ipv6, SA_IN6_P(&network));
@@ -317,6 +324,11 @@ int get_ipv6_lease(main_server_st* s, struct proc_st* proc)
return -1;
}
if (((uint8_t*)SA_IN6_P(&network))[15] % 2 == 0) {
mslog(s, NULL, LOG_ERR, "we only assign odd IP addresses: %s", proc->config.explicit_ipv6);
return ERR_NO_IP;
}
proc->ipv6 = talloc_zero(proc, struct ip_lease_st);
if (proc->ipv6 == NULL)
return ERR_MEM;

View File

@@ -456,6 +456,9 @@ no-route = 192.168.5.0/255.255.255.0
# by the commands route-add-cmd and route-del-cmd (see below). The no-udp
# is a boolean option (e.g., no-udp = true), and will prevent a UDP session
# for that specific user or group.
#
# Also explicit addresses, are only allowed when they are odd. In that
# case the next even address will be used as the remote address (in PtP).
#config-per-user = /etc/ocserv/config-per-user/
#config-per-group = /etc/ocserv/config-per-group/

View File

@@ -4,19 +4,21 @@ EXTRA_DIST = ca-key.pem ca.pem common.sh server-cert.pem server-key.pem test1.co
test-stress.config user-cert-wrong.pem connect-script test-group.passwd \
test-group-pass.config user-group-cert.pem user-group-key.pem test-user-group-cert.config \
test-user-group-cert-no-pass.config docker-common.sh test-cookie-timeout.config \
test-cookie-timeout-2.config
test-cookie-timeout-2.config user-config-explicit/test test-explicit-ip.config \
test-explicit-ip user-config-explicit/test2 user-config-explicit/test3 \
user-config-explicit/test4
SUBDIRS = docker-ocserv
dist_check_SCRIPTS = test-pass test-pass-cert test-cert test-iroute test-pass-script \
test-multi-cookie test-pam test-stress full-test test-group-pass test-pass-group-cert \
ocpasswd-test test-pass-group-cert-no-pass unix-test test-pass-opt-cert \
test-cookie-timeout test-cookie-timeout-2 radius-test
test-cookie-timeout test-cookie-timeout-2 radius-test test-explicit-ip
TESTS = test-pass test-pass-cert test-cert test-iroute test-pass-script \
test-multi-cookie full-test test-group-pass test-pass-group-cert \
ocpasswd-test test-pass-group-cert-no-pass unix-test test-pass-opt-cert \
test-cookie-timeout test-cookie-timeout-2
test-cookie-timeout test-cookie-timeout-2 test-explicit-ip
TESTS_ENVIRONMENT = srcdir="$(srcdir)" \
top_builddir="$(top_builddir)"

90
tests/test-explicit-ip Executable file
View File

@@ -0,0 +1,90 @@
#!/bin/sh
#
# Copyright (C) 2014 Red Hat
#
# This file is part of ocserv.
#
# ocserv is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at
# your option) any later version.
#
# ocserv is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GnuTLS; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
SERV="${SERV:-../src/ocserv}"
srcdir=${srcdir:-.}
TMPFILE=${srcdir}/outfile.$$
PORT=8446
. `dirname $0`/common.sh
connect()
{
opts=$1
pass=$2
COOKIE=''
eval `echo "$pass" | openconnect -q localhost:$PORT $opts --servercert=d66b507ae074d03b02eafca40d35f87dd81049d3 --authenticate`
if [ -z "$COOKIE" ];then
return 1
fi
rm -f $TMPFILE
echo "$pass" | openconnect -q localhost:$PORT $opts -C "$COOKIE" --servercert=d66b507ae074d03b02eafca40d35f87dd81049d3 --script=/bin/true --verbose --pid-file ${srcdir}/pidx >$TMPFILE 2>&1 &
CPID=$!
sleep 3
grep "Established DTLS" $TMPFILE >/dev/null 2>&1
if test $? != 0;then
rm -f $TMPFILE
return 1
fi
rm -f $TMPFILE
kill $CPID
return 0
}
echo "Testing local backend with username-password and explicit IP addresses... "
launch_server -d 1 -f -c test-explicit-ip.config & PID=$!
wait_server $PID
echo -n "Connecting with an illegal address assigned... "
connect "-u test2" "test2"
if test $? = 0;then
fail $PID "Connected using an illegal address!"
fi
echo ok
echo -n "Connecting with a proper address... "
connect "-u test" "test"
if test $? != 0;then
fail $PID "Failed to connect!"
fi
echo ok
echo -n "Connecting with an illegal IPv6 address assigned... "
connect "-u test4" "test4"
if test $? = 0;then
fail $PID "Connected using an illegal address!"
fi
echo ok
echo -n "Connecting with a proper IPv6 address... "
connect "-u test3" "test3"
if test $? != 0;then
fail $PID "Failed to connect!"
fi
echo ok
kill $PID
wait
exit 0

View File

@@ -0,0 +1,184 @@
# User authentication method. Could be set multiple times and in that case
# all should succeed.
# Options: certificate, pam.
#auth = "certificate[optional]"
auth = "plain[./test1.passwd]"
#auth = "pam"
# A banner to be displayed on clients
#banner = "Welcome"
# Use listen-host to limit to specific IPs or to the IPs of a provided hostname.
#listen-host = [IP|HOSTNAME]
use-dbus = no
# Limit the number of clients. Unset or set to zero for unlimited.
#max-clients = 1024
max-clients = 16
# Limit the number of client connections to one every X milliseconds
# (X is the provided value). Set to zero for no limit.
#rate-limit-ms = 100
# Limit the number of identical clients (i.e., users connecting multiple times)
# Unset or set to zero for unlimited.
max-same-clients = 2
# TCP and UDP port number
tcp-port = 8446
udp-port = 8446
# Keepalive in seconds
keepalive = 32400
# Dead peer detection in seconds
dpd = 440
# MTU discovery (DPD must be enabled)
try-mtu-discovery = false
# The key and the certificates of the server
# The key may be a file, or any URL supported by GnuTLS (e.g.,
# tpmkey:uuid=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx;storage=user
# or pkcs11:object=my-vpn-key;object-type=private)
#
# There may be multiple certificate and key pairs and each key
# should correspond to the preceding certificate.
server-cert = ./server-cert.pem
server-key = ./server-key.pem
# Diffie-Hellman parameters. Only needed if you require support
# for the DHE ciphersuites (by default this server supports ECDHE).
# Can be generated using:
# certtool --generate-dh-params --outfile /path/to/dh.pem
#dh-params = /path/to/dh.pem
# If you have a certificate from a CA that provides an OCSP
# service you may provide a fresh OCSP status response within
# the TLS handshake. That will prevent the client from connecting
# independently on the OCSP server.
# You can update this response periodically using:
# ocsptool --ask --load-cert=your_cert --load-issuer=your_ca --outfile response
# Make sure that you replace the following file in an atomic way.
#ocsp-response = /path/to/ocsp.der
# In case PKCS #11 or TPM keys are used the PINs should be available
# in files. The srk-pin-file is applicable to TPM keys only (It's the storage
# root key).
#pin-file = /path/to/pin.txt
#srk-pin-file = /path/to/srkpin.txt
# The Certificate Authority that will be used
# to verify clients if certificate authentication
# is set.
ca-cert = ./ca.pem
# The object identifier that will be used to read the user ID in the client certificate.
# The object identifier should be part of the certificate's DN
# Useful OIDs are:
# CN = 2.5.4.3, UID = 0.9.2342.19200300.100.1.1
cert-user-oid = 0.9.2342.19200300.100.1.1
# The object identifier that will be used to read the user group in the client
# certificate. The object identifier should be part of the certificate's DN
# Useful OIDs are:
# OU (organizational unit) = 2.5.4.11
#cert-group-oid = 2.5.4.11
# A revocation list of ca-cert is set
#crl = /path/to/crl.pem
# GnuTLS priority string
tls-priorities = "PERFORMANCE:%SERVER_PRECEDENCE:%COMPAT"
# To enforce perfect forward secrecy (PFS) on the main channel.
#tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA"
# The time (in seconds) that a client is allowed to stay connected prior
# to authentication
auth-timeout = 40
# The time (in seconds) that a client is not allowed to reconnect after
# a failed authentication attempt.
#min-reauth-time = 2
# Cookie validity time (in seconds)
# Once a client is authenticated he's provided a cookie with
# which he can reconnect. This option sets the maximum lifetime
# of that cookie.
cookie-validity = 172800
# Script to call when a client connects and obtains an IP
# Parameters are passed on the environment.
# REASON, USERNAME, GROUPNAME, HOSTNAME (the hostname selected by client),
# DEVICE, IP_REAL (the real IP of the client), IP_LOCAL (the local IP
# in the P-t-P connection), IP_REMOTE (the VPN IP of the client). REASON
# may be "connect" or "disconnect".
#connect-script = /usr/bin/myscript
#disconnect-script = /usr/bin/myscript
# UTMP
use-utmp = true
# PID file
pid-file = /var/run/ocserv.pid
# The default server directory. Does not require any devices present.
#chroot-dir = /path/to/chroot
# socket file used for IPC, will be appended with .PID
# It must be accessible within the chroot environment (if any)
socket-file = /var/run/ocserv-socket
# The user the worker processes will be run as. It should be
# unique (no other services run as this user).
run-as-user = nobody
run-as-group = daemon
# Network settings
device = vpns
# The default domain to be advertised
default-domain = example.com
ipv4-network = 192.168.1.0
ipv4-netmask = 255.255.255.0
ipv6-network = fda9:4efe:7e3b:03ea::/64
# Use the keywork local to advertize the local P-t-P address as DNS server
ipv4-dns = 192.168.1.1
# The NBNS server (if any)
#ipv4-nbns = 192.168.2.3
# Prior to leasing any IP from the pool ping it to verify that
# it is not in use by another (unrelated to this server) host.
ping-leases = false
# Leave empty to assign the default MTU of the device
# mtu =
route = 192.168.1.0/255.255.255.0
#route = 192.168.5.0/255.255.255.0
#
# The following options are for (experimental) AnyConnect client
# compatibility. They are only available if the server is built
# with --enable-anyconnect
#
# Client profile xml. A sample file exists in doc/profile.xml.
# This file must be accessible from inside the worker's chroot.
# The profile is ignored by the openconnect client.
#user-profile = profile.xml
# Unless set to false it is required for clients to present their
# certificate even if they are authenticating via a previously granted
# cookie. Legacy CISCO clients do not do that, and thus this option
# should be set for them.
cisco-client-compat = true
config-per-user = ./user-config-explicit/

View File

@@ -0,0 +1 @@
explicit-ipv4 = 192.168.1.201

View File

@@ -0,0 +1 @@
explicit-ipv4 = 192.168.1.200

View File

@@ -0,0 +1 @@
explicit-ipv6 = fda9:4efe:7e3b:03ea::01

View File

@@ -0,0 +1 @@
explicit-ipv6 = fda9:4efe:7e3b:03ea::02