I have used the ssh2_connect() function to establish a connection to a remote SSH server. But it works on one webserver and fails on another (let’s call it as webserver1 and webserver 2 hereafter). I get this error – unable to establish connection error on webserver2. Both the webservers 1 & 2 are identical setups running Apache and what’s is strange is that the issue occured only after the reboot of the webserver2. The complete apache error_log of webserver2 is as follows:
[Wed Dec 15 10:30:35 2021] [error] [client 192.168.xxx.xx] PHP Warning: ssh2_connect(): Unable to connect to 192.168.xx.xxx on port 22 in /var/www/html/process.php on line 9 [Wed Dec 15 10:30:35 2021] [error] [client 192.168.xxx.xx] PHP Warning: ssh2_connect(): Unable to connect to 192.168.xx.xxx in /var/www/html/process.php on line 9
Below is the PHP-script:
if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
if(!($con = ssh2_connect(REMOTE_IP, 22))){
echo "fail: unable to establish connection\n";
} else {
// try to authenticate with username root, password secretpassword
if(!ssh2_auth_password($con, $username, $password)) {
echo "fail: unable to authenticate\n";
header('Location: ../../login/?error=1');
exit();
} else {
echo "Logged in..\n";
}
}How to solve ssh_connect() : unable to establish connection
Step 1: Check for the firewall on the remote server. A firewall rule might be blocking the connections from webserver2.
Step 2: Lets test the SSH from terminal of webserver2 as below:
# ssh <username>@<REMOTE_IP> -p 22
Step 3: If the above SSH command works, then check if SELinux is enabled. If enabled, make sure to bypass SELinux for web directories as it might be blocking.
Step 4: By default, SELinux prevents Apache web server from establishing network connections.
Run the below command to allow HTTPD scripts and modules to connect to the network using any TCP port.
# /usr/sbin/setsebool -P httpd_can_network_connect 1
That’s it!

