Ubuntu 从以太网到 ADSL 调制解调器故障转移到 USB 3G 加密狗

Ubuntu 从以太网到 ADSL 调制解调器故障转移到 USB 3G 加密狗

我有一台连接到互联网的 Ubuntu 服务器,通过以太网连接到住宅 ADSL 线路。大多数情况下,这已经足够了,但我不能指望 ADSL 链路像我希望的那样可靠。墨菲定律已经规定,停机时间总是在最不方便的时候发生。

我想使用“随用随付”3G USB 加密狗来提供故障转移。我既缺少适用于其他人的示例配置信息,也缺少最适合我用途的(廉价)硬件信息。目标是,当我的 ADSL 线路断开时,服务器会检测到这种情况并拨打 3G 服务 - 监控 ADSL 线路并在连接恢复时无缝切换回来。

我关心的主要服务是 OpenVPN 隧道 - 通过 UDP 连接到远程服务器。另一个有用的服务是 Squid - 这样当 ADSL 断开连接时,我仍然可以通过 LAN 访问网络。

问题:

  1. 设置起来有多困难?
  2. 我是否会被迫“自己动手”——或者是否有我忽略的软件包/操作方法?
  3. 推荐使用哪种(廉价)硬件(主要关注无人值守的可靠性)?
  4. 有没有已经解决此问题的其他人的成功或失败的故事?

答案1

我曾多次为客户这样做,但我还没有找到一个成熟的系统来实现这一点,因此我只能自己动手,Manwe 提供的步骤或多或少就是我在需要时所做的,但我会在这里粘贴我正在使用的任何粗略的 bash 脚本(当我有时间时,我想在 python 中使其变得更好)。

基本上我会检查我是否有互联网,以及我是否正在使用 WAN 备份,并进行必要的更改

#!/bin/bash
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
primary_gw="192.168.1.1" #for example.
check_one="8.8.8.8"
check_two="8.8.4.4"

#first we check internet connection.
if `ping -c 1 -W 1 $check_one |grep -E '(unreachable|100\%\ packet\ loss)' &> /dev/null` &&\
   `ping -c 1 -W 1 $check_two |grep -E '(unreachable|100\%\ packet\ loss)' &>/dev/null`
  then #if we don't have internet
    if [ -e /tmp/wan_backup ]
      #if we are using backup right now we try to change to primary connection
      then ./script_change_to_primary.sh && rm /tmp/wan_backup
      #else we change to wan backup.
      else ./script_change_to_backup.sh && touch /tmp/wan_backup
    fi
fi

#if we are using wan backup right now we check if primary connection works.
if [ -e /tmp/wan_backup ]
  then
    if `ip route add $check_one via $primary_gw; ip route add $check_two via $primary_gw;\
        sleep 2; ping -c 1 -W 1 $check_one | grep -E '(unreachable|100\%\ packet\ loss)' &> /dev/null &&\
        ping -c 1 -W 1 $check_two | grep -E '(unreachable|100\%\ packet\ loss)' &> /dev/null`
      then #don't works we clean the routes and stay using backup
        ip route del $check_one via $primary_gw
        ip route del $check_two via $primary_gw
      else #it works so we change active connection 
        ip route del $check_one via $primary_gw
        ip route del $check_two via $primary_gw
        ./script_change_to_primary.sh
        rm /tmp/wan_backup
    fi
fi

假设你只希望你的服务器在 adsl 发生故障时使用 3g,那么我只会在 adsl iface 中使用 iptables snat 或伪装,并且我会在 ./script_change_to_secondary.sh 中阻止对 squid 的访问,你的文件可以是:

脚本_更改_到_secondary.sh

#!/bin/bash
pon 3gIsp #this one it is going to change the default route of server anyway
#drop squid connections, you could disable here the boot snat or masquerade for adsl
#but given your adsl is not active i don't see the need anyway
iptables -I INPUT -s LAN_IP_RANGE -d SERVER_IP -p tcp --dport 3128 -j DROP

脚本_更改_到_primary.sh

#!/bin/bash
poff 3gIsp
iptables -D INPUT -s LAN_IP_RANGE -d SERVER_IP -p tcp --dport 3128 -j DROP
/etc/init.d/openvpn restart

您还应该在 /etc/ppp/ip-up.d/ 中有一个带有“/etc/init.d/openvpn restart”的 bash 脚本,这样,每次您连接到 ppp 提供商时,您的 openvpn 都会自动重新启动。

就像我说的,它有点丑陋和粗糙,但它可以工作:)如果你找到了一个集成的干净解决方案,请告诉我:),自己动手的一个好处是你可以完全控制系统,这是我对任何同时有两个或三个连接处于活动状态的客户所做工作的过度简化,并执行负载平衡和 QoS,所有这些都与检测连接问题并更改路由和 QoS 的脚本集成。

如果你更喜欢集成解决方案,而不是自行开发,那么你可以使用类似 赞蒂亚尔,它支持您想要使用的内容,但它是一个完整的发行版,专为创建小型企业服务器而定制,我通常更喜欢自己配置服务器,但这是一个可以通过 Web 进行管理的良好发行版。

答案2

我们有几台较小的 edimax 3g 路由器,它们有 1 个 wlan、1 个 lan 和用于 3G 棒的 usb。lan 端口可以配置为 lan 的一部分或主 wan 端口(3g 充当故障转移)。我与 edimax 没有任何关系,我们在路上或会议上使用它们,因为它们很小(我们拥有的其中一个是电池供电的)。

话虽如此,我会选择在 ubuntu 服务器上进行设置。

答案:

  1. 如果你是经验丰富的服务器管理员,那么很容易。否则,如果你愿意花时间学习并理解您正在做的事情对于高级用户来说也是可行的。
  2. 我不知道有哪些可用的软件包,但是

更改为 3g-脚本示例:

pon YourIsp-name
route del default gw "your_adls_defaultGW"
route add -host "ping_or_other_test_host_for_checking_adsl_route" gw  "your_adls_defaultGW"
"do_other_stuff_like_restart_openvpn_maybe"

更改为 adsl-脚本示例:

poff YourIsp-name
route add default gw "your_adls_defaultGW"
route del -host "ping_or_other_test_host_for_checking_adsl_route" gw  "your_adls_defaultGW"
"do_other_stuff_like_restart_openvpn_maybe"

将 dhcp 与 adsl 结合使用会破坏这个简单示例,您必须在每次更改时修改 /etc/resolv.conf,或者使用开放的 dns 服务器,如 google 8.8.8.8(或您自己的解析器)。现在... 监控有点困难,但将类似这样的内容放入 cron(不要,这是一个幼稚的示例),将使您能够故障转移到 3g 并返回。

ping -q -c 2 "ping_or_other_test_host_for_checking_adsl_route"  && TARGETUP=1 || TARGETUP=0 ;  echo $TARGETUP ; if [ "$TARGETUP" == 1 ] ; then ( rm /tmp/.adsl_down ; [ -e /tmp/.adsl_up ] || ( PATH_TO_YOUR_ADSL_UP_SCRIPT && touch /tmp/.adsl_up ) ); else  ( rm /tmp/.adsl_up ; [ -e /tmp/.adsl_down ] || ( PATH_TO_YOUR_3G_UP_SCRIPT && touch /tmp/.adsl_down )) ; fi

三)Edimax 3g 路由器zeroshell linuxfw-发行版看起来 zeroshell 有故障转移功能,所以买一台便宜的 PC 作为路由器,然后使用 zeroshell。不过我还没有测试过)

四)测试、坚持,当第一次需要故障转移时,它将会失败(因为一些愚蠢的事情......)。

我不确定您是否需要使用 squid 进行此设置,除非要使用您访问的最常见页面的本地缓存来加速 3g 连接。

答案3

我看到大多数海报都使用软件解决方案,您是否考虑过任何基于硬件的解决方案?

不确定您想花多少钱,但 DrayTek Vigor 2830n 可以满足您的需求。可能还有更便宜的替代品,但这是我在两个不同的站点使用过的,效果非常好。

此设备上有 3 个 WAN 连接,即标准 ADSL 线路、以太网连接和 3G 加密狗。您只需使用 ADSL 和 3G 加密狗以及路由器本身即可进行设置。3G 加密狗不需要处于“负载平衡模式”,而只需处于纯 WAN 备份模式即可。

重新阅读原始帖子后,我想补充一点,您甚至可以限制仅通过 3G 加密狗的 VPN 流量,以最大限度地减少 3G 加密狗上的带宽成本。

Draytek 三 WAN 调制解调器/路由器

答案4

我认为你可以使用 keepalived 每 30 秒 ping 一个远程互联网地址(可能是 Google),并设置超时时间。如果 ping 超时,请配置 keepalived 关闭 eth0 并启动 3G 接口,然后重新启动 VPN。

配置 keepalived 时应考虑延迟等因素,以便它在不需要时不会切换接口。需要进行一些测试/实验。不过,我想不出当 ADSL 线路恢复正常时如何恢复。

如果 ADSL 调制解调器和服务器之间有一个路由器,或者调制解调器有一个可以 ping 的外部地址,那么您可能可以将其用作恢复连接的标准。

KeepaliveD 站点

希望这可以帮助你开始!

相关内容