added test for client-side proxyprotocol

This commit is contained in:
Yves Rűtschlé committed 2025-08-29 20:39:42 +02:00
1 parent 12f748fe8e
commit 2106bd6527
2 files changed
+83 -10

No files matched your search

+38 -10
View File
@@ -124,16 +124,18 @@ sub stop_echosrv
}
# Runs sslh
my ($sslh_pid);
# Runs sslh, restart it if configuration has changed
my ($sslh_pid, $sslh_conf);
sub start_sslh
{
my ($exe, $conf) = @_;
stop_sslh() if (defined $sslh_conf and ($conf ne $sslh_conf));
return if defined $sslh_pid;
$sslh_conf = $conf;
my ($valgrind);
if (!($sslh_pid = fork)) {
my $user = (getpwuid $<)[0]; # Run under current username
my $cmd = "../$exe -u $user -F $conf";
my $cmd = "../$exe -F $conf";
print "****CMDLINE [$cmd]\n";
#$valgrind = 1;
#$cmd = "valgrind --leak-check=full $cmd";
@@ -150,6 +152,7 @@ sub stop_sslh
{
if (defined $sslh_pid) {
kill TERM => $sslh_pid or warn "kill process: $!\n";
`killall sslh-ev sslh-select sslh-fork`;
undef $sslh_pid;
}
}
@@ -188,8 +191,9 @@ sub run_ending_test
# Runs one test for one probe. Start echosrv's if required.
# Extract sslh's listening port from the config file, run
# sslh, connect, write the test pattern, read the result,
# Connect to port specified in the test, otherwise to the
# first port in the sslh configuration.
# run sslh, connect, write the test pattern, read the result,
# check it connected to the right echosrv, check the data
# was transfered ok.
sub run_test_probe
@@ -202,7 +206,7 @@ sub run_test_probe
my $expected = $test->{expected};
my $sslh_port = $conf->value("listen")->[0]->{port};
my $sslh_port = $test->{port} // $conf->value("listen")->[0]->{port};
print "test_probe [$expected] $sslh_port\n";
my $cnx = new IO::Socket::INET(PeerHost => "localhost:$sslh_port");
warn "t: $!\n" unless $cnx;
@@ -218,10 +222,10 @@ sub run_test_probe
print "Received $n bytes: protocol $prefix data [$data]\n";
close $cnx;
my_is($prefix, $expected, "$exe:$expected: probe");
my $data_expected = $test->{data_expected};
my_is($prefix, $expected, "$exe:$test->{desc}:probe");
my $data_expected = $test->{data_expected} // "^$test->{data}\$";
$data_expected =~ s/INPUT_DATA/$test->{data}/;
my_like($data, qr/$data_expected/s, "$exe:$expected: shoveled");
my_like($data, qr/$data_expected/s, "$exe:$test->{desc}:shoveled");
}
@@ -262,10 +266,12 @@ sub test_wrong_user
#
# * `expected`: protocol prompt added by the echosrv (should be the protocol name)
#
# * `data`: what is sent to sslh, as a client
#
# * `data_expected` is a regex for the expected return (which can be
# different when using Proxyprotocol). INPUT_DATA gets
# replaced with $_->{data}, i.e. data sent originally,
# before matching.
# before matching. Use `data` if not specified.
#
my @tests = (
@@ -319,6 +325,28 @@ my @tests = (
expected => "socks5",
},
# test_pp2.cfg has proxyprotocol on port 8080
{
desc => "Client-side ProxyProtocol active",
run => \&run_test_probe,
cfg => "test_pp2.cfg",
data => "PROXY TCP4 127.0.0.1 127.0.0.1 8080 8081\x0D\x0ASSH-2.0 hello",
expected => "ssh",
data_expected => "^PROXY TCP4 127.0.0.1 127.0.0.1 \\d+ \\d+\x0D\x0AINPUT_DATA",
},
# test_pp2.cfg has no proxyprotocol on port 8081, so ssh
# should pass untouched
{
desc => "Client-side ProxyProtocol not active",
run => \&run_test_probe,
cfg => "test_pp2.cfg",
port => 8081,
data => "SSH-2.0 hello",
expected => "ssh",
},
);
+45
View File
@@ -0,0 +1,45 @@
# Testing for client-side ProxyProtocol
foreground: true;
inetd: false;
numeric: true;
transparent: false;
timeout: 10; # Probe test writes slowly
pidfile: "/tmp/sslh_test.pid";
syslog_facility: "auth";
# Logging configuration
# Value: 1: stdout; 2: syslog; 3: both
# Defaults should be sensible. Generally, you want *-error
# to be always enabled, to know if something is going wrong.
verbose-config: 1; # print configuration at startup
verbose-config-error: 1; # print configuration errors
verbose-connections: 1; # trace established incoming address to forward address
verbose-connections-error: 1; # connection errors
verbose-connections-try: 1; # connection attempts towards targets
verbose-fd: 0; # file descriptor activity, open/close/whatnot
verbose-packets: 1; # hexdump packets on which probing is done
verbose-probe-info: 1; # what's happening during the probe process
verbose-probe-error: 1; # failures and problems during probing
verbose-system-error: 1; # system call problem, i.e. malloc, fork, failing
verbose-int-error: 1; # internal errors, the kind that should never happen
# List of interfaces on which we should listen
# Options:
listen:
(
{ host: "localhost"; port: "8080"; keepalive: true; proxyprotocol: true; },
{ host: "localhost"; port: "8081"; keepalive: true; proxyprotocol: false; }
);
protocols:
(
{ name: "ssh"; host: "localhost"; port: "9000"; },
{ name: "socks5"; host: "localhost"; port: "9001"; },
{ name: "anyprot"; host: "localhost"; port: "9099"; }
);
on_timeout: "ssh";