Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Dual WAN Failover doesn't failover back to WAN 1 [Resolved]

    Scheduled Pinned Locked Moved Routing and Multi WAN
    55 Posts 6 Posters 7.2k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      serbus
      last edited by

      Hello!

      There is a built-in system for packages that allows custom plugin code to be called on certain events.

      It is in /etc/inc/pfsense-utils.inc in function pkg_call_plugins

      It looks like several packages use the callback plugin (carp, certs). The gateway system also uses the callback in /etc/inc/gwlb.inc when there is a state change.

      It is calling for a package that has setup a plugin called "plugin_gateway". I dont see any official packages that have a plugin named that, but it could be the one referenced in this post:

      https://forum.netgate.com/topic/139455/list-of-hooks

      https://github.com/jazzl0ver/pfSense-pkg-gatewayhook

      I dont know why they would modify the official gwlb.inc code to call a plugin for a package that is not part of the official release...

      John

      Lex parsimoniae

      1 Reply Last reply Reply Quote 0
      • Raffi_R
        Raffi_
        last edited by Raffi_

        FYI, I ended up using the first script in the original thread I linked (take wan2 down and back up when wan1 is back up). I didn't do that because it was a better solution, but I found it easier to modify. I only had to change the defined interface for WAN2.
        https://forum.netgate.com/topic/84269/multi-wan-gateway-failover-not-switching-back-to-tier-1-gw-after-back-online/67?_=1601399952603

        The second script below it seems fundamentally better (killing states), but I have a DHCP wan2 and didn't want to use that since I wasn't sure how to modify it for my scenario.

        I haven't tested it yet since it's not big deal for me whether this works or not. I'm going to wait for a real event and see what happens.

        1 Reply Last reply Reply Quote 0
        • pfrickrollP
          pfrickroll @johnpoz
          last edited by

          @johnpoz said in Dual WAN Failover doesn't failover back to WAN 1:

          That link he provided took you right to the post with the script

          #!/bin/sh
          
          # get active gateway and current time
          CURRENT_TIME="$(date +"%c")"
          CURRENT_GW="$(netstat -rn | grep default | awk '{print $4}')"
          
          if [ $CURRENT_GW = "em2" ]; then
          	#check if WAN1 is up or not
          	WAN1_STATUS="$(pfSsh.php playback gatewaystatus brief | grep WANGW | awk '{print $2}')"
          	if [ $WAN1_STATUS = "none" ]; then
          		#WAN1 is back online, stop/start WAN2
          		echo "$CURRENT_TIME: Bringing down WAN2"
          		ifconfig em2 down
          		echo "$CURRENT_TIME: Sleeping for 30s"
          		sleep 30
          		echo "$CURRENT_TIME: Bringing up WAN2"
          		ifconfig em2 up
          	else
          		echo "$CURRENT_TIME: WAN1 is still down"
          	fi
          else
          	echo "$CURRENT_TIME: Nothing to do!"
          fi
          
          
          

          And just below post was another with the cron info and slightly modified script :) so not sure what link you followed?

          When i said I dont know about scripting I meant as I dont know anything pretty much.
          This script, do I run it in Diagnostics-Command Prompt-Execute PHP Commands or I put it somewhere in Diagnostics-Edit File?

          Raffi_R 1 Reply Last reply Reply Quote 0
          • Raffi_R
            Raffi_ @pfrickroll
            last edited by Raffi_

            @pfrickroll said in Dual WAN Failover doesn't failover back to WAN 1:

            When i said I dont know about scripting I meant as I dont know anything pretty much.
            This script, do I run it in Diagnostics-Command Prompt-Execute PHP Commands or I put it somewhere in Diagnostics-Edit File?

            Alrighty, let me see if I can help.

            Edit, I forgot the most important step. Backup your config before doing anything you're not familiar with.

            First, take that script and copy/paste it into a text editor on your PC, e.g., Notepad ++.

            Now figure out what your WAN2 interface is. Go to Interfaces > WAN2. In my case it is em1.
            Substitute that in place of anywhere it says em2 in the script. If your WAN2 is by chance also on em2, then you're in luck and don't have to edit anything.

            Save that text file and then change the name to something like failover_script.sh

            Now to upload that file go to Diagnostic > Command prompt. Use the Upload File and chose that file you just made. It will by default go to /tmp/. For the sake of simplicity you can leave it there if you want. I think you should be able to run it from there.

            Now you have to create a cron job to run that script on a schedule. Download the cron package if you don't already have it. System > Package Manager >Available Packages

            Go to Services > Cron > Add
            Here is what mine looks like as an example.
            cdaaa5f3-e195-4eb1-b8be-a9cb82c4972b-image.png
            This is set to run every 2 minutes. You can adjust that as you want. Also note that my script is in the root folder and has a different name.
            So in your case the command should be
            /tmp/failover_script.sh >> /tmp/failover_script.log

            Again, I'm not an expert on this either so if someone can point out better ways to do this or if I'm wrong, please let me know.

            pfrickrollP 1 Reply Last reply Reply Quote 0
            • pfrickrollP
              pfrickroll @Raffi_
              last edited by pfrickroll

              @Raffi_ My WAN 1 - igb0, WAN2 - igb2
              Is this correct?

              #!/bin/sh
              
              # get active gateway and current time
              CURRENT_TIME="$(date +"%c")"
              CURRENT_GW="$(netstat -rn | grep default | awk '{print $4}')"
              
              if [ $CURRENT_GW = "igb2" ]; then
              	#check if WAN1 is up or not
              	igb0_STATUS="$(pfSsh.php playback gatewaystatus brief | grep WANGW | awk '{print $2}')"
              	if [ $WAN1_STATUS = "none" ]; then
              		#WAN1 is back online, stop/start WAN2
              		echo "$CURRENT_TIME: Bringing down igb2"
              		ifconfig em2 down
              		echo "$CURRENT_TIME: Sleeping for 30s"
              		sleep 30
              		echo "$CURRENT_TIME: Bringing up igb2"
              		ifconfig em2 up
              	else
              		echo "$CURRENT_TIME: igb0 is still down"
              	fi
              else
              	echo "$CURRENT_TIME: Nothing to do!"
              fi
              

              Interfaces.PNG

              Raffi_R 1 Reply Last reply Reply Quote 0
              • Raffi_R
                Raffi_ @pfrickroll
                last edited by

                @pfrickroll said in Dual WAN Failover doesn't failover back to WAN 1:

                @Raffi_ My WAN 1 - igb0, WAN2 - igb2
                Is this correct?

                #!/bin/sh
                
                # get active gateway and current time
                CURRENT_TIME="$(date +"%c")"
                CURRENT_GW="$(netstat -rn | grep default | awk '{print $4}')"
                
                if [ $CURRENT_GW = "igb2" ]; then
                	#check if WAN1 is up or not
                	igb0_STATUS="$(pfSsh.php playback gatewaystatus brief | grep WANGW | awk '{print $2}')"
                	if [ $WAN1_STATUS = "none" ]; then
                		#WAN1 is back online, stop/start WAN2
                		echo "$CURRENT_TIME: Bringing down igb2"
                		ifconfig em2 down
                		echo "$CURRENT_TIME: Sleeping for 30s"
                		sleep 30
                		echo "$CURRENT_TIME: Bringing up igb2"
                		ifconfig em2 up
                	else
                		echo "$CURRENT_TIME: igb0 is still down"
                	fi
                else
                	echo "$CURRENT_TIME: Nothing to do!"
                fi
                

                Close but not quite right. You missed two em2 lines. See below. I forgot to mention the WAN1 interface but it looks like you got that right.

                #!/bin/sh
                
                # get active gateway and current time
                CURRENT_TIME="$(date +"%c")"
                CURRENT_GW="$(netstat -rn | grep default | awk '{print $4}')"
                
                if [ $CURRENT_GW = "igb2" ]; then
                	#check if WAN1 is up or not
                	igb0_STATUS="$(pfSsh.php playback gatewaystatus brief | grep WANGW | awk '{print $2}')"
                	if [ $WAN1_STATUS = "none" ]; then
                		#WAN1 is back online, stop/start WAN2
                		echo "$CURRENT_TIME: Bringing down igb2"
                		ifconfig igb2 down
                		echo "$CURRENT_TIME: Sleeping for 30s"
                		sleep 30
                		echo "$CURRENT_TIME: Bringing up igb2"
                		ifconfig igb2 up
                	else
                		echo "$CURRENT_TIME: igb0 is still down"
                	fi
                else
                	echo "$CURRENT_TIME: Nothing to do!"
                fi
                
                1 Reply Last reply Reply Quote 1
                • Raffi_R
                  Raffi_
                  last edited by Raffi_

                  Never mind, you don't have to do anything with WAN1. That was right. Put that back to the way it was as shown below.

                  #!/bin/sh
                  
                  # get active gateway and current time
                  CURRENT_TIME="$(date +"%c")"
                  CURRENT_GW="$(netstat -rn | grep default | awk '{print $4}')"
                  
                  if [ $CURRENT_GW = "igb2" ]; then
                  	#check if WAN1 is up or not
                  	WAN1_STATUS="$(pfSsh.php playback gatewaystatus brief | grep WANGW | awk '{print $2}')"
                  	if [ $WAN1_STATUS = "none" ]; then
                  		#WAN1 is back online, stop/start WAN2
                  		echo "$CURRENT_TIME: Bringing down WAN2"
                  		ifconfig igb2 down
                  		echo "$CURRENT_TIME: Sleeping for 30s"
                  		sleep 30
                  		echo "$CURRENT_TIME: Bringing up WAN2"
                  		ifconfig igb2 up
                  	else
                  		echo "$CURRENT_TIME: WAN1 is still down"
                  	fi
                  else
                  	echo "$CURRENT_TIME: Nothing to do!"
                  fi
                  
                  
                  pfrickrollP 1 Reply Last reply Reply Quote 0
                  • pfrickrollP
                    pfrickroll @Raffi_
                    last edited by

                    @Raffi_ Are you sure? I thought any line without # I should modify WAN into my firewall interface name?

                    Raffi_R 1 Reply Last reply Reply Quote 0
                    • Raffi_R
                      Raffi_ @pfrickroll
                      last edited by

                      @pfrickroll said in Dual WAN Failover doesn't failover back to WAN 1:

                      @Raffi_ Are you sure? I thought any line without # I should modify WAN into my firewall interface name?

                      I edited my script above. Only where it specified em2 is what had to be changed to igb2. references to WAN1 or even WAN2 is not hard coded to an interface so you should be able to leave that.

                      pfrickrollP 1 Reply Last reply Reply Quote 0
                      • pfrickrollP
                        pfrickroll @Raffi_
                        last edited by

                        @Raffi_ said in Dual WAN Failover doesn't failover back to WAN 1:

                        @pfrickroll said in Dual WAN Failover doesn't failover back to WAN 1:

                        @Raffi_ Are you sure? I thought any line without # I should modify WAN into my firewall interface name?

                        I edited my script above. Only where it specified em2 is what had to be changed to igb2. references to WAN1 or even WAN2 is not hard coded to an interface so you should be able to leave that.

                        It didn't switch after 10 mins

                        states.PNG

                        So, i after pfsesne reboot I checked in Diagnostics-Edit File and my uploaded script there is gone and failover_script.log is empty

                        Raffi_R 1 Reply Last reply Reply Quote 0
                        • Raffi_R
                          Raffi_ @pfrickroll
                          last edited by Raffi_

                          @pfrickroll said in Dual WAN Failover doesn't failover back to WAN 1:

                          It didn't switch after 10 mins

                          I guess I was wrong on the script. Sorry, looks like mine won't work either :/
                          You should see WAN2 taken down and then brought back up after 30 seconds if WAN1 is running again.
                          Maybe you will have to adjust those variables in that case. Let me know if you get it to work. I will have to adjust mine. At least you know how to work with scripts now. I'm sure you'll get it working.

                          @pfrickroll said in Dual WAN Failover doesn't failover back to WAN 1:

                          So, i after pfsesne reboot I checked in Diagnostics-Edit File and my uploaded script there is gone and failover_script.log is empty

                          I was afraid that leaving the script in /tmp/ might lose it on reboot, but I wasn't sure.
                          What you can do to solve that is upload it again, and then after uploading go to Diagnostic > command prompt execute the command mv /tmp/failover_script.sh /root/
                          That will move the file from /tmp/ to /root/. Then you will have to modify your command in the cron job for that new location, /root/failover_script.sh.

                          pfrickrollP 1 Reply Last reply Reply Quote 0
                          • pfrickrollP
                            pfrickroll @Raffi_
                            last edited by

                            @Raffi_ In cron under command i have "/root/failover_script.sh. >> /tmp/failover_script.log"
                            But in under root its "failover_script.sh.txt " Should i change cron job command to "/root/failover_script.sh.txt >> /tmp/failover_script.log"
                            pfsense edit.PNG

                            Raffi_R 1 Reply Last reply Reply Quote 0
                            • Raffi_R
                              Raffi_ @pfrickroll
                              last edited by Raffi_

                              @pfrickroll said in Dual WAN Failover doesn't failover back to WAN 1:

                              @Raffi_ In cron under command i have "/root/failover_script.sh. >> /tmp/failover_script.log"
                              But in under root its "failover_script.sh.txt " Should i change cron job command to "/root/failover_script.sh.txt >> /tmp/failover_script.log"
                              pfsense edit.PNG

                              No, the file must be a .sh file in order to run. A .txt file will not run. That might be why it didn't work the first time. You probably want to move the log file to /root/ as well.

                              pfrickrollP 1 Reply Last reply Reply Quote 0
                              • pfrickrollP
                                pfrickroll @Raffi_
                                last edited by

                                @Raffi_ I fixed everything but it doesn't work :(

                                Raffi_R 1 Reply Last reply Reply Quote 0
                                • Raffi_R
                                  Raffi_ @pfrickroll
                                  last edited by

                                  @pfrickroll said in Dual WAN Failover doesn't failover back to WAN 1:

                                  @Raffi_ I fixed everything but it doesn't work :(

                                  I can't really test it on my end so I can't really help much beyond that.

                                  pfrickrollP 1 Reply Last reply Reply Quote 0
                                  • pfrickrollP
                                    pfrickroll @Raffi_
                                    last edited by

                                    @Raffi_ Oh well, i will keep digging. I got 36 pfsense boxes. I don't have time manually rebooting/killing states when stuff like this happens tp be honest. My Sonicwalls handle this pretty easily. I am not network vet, so I honestly can't grasp the concept fully why pfsense is like that.

                                    Raffi_R 1 Reply Last reply Reply Quote 0
                                    • Raffi_R
                                      Raffi_ @pfrickroll
                                      last edited by

                                      @pfrickroll said in Dual WAN Failover doesn't failover back to WAN 1:

                                      @Raffi_ Oh well, i will keep digging. I got 36 pfsense boxes. I don't have time manually rebooting/killing states when stuff like this happens tp be honest. My Sonicwalls handle this pretty easily. I am not network vet, so I honestly can't grasp the concept fully why pfsense is like that.

                                      I'm sure you'll get it working. I would also suggest taking a look at the other script that was linked on a different thread mentioned above. That one was defined very well with instructions. Maybe you'll find it easier to follow/modify that one. Now that you have some understanding of how to go about it you might find that a better solution.

                                      1 Reply Last reply Reply Quote 1
                                      • pfrickrollP
                                        pfrickroll
                                        last edited by

                                        Thanks for your time and chewing everything out for me, I used cron for other things but didn't really pay attention to command option there. Now I do pretty well.

                                        1 Reply Last reply Reply Quote 1
                                        • S
                                          serbus
                                          last edited by serbus

                                          Hello!

                                          You could try the gateway_plugin interface if you dont mind being a guinea pig...:)

                                          Download https://github.com/jazzl0ver/pfSense-pkg-gatewayhook/releases/download/v0.1/pfSense-pkg-gatewayhook-0_1.txz

                                          Use Diagnostics -> Command Prompt -> Upload File to save the pkg file to the /tmp folder on your device, then

                                          pkg install /tmp/pfSense-pkg-gatewayhook-0_1.txz
                                          

                                          The package code is close, but not quite.

                                          Edit /usr/local/pkg/gatewayhook.inc

                                          The main function is missing an assignment statement and is not calling the gateway script with any parameters. The fixed function should look like :

                                          function gatewayhook_plugin_gateway($pluginparams) {
                                              $type = $pluginparams['type'];
                                              $name = $pluginparams['name'];
                                              $event = $pluginparams['event'];
                                              $interface = $pluginparams['interface'];
                                              $gatewayhooklock = lock("gatewayhook", LOCK_EX);
                                             syslog(LOG_NOTICE, "gatewayhook: " . GATEWAY_ALARM_CUSTOM_SCRIPT . " script started - $name $event $interface");
                                              mwexec(GATEWAY_ALARM_CUSTOM_SCRIPT . " $name $event $interface");
                                              unlock($gatewayhooklock);
                                              return 0;
                                          }
                                          

                                          Edit the gateway plugin script the package created - /usr/local/etc/rc.d/rc.gateway_alarm_custom

                                          The plugin script could look something like this :

                                          #!/bin/sh
                                          
                                          # put what needs to be done before exit line
                                          
                                          # arg 1 should be the gateaway name
                                          
                                          gwname=${1:-gwname}
                                          
                                          # arg 2 should be gateway.up or gateway.down
                                          
                                          event=${2:-gateway.unknown}
                                          
                                          # arg 3 should be the interface ... may not be present
                                          
                                          interface=${3:-interface}
                                          
                                          if [ $gwname == "WAN0" ] && [ $event == "gateway.up" ]
                                          then
                                             # clear the states on this interface
                                          
                                             /sbin/pfctl -i igb0 -Fs
                                          fi
                                          
                                          exit 0
                                          
                                          

                                          Basically, this is saying that when the plugin script is notified that WAN0 is UP, IGB0 should get all of its states cleared.

                                          John

                                          Lex parsimoniae

                                          pfrickrollP 1 Reply Last reply Reply Quote 1
                                          • pfrickrollP
                                            pfrickroll @serbus
                                            last edited by

                                            @serbus said in Dual WAN Failover doesn't failover back to WAN 1:

                                            pkg install /tmp/pfSense-pkg-gatewayhook-0_1.txz

                                            Sure, few questions when I

                                            pkg install /tmp/pfSense-pkg-gatewayhook-0_1.txz
                                            

                                            Shell output

                                            Updating pfSense-core repository catalogue...
                                            pfSense-core repository is up to date.
                                            Updating pfSense repository catalogue...
                                            pfSense repository is up to date.
                                            All repositories are up to date.
                                            Checking integrity... done (0 conflicting)
                                            The following 1 package(s) will be affected (of 0 checked):
                                            
                                            New packages to be INSTALLED:
                                            	pfSense-pkg-gatewayhook: 0_1 [unknown-repository]
                                            
                                            Number of packages to be installed: 1
                                            
                                            Proceed with this action? [y/N]:
                                            

                                            How do i activate "yes"?

                                            Another question in script below, do i change any values to reflect my interface? For example WAN0?

                                            #!/bin/sh
                                            
                                            # put what needs to be done before exit line
                                            
                                            # arg 1 should be the gateaway name
                                            
                                            gwname=${1:-gwname}
                                            
                                            # arg 2 should be gateway.up or gateway.down
                                            
                                            event=${2:-gateway.unknown}
                                            
                                            # arg 3 should be the interface ... may not be present
                                            
                                            interface=${3:-interface}
                                            
                                            if [ $gwname == "WAN0" ] && [ $event == "gateway.up" ]
                                            then
                                               # clear the states on this interface
                                            
                                               /sbin/pfctl -i igb0 -Fs
                                            fi
                                            
                                            exit 0
                                            
                                            Raffi_R 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.