故障转移网关的 SSH 连接问题

故障转移网关的 SSH 连接问题

我有一个可以通过 SSH 和 HTTP 访问的系统。该系统有两个接口(eth0、eth1),并且正在使用 Slackware 14.1。

eth0:192.168.1.99,LTE 以太网网关/调制解调器 eth1:172.16.101.250,本地网络(可访问互联网)

eth1 应用作传出流量的默认路由,并在无法通过 eth1 访问互联网时自动切换到 eth0。这部分使用 cron 和脚本来工作。

主要问题是切换默认网关时,SSH 和 HTTP 的传入流量仅适用于默认网关的接口。

/etc/rc.d/rc.inet1.conf

# Config information for eth0:
IPADDR[0]="192.168.1.99"
NETMASK[0]="255.255.255.0"
USE_DHCP[0]="no"
DHCP_HOSTNAME[0]="bridge"

# Config information for eth1:
IPADDR[1]="172.16.101.250"
NETMASK[1]="255.255.128.0"
USE_DHCP[1]="no"
DHCP_HOSTNAME[1]="bridge"

# Default gateway IP address:
GATEWAY="172.16.0.1"

每分钟执行一次脚本以验证两个网络上的互联网可用性

#!/bin/bash

DEF_GATEWAY="172.16.0.1"      # Default Gateway
BCK_GATEWAY="192.168.1.1"     # Backup Gateway
RMT_IP_1="8.8.8.8"            # first remote ip
RMT_IP_2="8.8.4.4"            # second remote ip
PING_TIMEOUT="1"              # Ping timeout in seconds

# Check user
if [ `whoami` != "root" ]
then
        echo "Failover script must be run as root!"
        exit 1
fi

# Check GW
CURRENT_GW=`ip route show | grep default | awk '{ print $3 }'`
if [ "$CURRENT_GW" == "$DEF_GATEWAY" ]
then
        ping -c 2 -W $PING_TIMEOUT $RMT_IP_1 > /dev/null
        PING=$?
else
        # Add static routes to remote ip's
        ip route add $RMT_IP_1 via $DEF_GATEWAY
        ip route add $RMT_IP_2 via $DEF_GATEWAY
        ping -c 2 -W $PING_TIMEOUT $RMT_IP_1 > /dev/null
        PING_1=$?
        ping -c 2 -W $PING_TIMEOUT $RMT_IP_2 > /dev/null
        PING_2=$?

        # Del static route to remote ip's
        ip route del $RMT_IP_1
        ip route del $RMT_IP_2
fi

if [ "$PING" == "1" ] && [ "$PING_2" == "1" ]
then
        if [ "$CURRENT_GW" == "$DEF_GATEWAY" ]
        then
                ip route replace default via $BCK_GATEWAY
        fi

elif [ "$CURRENT_GW" != "$DEF_GATEWAY" ]
then
        # Switching to default
        ip route replace default via $DEF_GATEWAY
fi

这是监听的服务

# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:http                  *:*                     LISTEN     
tcp        0      0 *:auth                  *:*                     LISTEN     
tcp        0      0 *:ssh                   *:*                     LISTEN     
tcp        0      0 *:https                 *:*                     LISTEN     
tcp        0      0 *:time                  *:*                     LISTEN     
tcp6       0      0 [::]:ssh                [::]:*

这是路由表

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.16.0.1      0.0.0.0         UG    1      0        0 eth1
loopback        *               255.0.0.0       U     0      0        0 lo
172.16.0.0      *               255.255.128.0   U     0      0        0 eth1
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0

答案1

当你说传入您的意思是来自已打开到本地主机上的 SSH(或 HTTP)服务的远程 Internet 客户端的连接吗?

如果是,外部 IP 地址是多少?我假设它们对于每个接口都是不同的。在这种情况下,您还可能会遇到 NAT 条目和 NAT 连接超时问题,具体取决于您的网关路由器。

您无法控制传入连接的外部公共路由,尤其是在它们打开后。如果给定接口失去连接,则到该接口的所有连接都将超时(除非有时在超时之前恢复连接和路由)。

如果您可以控制远程客户端用于连接到您的(例如)SSH 服务的 DNS,那么您也许可以对它们使用的 IP 有一些合理的控制新的连接,在某些范围内合理的故障转移之间的时间,例如至少 300 秒您公布新 IP,您就可以预期客户会开始使用它。

答案2

我不是 100% 确定,但是......你有两个 NIC,每个都有自己的网络。如果您的“默认网关”设置为192.168.1.1/24,则172.16.0.0/17不允许访问前者。这是必须启用/允许的功能。当你遍历网络时,你正在谈论路由。因此,要么设置以下设置,要么设置一个桥:

echo 1 > /proc/sys/net/ipv4/ip_forward

如果有效,请通过以下方式使其永久化:

/etc/sysctl.conf:
net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.conf
service network restart

相关内容