Hi Richard, The failover idea is interesting. I have a couple comments on the patch:
* How is --peerinit different from --ipchange? * Shouldn't if ( !(signal_received == SIGUSR1 && !options->sigusr1_script ) ) ... be if (signal_received == SIGUSR1 && options->sigusr1_script) ... ? James Richard Mueller <muel...@teamix.net> said: > Hello openvpn-developers, > > I needed two more places in openvpn where to exec some scripts > because I wanted to build a "fail-over" solution between two > tuns. > > > 1.) Situation: > +---------+ tun0 (ISP0) +---------+ > | BOX 1 +----------------------+ BOX 2 | > | | | | > | +----------------------+ | > +---------+ tun1 (ISP1) +---------+ > > tun0 is prefered but if tun0 fails tun1 should do > the job. > > Linux advanced routing has a usable solution for this: > Two routing tables with one prefered. > > Because of this I needed to add/delete routes at this points: > > - After the first "answer" from the peer (add route for tun?) > - At a SIGUSR1 == "peer dead" (del route for tun?) > > > 2.) I used following configs: > > [BOX1: tun0] > > # interface configuration > dev tun0 > > # Peer connect configuartion > remote 172.16.90.4 > # float > > persist-tun > persist-key > ping 7 > ping-restart 21 > > # 10.255.253.8 is our local VPN endpoint > # 10.255.253.9 is our remote VPN endpoint > ifconfig 10.255.254.122 10.255.254.121 > > # TSL-Client > tls-client > ca /etc/openvpn/certs/ca.crt > cert /etc/openvpn/certs/box1.crt > key /etc/openvpn/certs/box1.key > tls-verify "/usr/local/sbin/verify-cn box2" > > # Routen setzen > peerinit /etc/openvpn/scripts/tun0.up > sigusr1 /etc/openvpn/scripts/tun0.down > > lport 5006 > rport 5007 > > comp-lzo > #daemon > > reneg-sec 600 > > verb 5 > > [BOX1: tun1] > > # interface configuration > dev tun1 > > # Peer connect configuartion > remote 172.16.90.4 > # float > > persist-tun > persist-key > ping 7 > ping-restart 21 > > # 10.255.253.8 is our local VPN endpoint > # 10.255.253.9 is our remote VPN endpoint > ifconfig 10.255.253.122 10.255.253.121 > > # TSL-Client > tls-client > ca /etc/openvpn/certs/ca.crt > cert /etc/openvpn/certs/box1.crt > key /etc/openvpn/certs/box1.key > tls-verify "/usr/local/sbin/verify-cn box2" > > # Routen setzen > peerinit /etc/openvpn/scripts/tun1.up > sigusr1 /etc/openvpn/scripts/tun1.down > > lport 5506 > rport 5507 > > comp-lzo > #daemon > > reneg-sec 600 > > verb 5 > > [BOX2: tun0] > > # interface configuration > dev tun0 > > # Peer connect configuartion > remote 172.16.90.1 > # float > > persist-tun > persist-key > ping 7 > ping-restart 21 > > ifconfig 10.255.254.121 10.255.254.122 > > # TSL-Client > tls-client > ca /etc/openvpn/certs/ca.crt > cert /etc/openvpn/certs/box2.crt > key /etc/openvpn/certs/box2.key > tls-verify "/usr/local/sbin/verify-cn box1" > > # Routen setzen > peerinit /etc/openvpn/scripts/tun0.up > sigusr1 /etc/openvpn/scripts/tun0.down > > lport 5007 > rport 5006 > > comp-lzo > #daemon > > reneg-sec 600 > > verb 5 > > [BOX1: tun1] > > # interface configuration > dev tun1 > > # Peer connect configuartion > remote 172.16.90.1 > # float > > persist-tun > persist-key > ping 7 > ping-restart 21 > > ifconfig 10.255.253.121 10.255.253.122 > > # TSL-Client > tls-client > ca /etc/openvpn/certs/ca.crt > cert /etc/openvpn/certs/box2.crt > key /etc/openvpn/certs/box2.key > tls-verify "/usr/local/sbin/verify-cn box1" > > peerinit /etc/openvpn/scripts/tun1.up > sigusr1 /etc/openvpn/scripts/tun1.down > > lport 5507 > rport 5506 > > comp-lzo > #daemon > > reneg-sec 600 > > verb 5 > > 4.) Here is the patch: > > [PATCH START] > diff -u openvpn-1.3.2/openvpn.c openvpn-1.3.2-droute/openvpn.c > --- openvpn-1.3.2/openvpn.c Mon Oct 21 03:46:52 2002 > +++ openvpn-1.3.2-droute/openvpn.c Wed Dec 18 19:18:12 2002 > @@ -341,7 +341,7 @@ > options->local_port, options->remote_port, > options->bind_local, options->remote_float, > options->inetd, > - udp_socket_addr, options->ipchange, > + udp_socket_addr, options->ipchange, options->peerinit_script, > options->resolve_retry_seconds); > > #ifdef USE_CRYPTO > @@ -1406,6 +1406,15 @@ > run_script (options->down_script, tuntap_actual, MAX_RW_SIZE_TUN (&frame), > max_rw_size_udp, options->ifconfig_local, options->ifconfig_remote); > } > + /* > + * Execute sigusr1 script > + */ > + if ( !(signal_received == SIGUSR1 && !options->sigusr1_script ) ) > + { > + msg (M_INFO, "Executing sigusr1 script %s",options->sigusr1_script); > + system_check (options->sigusr1_script, "sigusr1 command failed", false); > + } > + > done: > /* pop our garbage collection level */ > gc_free_level (gc_level); > diff -u openvpn-1.3.2/options.c openvpn-1.3.2-droute/options.c > --- openvpn-1.3.2/options.c Sat Oct 19 23:26:11 2002 > +++ openvpn-1.3.2-droute/options.c Wed Dec 18 18:52:24 2002 > @@ -316,6 +316,9 @@ > SHOW_STR (writepid); > SHOW_STR (up_script); > SHOW_STR (down_script); > + SHOW_STR (peerinit_script); > + SHOW_STR (sigusr1_script); > + SHOW_STR (down_script); > SHOW_BOOL (daemon); > SHOW_BOOL (inetd); > SHOW_INT (nice); > @@ -726,6 +729,16 @@ > { > ++i; > options->down_script = p2; > + } > + else if (streq(p1, "peerinit") && p2) > + { > + ++i; > + options->peerinit_script = p2; > + } > + else if (streq(p1, "sigusr1") && p2) > + { > + ++i; > + options->sigusr1_script = p2; > } > else if (streq (p1, "daemon")) > { > diff -u openvpn-1.3.2/options.h openvpn-1.3.2-droute/options.h > --- openvpn-1.3.2/options.h Sat Oct 19 22:25:46 2002 > +++ openvpn-1.3.2-droute/options.h Wed Dec 18 18:25:46 2002 > @@ -87,6 +87,8 @@ > const char *writepid; > const char *up_script; > const char *down_script; > + const char *peerinit_script; > + const char *sigusr1_script; > bool daemon; > bool inetd; > int nice; > diff -u openvpn-1.3.2/socket.c openvpn-1.3.2-droute/socket.c > --- openvpn-1.3.2/socket.c Sat Oct 19 23:23:19 2002 > +++ openvpn-1.3.2-droute/socket.c Wed Dec 18 18:56:18 2002 > @@ -105,6 +105,7 @@ > bool inetd, > struct udp_socket_addr *usa, > const char *ipchange_command, > + const char *peerinit_command, > int resolve_retry_seconds) > { > CLEAR (*sock); > @@ -112,6 +113,7 @@ > sock->remote_float = remote_float; > sock->addr = usa; > sock->ipchange_command = ipchange_command; > + sock->peerinit_command = peerinit_command; > > /* were we started by inetd or xinetd? */ > if (inetd) > @@ -190,6 +192,22 @@ > sock->set_outgoing_initial = true; > mutex_unlock (L_SOCK); > msg (M_INFO, "Peer Connection Initiated with %s", print_sockaddr (&usa->actual)); > + > + if (sock->peerinit_command) > + { > + char command[256]; > + struct buffer out; > + > + msg (M_INFO, "Executing peerinit_script %s",sock->peerinit_command); > + > + buf_set_write (&out, command, sizeof (command)); > + buf_printf (&out, "%s %s", > + sock->peerinit_command, > + print_sockaddr_ex (&usa->actual, true, " ")); > + msg (D_TLS_DEBUG, "executing ip-change command: %s", command); > + system_check (command, "peerinit command failed", false); > + } > + > if (sock->ipchange_command) > { > char command[256]; > diff -u openvpn-1.3.2/socket.h openvpn-1.3.2-droute/socket.h > --- openvpn-1.3.2/socket.h Sat Oct 19 23:26:10 2002 > +++ openvpn-1.3.2-droute/socket.h Wed Dec 18 18:49:01 2002 > @@ -42,6 +42,7 @@ > bool remote_float; > struct udp_socket_addr *addr; > const char *ipchange_command; > + const char *peerinit_command; > int sd; /* file descriptor for socket */ > }; > > @@ -56,6 +57,7 @@ > bool inetd, > struct udp_socket_addr *addr, > const char *ipchange_command, > + const char *peerinit_command, > int resolve_retry_seconds); > > void > [PATCH START] > > 5.) If it is interesting for you, James, you are free to clean the > code and fix the documentation and merge it in your branch. > Just write a Creditline in the changelog. ;-) > > 6.) Feel free to ask, if you have some questions. > > bye > richard > > -- > Richard Mueller mailto:muel...@teamix.net Fon: +49 9171 896287 > Teamix GmbH http://www.teamix.de Fax: +49 9171 896286 > > PGP Public Key http://www.teamix.net/pgp/rm_public_key_2048 > Fingerprint: ea 50 21 6c a5 39 e9 03 a6 59 af e3 c5 1f 63 8e > > Networks - Consulting - Training - Software Development - eCommerce > > > > ------------------------------------------------------- > This SF.NET email is sponsored by: Order your Holiday Geek Presents Now! > Green Lasers, Hip Geek T-Shirts, Remote Control Tanks, Caffeinated Soap, > MP3 Players, XBox Games, Flying Saucers, WebCams, Smart Putty. > T H I N K G E E K . C O M http://www.thinkgeek.com/sf/ > _______________________________________________ > Openvpn-devel mailing list > Openvpn-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/openvpn-devel > --