2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2007-2014 IPFire Team <info@ipfire.org> #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
22 # Based on IPFireCore 77
25 use CGI qw
/:standard/;
30 use File
::Temp qw
/ tempfile tempdir /;
32 use Archive
::Zip
qw(:ERROR_CODES :CONSTANTS);
34 require '/var/ipfire/general-functions.pl';
35 require "${General::swroot}/lang.pl";
36 require "${General::swroot}/header.pl";
37 require "${General::swroot}/countries.pl";
38 require "${General::swroot}/geoip-functions.pl";
40 # enable only the following on debugging purpose
42 #use CGI::Carp 'fatalsToBrowser';
43 #workaround to suppress a warning when a variable is used only once
44 my @dummy = ( ${Header
::colourgreen
}, ${Header
::colourblue
} );
48 my %mainsettings = ();
49 &General
::readhash
("${General::swroot}/main/settings", \
%mainsettings);
50 &General
::readhash
("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \
%color);
53 ### Initialize variables
66 my $errormessage = '';
68 my $cryptowarning = '';
70 my $routes_push_file = '';
71 my $confighost="${General::swroot}/fwhosts/customhosts";
72 my $configgrp="${General::swroot}/fwhosts/customgroups";
73 my $customnet="${General::swroot}/fwhosts/customnetworks";
76 my $local_serverconf = "${General::swroot}/ovpn/scripts/server.conf.local";
77 my $local_clientconf = "${General::swroot}/ovpn/scripts/client.conf.local";
79 &General
::readhash
("${General::swroot}/ethernet/settings", \
%netsettings);
80 $cgiparams{'ENABLED'} = 'off';
81 $cgiparams{'ENABLED_BLUE'} = 'off';
82 $cgiparams{'ENABLED_ORANGE'} = 'off';
83 $cgiparams{'EDIT_ADVANCED'} = 'off';
84 $cgiparams{'NAT'} = 'off';
85 $cgiparams{'COMPRESSION'} = 'off';
86 $cgiparams{'ONLY_PROPOSED'} = 'off';
87 $cgiparams{'ACTION'} = '';
88 $cgiparams{'CA_NAME'} = '';
89 $cgiparams{'DH_NAME'} = 'dh1024.pem';
90 $cgiparams{'DHLENGHT'} = '';
91 $cgiparams{'DHCP_DOMAIN'} = '';
92 $cgiparams{'DHCP_DNS'} = '';
93 $cgiparams{'DHCP_WINS'} = '';
94 $cgiparams{'ROUTES_PUSH'} = '';
95 $cgiparams{'DCOMPLZO'} = 'off';
96 $cgiparams{'MSSFIX'} = '';
97 $cgiparams{'number'} = '';
98 $cgiparams{'DCIPHER'} = '';
99 $cgiparams{'DAUTH'} = '';
100 $cgiparams{'TLSAUTH'} = '';
101 $routes_push_file = "${General::swroot}/ovpn/routes_push";
102 # Perform crypto and configration test
105 # Add CCD files if not already presant
106 unless (-e
$routes_push_file) {
107 open(RPF
, ">$routes_push_file");
110 unless (-e
"${General::swroot}/ovpn/ccd.conf") {
111 open(CCDC
, ">${General::swroot}/ovpn/ccd.conf");
114 unless (-e
"${General::swroot}/ovpn/ccdroute") {
115 open(CCDR
, ">${General::swroot}/ovpn/ccdroute");
118 unless (-e
"${General::swroot}/ovpn/ccdroute2") {
119 open(CCDRT
, ">${General::swroot}/ovpn/ccdroute2");
122 # Add additional configs if not already presant
123 unless (-e
"$local_serverconf") {
124 open(LSC
, ">$local_serverconf");
127 unless (-e
"$local_clientconf") {
128 open(LCC
, ">$local_clientconf");
132 &Header
::getcgihash
(\
%cgiparams, {'wantfile' => 1, 'filevar' => 'FH'});
134 # prepare openvpn config file
140 if ($netsettings{'CONFIG_TYPE'} == 2) {return 1;}
141 if ($netsettings{'CONFIG_TYPE'} == 4) {return 1;}
147 if ($netsettings{'CONFIG_TYPE'} == 3) {return 1;}
148 if ($netsettings{'CONFIG_TYPE'} == 4) {return 1;}
153 my $bytesize = shift;
156 while(abs($bytesize) >= 1024){
157 $bytesize=$bytesize/1024;
162 my @units = ("Bytes","KB","MB","GB","TB","PB","EB");
163 my $newsize=(int($bytesize*100 +0.5))/100;
164 return("$newsize $units[$i]");
169 if (open(FILE
, ">${General::swroot}/ovpn/certs/serial")) {
173 if (open(FILE
, ">${General::swroot}/ovpn/certs/index.txt")) {
177 if (open(FILE
, ">${General::swroot}/ovpn/certs/index.txt.attr")) {
181 unlink ("${General::swroot}/ovpn/certs/index.txt.old");
182 unlink ("${General::swroot}/ovpn/certs/index.txt.attr.old");
183 unlink ("${General::swroot}/ovpn/certs/serial.old");
184 unlink ("${General::swroot}/ovpn/certs/01.pem");
187 sub newcleanssldatabase
189 if (! -s
"${General::swroot}/ovpn/certs/serial" ) {
190 open(FILE
, ">${General::swroot}(ovpn/certs/serial");
194 if (! -s
">${General::swroot}/ovpn/certs/index.txt") {
195 system ("touch ${General::swroot}/ovpn/certs/index.txt");
197 if (! -s
">${General::swroot}/ovpn/certs/index.txt.attr") {
198 system ("touch ${General::swroot}/ovpn/certs/index.txt.attr");
200 unlink ("${General::swroot}/ovpn/certs/index.txt.old");
201 unlink ("${General::swroot}/ovpn/certs/index.txt.attr.old");
202 unlink ("${General::swroot}/ovpn/certs/serial.old");
207 if (open(FILE
, "${General::swroot}/ovpn/certs/serial.old")) {
208 my $hexvalue = <FILE
>;
211 unlink ("${General::swroot}/ovpn/certs/$hexvalue.pem");
216 ### Check for PKI and configure problems
221 # Warning if DH parameter is 1024 bit
222 if (-f
"${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}") {
223 my $dhparameter = `/usr/bin/openssl dhparam -text -in ${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}`;
224 my @dhbit = ($dhparameter =~ /(\d+)/);
226 $cryptoerror = "$Lang::tr{'ovpn error dh'}";
231 # Warning if md5 is in usage
232 if (-f
"${General::swroot}/ovpn/certs/servercert.pem") {
233 my $signature = `/usr/bin/openssl x509 -noout -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
234 if ($signature =~ /md5WithRSAEncryption/) {
235 $cryptoerror = "$Lang::tr{'ovpn error md5'}";
242 # Warning if certificate is not compliant to RFC3280 TLS rules
243 if (-f
"${General::swroot}/ovpn/certs/servercert.pem") {
244 my $extendkeyusage = `/usr/bin/openssl x509 -noout -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
245 if ($extendkeyusage !~ /TLS Web Server Authentication/) {
246 $cryptowarning = "$Lang::tr{'ovpn warning rfc3280'}";
254 sub writeserverconf
{
255 my %sovpnsettings = ();
257 &General
::readhash
("${General::swroot}/ovpn/settings", \
%sovpnsettings);
260 open(CONF
, ">${General::swroot}/ovpn/server.conf") or die "Unable to open ${General::swroot}/ovpn/server.conf: $!";
262 print CONF
"#OpenVPN Server conf\n";
264 print CONF
"daemon openvpnserver\n";
265 print CONF
"writepid /var/run/openvpn.pid\n";
266 print CONF
"#DAN prepare OpenVPN for listening on blue and orange\n";
267 print CONF
";local $sovpnsettings{'VPN_IP'}\n";
268 print CONF
"dev tun\n";
269 print CONF
"proto $sovpnsettings{'DPROTOCOL'}\n";
270 print CONF
"port $sovpnsettings{'DDEST_PORT'}\n";
271 print CONF
"script-security 3\n";
272 print CONF
"ifconfig-pool-persist /var/ipfire/ovpn/ovpn-leases.db 3600\n";
273 print CONF
"client-config-dir /var/ipfire/ovpn/ccd\n";
274 print CONF
"tls-server\n";
275 print CONF
"ca ${General::swroot}/ovpn/ca/cacert.pem\n";
276 print CONF
"cert ${General::swroot}/ovpn/certs/servercert.pem\n";
277 print CONF
"key ${General::swroot}/ovpn/certs/serverkey.pem\n";
278 print CONF
"dh ${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}\n";
279 my @tempovpnsubnet = split("\/",$sovpnsettings{'DOVPN_SUBNET'});
280 print CONF
"server $tempovpnsubnet[0] $tempovpnsubnet[1]\n";
281 #print CONF "push \"route $netsettings{'GREEN_NETADDRESS'} $netsettings{'GREEN_NETMASK'}\"\n";
283 # Check if we are using mssfix, fragment and set the corretct mtu of 1500.
284 # If we doesn't use one of them, we can use the configured mtu value.
285 if ($sovpnsettings{'MSSFIX'} eq 'on')
286 { print CONF
"tun-mtu 1500\n"; }
287 elsif ($sovpnsettings{'FRAGMENT'} ne '' && $sovpnsettings{'DPROTOCOL'} ne 'tcp')
288 { print CONF
"tun-mtu 1500\n"; }
290 { print CONF
"tun-mtu $sovpnsettings{'DMTU'}\n"; }
292 if ($vpnsettings{'ROUTES_PUSH'} ne '') {
293 @temp = split(/\n/,$vpnsettings{'ROUTES_PUSH'});
296 @tempovpnsubnet = split("\/",&General
::ipcidr2msk
($_));
297 print CONF
"push \"route " . $tempovpnsubnet[0]. " " . $tempovpnsubnet[1] . "\"\n";
302 &General
::readhasharray
("${General::swroot}/ovpn/ccd.conf", \
%ccdconfhash);
303 foreach my $key (keys %ccdconfhash) {
304 my $a=$ccdconfhash{$key}[1];
305 my ($b,$c) = split (/\//, $a);
306 print CONF
"route $b ".&General
::cidrtosub
($c)."\n";
309 &General
::readhasharray
("${General::swroot}/ovpn/ccdroute", \
%ccdroutehash);
310 foreach my $key (keys %ccdroutehash) {
311 foreach my $i ( 1 .. $#{$ccdroutehash{$key}}){
312 my ($a,$b)=split (/\//,$ccdroutehash{$key}[$i]);
313 print CONF
"route $a $b\n";
318 if ($sovpnsettings{CLIENT2CLIENT
} eq 'on') {
319 print CONF
"client-to-client\n";
321 if ($sovpnsettings{MSSFIX
} eq 'on') {
322 print CONF
"mssfix\n";
324 if ($sovpnsettings{FRAGMENT
} ne '' && $sovpnsettings{'DPROTOCOL'} ne 'tcp') {
325 print CONF
"fragment $sovpnsettings{'FRAGMENT'}\n";
328 if ($sovpnsettings{KEEPALIVE_1
} > 0 && $sovpnsettings{KEEPALIVE_2
} > 0) {
329 print CONF
"keepalive $sovpnsettings{'KEEPALIVE_1'} $sovpnsettings{'KEEPALIVE_2'}\n";
331 print CONF
"status-version 1\n";
332 print CONF
"status /var/run/ovpnserver.log 30\n";
333 print CONF
"ncp-disable\n";
334 print CONF
"cipher $sovpnsettings{DCIPHER}\n";
335 print CONF
"auth $sovpnsettings{'DAUTH'}\n";
337 if ($sovpnsettings{'TLSAUTH'} eq 'on') {
338 print CONF
"tls-auth ${General::swroot}/ovpn/certs/ta.key\n";
340 if ($sovpnsettings{DCOMPLZO
} eq 'on') {
341 print CONF
"comp-lzo\n";
343 if ($sovpnsettings{REDIRECT_GW_DEF1
} eq 'on') {
344 print CONF
"push \"redirect-gateway def1\"\n";
346 if ($sovpnsettings{DHCP_DOMAIN
} ne '') {
347 print CONF
"push \"dhcp-option DOMAIN $sovpnsettings{DHCP_DOMAIN}\"\n";
350 if ($sovpnsettings{DHCP_DNS
} ne '') {
351 print CONF
"push \"dhcp-option DNS $sovpnsettings{DHCP_DNS}\"\n";
354 if ($sovpnsettings{DHCP_WINS
} ne '') {
355 print CONF
"push \"dhcp-option WINS $sovpnsettings{DHCP_WINS}\"\n";
358 if ($sovpnsettings{MAX_CLIENTS
} eq '') {
359 print CONF
"max-clients 100\n";
361 if ($sovpnsettings{MAX_CLIENTS
} ne '') {
362 print CONF
"max-clients $sovpnsettings{MAX_CLIENTS}\n";
364 print CONF
"tls-verify /usr/lib/openvpn/verify\n";
365 print CONF
"crl-verify /var/ipfire/ovpn/crls/cacrl.pem\n";
366 print CONF
"user nobody\n";
367 print CONF
"group nobody\n";
368 print CONF
"persist-key\n";
369 print CONF
"persist-tun\n";
370 if ($sovpnsettings{LOG_VERB
} ne '') {
371 print CONF
"verb $sovpnsettings{LOG_VERB}\n";
373 print CONF
"verb 3\n";
375 # Print server.conf.local if entries exist to server.conf
376 if ( !-z
$local_serverconf && $sovpnsettings{'ADDITIONAL_CONFIGS'} eq 'on') {
377 open (LSC
, "$local_serverconf");
378 print CONF
"\n#---------------------------\n";
379 print CONF
"# Start of custom directives\n";
380 print CONF
"# from server.conf.local\n";
381 print CONF
"#---------------------------\n\n";
385 print CONF
"\n#-----------------------------\n";
386 print CONF
"# End of custom directives\n";
387 print CONF
"#-----------------------------\n";
396 if (open(FILE
, ">/var/run/ovpnserver.log")) {
406 my %ccdconfhash = ();
408 my $ccdnetname=$_[0];
409 if (-f
"${General::swroot}/ovpn/ovpnconfig"){
410 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%ccdhash);
411 foreach my $key (keys %ccdhash) {
412 if ($ccdhash{$key}[32] eq $ccdnetname) {
413 $errormessage=$Lang::tr
{'ccd err hostinnet'};
418 &General
::readhasharray
("${General::swroot}/ovpn/ccd.conf", \
%ccdconfhash);
419 foreach my $key (keys %ccdconfhash) {
420 if ($ccdconfhash{$key}[0] eq $ccdnetname){
421 delete $ccdconfhash{$key};
424 &General
::writehasharray
("${General::swroot}/ovpn/ccd.conf", \
%ccdconfhash);
446 $errormessage=$errormessage.$Lang::tr
{'ccd err name'}."<br>";
450 if(!&General
::validhostname
($ccdname))
452 $errormessage=$Lang::tr
{'ccd err invalidname'};
456 ($ccdip,$subcidr) = split (/\//,$ccdnet);
457 $subcidr=&General
::iporsubtocidr
($subcidr);
461 $errormessage=$Lang::tr
{'ccd err invalidnet'};
465 if (!&General
::validipandmask
($ccdnet)){
466 $errormessage=$Lang::tr
{'ccd err invalidnet'};
470 if (!$errormessage) {
472 $baseaddress=&General
::getnetworkip
($ccdip,$subcidr);
473 &General
::readhasharray
("${General::swroot}/ovpn/ccd.conf", \
%ccdconfhash);
474 my $key = &General
::findhasharraykey
(\
%ccdconfhash);
475 foreach my $i (0 .. 1) { $ccdconfhash{$key}[$i] = "";}
476 $ccdconfhash{$key}[0] = $ccdname;
477 $ccdconfhash{$key}[1] = $baseaddress."/".$subcidr;
478 &General
::writehasharray
("${General::swroot}/ovpn/ccd.conf", \
%ccdconfhash);
480 $cgiparams{'ccdname'}='';
481 $cgiparams{'ccdsubnet'}='';
494 # Check if the new name is valid.
495 if(!&General
::validhostname
($newname)) {
496 $errormessage=$Lang::tr
{'ccd err invalidname'};
500 &General
::readhasharray
("${General::swroot}/ovpn/ccd.conf", \
%ccdconfhash);
501 foreach my $key (keys %ccdconfhash) {
502 if ($ccdconfhash{$key}[0] eq $oldname) {
503 foreach my $key1 (keys %ccdconfhash) {
504 if ($ccdconfhash{$key1}[0] eq $newname){
505 $errormessage=$errormessage.$Lang::tr
{'ccd err netadrexist'};
508 $ccdconfhash{$key}[0]= $newname;
509 &General
::writehasharray
("${General::swroot}/ovpn/ccd.conf", \
%ccdconfhash);
516 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%ccdhash);
517 foreach my $key (keys %ccdhash) {
518 if ($ccdhash{$key}[32] eq $oldname) {
519 $ccdhash{$key}[32]=$newname;
520 &General
::writehasharray
("${General::swroot}/ovpn/ovpnconfig", \
%ccdhash);
529 my $ccdnetwork=$_[0];
532 @octets=split("\/",$ccdnetwork);
533 @subnet= split /\./, &General
::cidrtosub
($octets[1]);
546 my ($ip1,$ip2,$ip3,$ip4)=split /\./, $ipin;
554 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%ccdhash);
555 $iprange[0]=$ip1.".".$ip2.".".$ip3.".".($ip4+2);
556 for (my $i=1;$i<=$count;$i++) {
557 my $tmpip=$iprange[$i-1];
559 $iprange[$i]= &General
::getnextip
($tmpip,4);
562 foreach my $key (keys %ccdhash) {
564 foreach my $tmp (@iprange){
565 my ($net,$sub) = split (/\//,$ccdhash{$key}[33]);
567 if ( $hasip ne $ccdhash{$key}[33] ){
568 splice (@iprange,$r,1);
580 my ($ccdip,$subcidr) = split("/",$_[0]);
582 my @allccdips=&getccdadresses
($ccdip,$subcidr,&ccdmaxclients
($ccdip."/".$subcidr),$tz);
583 print"<select name='$boxname' STYLE='font-family : arial; font-size : 9pt; width:130px;' >";
584 foreach (@allccdips) {
587 print "<option value='$ip' ";
588 if ( $ip eq $cgiparams{$boxname} ){
591 print ">$ip</option>";
601 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%ccdhash);
602 foreach my $key (keys %ccdhash) {
603 if ($ccdhash{$key}[32] eq $name){ $i++;}
608 sub check_routes_push
611 my ($ip,$cidr) = split (/\//, $val);
612 ##check for existing routes in routes_push
613 if (-e
"${General::swroot}/ovpn/routes_push") {
614 open(FILE
,"${General::swroot}/ovpn/routes_push");
618 my ($ip2,$cidr2) = split (/\//,"$_");
619 my $val2=$ip2."/".&General
::iporsubtodec
($cidr2);
625 if (&General
::IpInSubnet
($ip,$ip2,&General
::iporsubtodec
($cidr2))){
638 my ($ip,$cidr) = split (/\//, $val);
639 #check for existing routes in ccdroute
640 &General
::readhasharray
("${General::swroot}/ovpn/ccdroute", \
%ccdroutehash);
641 foreach my $key (keys %ccdroutehash) {
642 foreach my $i (1 .. $#{$ccdroutehash{$key}}) {
643 if (&General
::iporsubtodec
($val) eq $ccdroutehash{$key}[$i] && $ccdroutehash{$key}[0] ne $cgiparams{'NAME'}){
646 my ($ip2,$cidr2) = split (/\//,$ccdroutehash{$key}[$i]);
648 if (&General
::IpInSubnet
($ip,$ip2,$cidr2)&& $ccdroutehash{$key}[0] ne $cgiparams{'NAME'} ){
659 my ($ip,$cidr) = split (/\//, $val);
660 #check for existing routes in ccdroute
661 &General
::readhasharray
("${General::swroot}/ovpn/ccd.conf", \
%ccdconfhash);
662 foreach my $key (keys %ccdconfhash) {
663 if (&General
::iporsubtocidr
($val) eq $ccdconfhash{$key}[1]){
666 my ($ip2,$cidr2) = split (/\//,$ccdconfhash{$key}[1]);
668 if (&General
::IpInSubnet
($ip,$ip2,&General
::cidrtosub
($cidr2))){
682 my $ipdotmask = $_[0];
683 if (&General
::validip
($ipdotmask)) { return 0; }
684 if (!($ipdotmask =~ /^(.*?)\/(.*?
)$/)) { }
686 if (($mask =~ /\./ )) { return 0; }
690 # -------------------------------------------------------------------
692 sub write_routepushfile
694 open(FILE
, ">$routes_push_file");
696 if ($vpnsettings{'ROUTES_PUSH'} ne '') {
697 print FILE
$vpnsettings{'ROUTES_PUSH'};
702 sub read_routepushfile
704 if (-e
"$routes_push_file") {
705 open(FILE
,"$routes_push_file");
706 delete $vpnsettings{'ROUTES_PUSH'};
707 while (<FILE
>) { $vpnsettings{'ROUTES_PUSH'} .= $_ };
709 $cgiparams{'ROUTES_PUSH'} = $vpnsettings{'ROUTES_PUSH'};
714 sub writecollectdconf
{
718 open(COLLECTDVPN
, ">${General::swroot}/ovpn/collectd.vpn") or die "Unable to open collectd.vpn: $!";
719 print COLLECTDVPN
"Loadplugin openvpn\n";
720 print COLLECTDVPN
"\n";
721 print COLLECTDVPN
"<Plugin openvpn>\n";
722 print COLLECTDVPN
"Statusfile \"/var/run/ovpnserver.log\"\n";
724 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%ccdhash);
725 foreach my $key (keys %ccdhash) {
726 if ($ccdhash{$key}[0] eq 'on' && $ccdhash{$key}[3] eq 'net') {
727 print COLLECTDVPN
"Statusfile \"/var/run/openvpn/$ccdhash{$key}[1]-n2n\"\n";
731 print COLLECTDVPN
"</Plugin>\n";
734 # Reload collectd afterwards
735 system("/usr/local/bin/collectdctrl restart &>/dev/null");
738 #hier die refresh page
739 if ( -e
"${General::swroot}/ovpn/gencanow") {
741 $refresh = "<meta http-equiv='refresh' content='15;' />";
742 &Header
::showhttpheaders
();
743 &Header
::openpage
($Lang::tr
{'OVPN'}, 1, $refresh);
744 &Header
::openbigbox
('100%', 'center');
745 &Header
::openbox
('100%', 'left', "$Lang::tr{'generate root/host certificates'}:");
746 print "<tr>\n<td align='center'><img src='/images/clock.gif' alt='' /></td>\n";
747 print "<td colspan='2'><font color='red'>Please be patient this realy can take some time on older hardware...</font></td></tr>\n";
749 &Header
::closebigbox
();
750 &Header
::closepage
();
753 ##hier die refresh page
757 ### OpenVPN Server Control
759 if ($cgiparams{'ACTION'} eq $Lang::tr
{'start ovpn server'} ||
760 $cgiparams{'ACTION'} eq $Lang::tr
{'stop ovpn server'} ||
761 $cgiparams{'ACTION'} eq $Lang::tr
{'restart ovpn server'}) {
762 #start openvpn server
763 if ($cgiparams{'ACTION'} eq $Lang::tr
{'start ovpn server'}){
765 system('/usr/local/bin/openvpnctrl', '-s');
768 if ($cgiparams{'ACTION'} eq $Lang::tr
{'stop ovpn server'}){
769 system('/usr/local/bin/openvpnctrl', '-k');
772 # #restart openvpn server
773 # if ($cgiparams{'ACTION'} eq $Lang::tr{'restart ovpn server'}){
774 #workarund, till SIGHUP also works when running as nobody
775 # system('/usr/local/bin/openvpnctrl', '-r');
781 ### Save Advanced options
784 if ($cgiparams{'ACTION'} eq $Lang::tr
{'save-adv-options'}) {
785 &General
::readhash
("${General::swroot}/ovpn/settings", \
%vpnsettings);
786 #DAN do we really need (to to check) this value? Besides if we listen on blue and orange too,
787 #DAN this value has to leave.
788 #new settings for daemon
789 $vpnsettings{'LOG_VERB'} = $cgiparams{'LOG_VERB'};
790 $vpnsettings{'KEEPALIVE_1'} = $cgiparams{'KEEPALIVE_1'};
791 $vpnsettings{'KEEPALIVE_2'} = $cgiparams{'KEEPALIVE_2'};
792 $vpnsettings{'MAX_CLIENTS'} = $cgiparams{'MAX_CLIENTS'};
793 $vpnsettings{'REDIRECT_GW_DEF1'} = $cgiparams{'REDIRECT_GW_DEF1'};
794 $vpnsettings{'CLIENT2CLIENT'} = $cgiparams{'CLIENT2CLIENT'};
795 $vpnsettings{'DCOMPLZO'} = $cgiparams{'DCOMPLZO'};
796 $vpnsettings{'ADDITIONAL_CONFIGS'} = $cgiparams{'ADDITIONAL_CONFIGS'};
797 $vpnsettings{'DHCP_DOMAIN'} = $cgiparams{'DHCP_DOMAIN'};
798 $vpnsettings{'DHCP_DNS'} = $cgiparams{'DHCP_DNS'};
799 $vpnsettings{'DHCP_WINS'} = $cgiparams{'DHCP_WINS'};
800 $vpnsettings{'ROUTES_PUSH'} = $cgiparams{'ROUTES_PUSH'};
803 if ($cgiparams{'FRAGMENT'} eq '') {
804 delete $vpnsettings{'FRAGMENT'};
806 if ($cgiparams{'FRAGMENT'} !~ /^[0-9]+$/) {
807 $errormessage = "Incorrect value, please insert only numbers.";
810 $vpnsettings{'FRAGMENT'} = $cgiparams{'FRAGMENT'};
814 if ($cgiparams{'MSSFIX'} ne 'on') {
815 delete $vpnsettings{'MSSFIX'};
817 $vpnsettings{'MSSFIX'} = $cgiparams{'MSSFIX'};
820 if ($cgiparams{'DHCP_DOMAIN'} ne ''){
821 unless (&General
::validdomainname
($cgiparams{'DHCP_DOMAIN'}) || &General
::validip
($cgiparams{'DHCP_DOMAIN'})) {
822 $errormessage = $Lang::tr
{'invalid input for dhcp domain'};
826 if ($cgiparams{'DHCP_DNS'} ne ''){
827 unless (&General
::validfqdn
($cgiparams{'DHCP_DNS'}) || &General
::validip
($cgiparams{'DHCP_DNS'})) {
828 $errormessage = $Lang::tr
{'invalid input for dhcp dns'};
832 if ($cgiparams{'DHCP_WINS'} ne ''){
833 unless (&General
::validfqdn
($cgiparams{'DHCP_WINS'}) || &General
::validip
($cgiparams{'DHCP_WINS'})) {
834 $errormessage = $Lang::tr
{'invalid input for dhcp wins'};
838 if ($cgiparams{'ROUTES_PUSH'} ne ''){
839 @temp = split(/\n/,$cgiparams{'ROUTES_PUSH'});
840 undef $vpnsettings{'ROUTES_PUSH'};
842 foreach my $tmpip (@temp)
844 s/^\s+//g; s/\s+$//g;
849 unless (&General
::validipandmask
($tmpip)) {
850 $errormessage = "$tmpip ".$Lang::tr
{'ovpn errmsg invalid ip or mask'};
853 my ($ip, $cidr) = split("\/",&General
::ipcidr2msk
($tmpip));
855 if ($ip eq $netsettings{'GREEN_NETADDRESS'} && $cidr eq $netsettings{'GREEN_NETMASK'}) {
856 $errormessage = $Lang::tr
{'ovpn errmsg green already pushed'};
861 &General
::readhasharray
("${General::swroot}/ovpn/ccdroute", \
%ccdroutehash);
862 foreach my $key (keys %ccdroutehash) {
863 foreach my $i (1 .. $#{$ccdroutehash{$key}}) {
864 if ( $ip."/".$cidr eq $ccdroutehash{$key}[$i] ){
865 $errormessage="Route $ip\/$cidr ".$Lang::tr
{'ccd err inuse'}." $ccdroutehash{$key}[0]" ;
868 my ($ip2,$cidr2) = split(/\//,$ccdroutehash{$key}[$i]);
869 if (&General
::IpInSubnet
($ip,$ip2,$cidr2)){
870 $errormessage="Route $ip\/$cidr ".$Lang::tr
{'ccd err inuse'}." $ccdroutehash{$key}[0]" ;
878 $vpnsettings{'ROUTES_PUSH'} .= $tmpip."\n";
881 &write_routepushfile
;
882 undef $vpnsettings{'ROUTES_PUSH'};
885 undef $vpnsettings{'ROUTES_PUSH'};
886 &write_routepushfile
;
888 if ((length($cgiparams{'MAX_CLIENTS'}) == 0) || (($cgiparams{'MAX_CLIENTS'}) < 1 ) || (($cgiparams{'MAX_CLIENTS'}) > 255 )) {
889 $errormessage = $Lang::tr
{'invalid input for max clients'};
892 if ($cgiparams{'KEEPALIVE_1'} ne '') {
893 if ($cgiparams{'KEEPALIVE_1'} !~ /^[0-9]+$/) {
894 $errormessage = $Lang::tr
{'invalid input for keepalive 1'};
898 if ($cgiparams{'KEEPALIVE_2'} ne ''){
899 if ($cgiparams{'KEEPALIVE_2'} !~ /^[0-9]+$/) {
900 $errormessage = $Lang::tr
{'invalid input for keepalive 2'};
904 if ($cgiparams{'KEEPALIVE_2'} < ($cgiparams{'KEEPALIVE_1'} * 2)){
905 $errormessage = $Lang::tr
{'invalid input for keepalive 1:2'};
908 &General
::writehash
("${General::swroot}/ovpn/settings", \
%vpnsettings);
909 &writeserverconf
();#hier ok
916 if ($cgiparams{'ACTION'} eq $Lang::tr
{'save'} && $cgiparams{'TYPE'} eq 'net' && $cgiparams{'SIDE'} eq 'server')
919 my @remsubnet = split(/\//,$cgiparams{'REMOTE_SUBNET'});
920 my @ovsubnettemp = split(/\./,$cgiparams{'OVPN_SUBNET'});
921 my $ovsubnet = "$ovsubnettemp[0].$ovsubnettemp[1].$ovsubnettemp[2]";
924 unless(-d
"${General::swroot}/ovpn/n2nconf/"){mkdir "${General::swroot}/ovpn/n2nconf", 0755 or die "Unable to create dir $!";}
925 unless(-d
"${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}", 0770 or die "Unable to create dir $!";}
927 open(SERVERCONF
, ">${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Unable to open ${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf: $!";
930 print SERVERCONF
"# IPFire n2n Open VPN Server Config by ummeegge und m.a.d\n";
931 print SERVERCONF
"\n";
932 print SERVERCONF
"# User Security\n";
933 print SERVERCONF
"user nobody\n";
934 print SERVERCONF
"group nobody\n";
935 print SERVERCONF
"persist-tun\n";
936 print SERVERCONF
"persist-key\n";
937 print SERVERCONF
"script-security 2\n";
938 print SERVERCONF
"# IP/DNS for remote Server Gateway\n";
940 if ($cgiparams{'REMOTE'} ne '') {
941 print SERVERCONF
"remote $cgiparams{'REMOTE'}\n";
944 print SERVERCONF
"float\n";
945 print SERVERCONF
"# IP adresses of the VPN Subnet\n";
946 print SERVERCONF
"ifconfig $ovsubnet.1 $ovsubnet.2\n";
947 print SERVERCONF
"# Client Gateway Network\n";
948 print SERVERCONF
"route $remsubnet[0] $remsubnet[1]\n";
949 print SERVERCONF
"up \"/etc/init.d/static-routes start\"\n";
950 print SERVERCONF
"# tun Device\n";
951 print SERVERCONF
"dev tun\n";
952 print SERVERCONF
"#Logfile for statistics\n";
953 print SERVERCONF
"status-version 1\n";
954 print SERVERCONF
"status /var/run/openvpn/$cgiparams{'NAME'}-n2n 10\n";
955 print SERVERCONF
"# Port and Protokol\n";
956 print SERVERCONF
"port $cgiparams{'DEST_PORT'}\n";
958 if ($cgiparams{'PROTOCOL'} eq 'tcp') {
959 print SERVERCONF
"proto tcp-server\n";
960 print SERVERCONF
"# Packet size\n";
961 if ($cgiparams{'MTU'} eq '') {$tunmtu = '1400'} else {$tunmtu = $cgiparams{'MTU'}};
962 print SERVERCONF
"tun-mtu $tunmtu\n";
965 if ($cgiparams{'PROTOCOL'} eq 'udp') {
966 print SERVERCONF
"proto udp\n";
967 print SERVERCONF
"# Paketsize\n";
968 if ($cgiparams{'MTU'} eq '') {$tunmtu = '1500'} else {$tunmtu = $cgiparams{'MTU'}};
969 print SERVERCONF
"tun-mtu $tunmtu\n";
970 if ($cgiparams{'FRAGMENT'} ne '') {print SERVERCONF
"fragment $cgiparams{'FRAGMENT'}\n";}
971 if ($cgiparams{'MSSFIX'} eq 'on') {print SERVERCONF
"mssfix\n"; };
974 print SERVERCONF
"# Auth. Server\n";
975 print SERVERCONF
"tls-server\n";
976 print SERVERCONF
"ca ${General::swroot}/ovpn/ca/cacert.pem\n";
977 print SERVERCONF
"cert ${General::swroot}/ovpn/certs/servercert.pem\n";
978 print SERVERCONF
"key ${General::swroot}/ovpn/certs/serverkey.pem\n";
979 print SERVERCONF
"dh ${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}\n";
980 print SERVERCONF
"# Cipher\n";
981 print SERVERCONF
"cipher $cgiparams{'DCIPHER'}\n";
983 # If GCM cipher is used, do not use --auth
984 if (($cgiparams{'DCIPHER'} eq 'AES-256-GCM') ||
985 ($cgiparams{'DCIPHER'} eq 'AES-192-GCM') ||
986 ($cgiparams{'DCIPHER'} eq 'AES-128-GCM')) {
987 print SERVERCONF
unless "# HMAC algorithm\n";
988 print SERVERCONF
unless "auth $cgiparams{'DAUTH'}\n";
990 print SERVERCONF
"# HMAC algorithm\n";
991 print SERVERCONF
"auth $cgiparams{'DAUTH'}\n";
994 if ($cgiparams{'COMPLZO'} eq 'on') {
995 print SERVERCONF
"# Enable Compression\n";
996 print SERVERCONF
"comp-lzo\n";
998 print SERVERCONF
"# Debug Level\n";
999 print SERVERCONF
"verb 3\n";
1000 print SERVERCONF
"# Tunnel check\n";
1001 print SERVERCONF
"keepalive 10 60\n";
1002 print SERVERCONF
"# Start as daemon\n";
1003 print SERVERCONF
"daemon $cgiparams{'NAME'}n2n\n";
1004 print SERVERCONF
"writepid /var/run/$cgiparams{'NAME'}n2n.pid\n";
1005 print SERVERCONF
"# Activate Management Interface and Port\n";
1006 if ($cgiparams{'OVPN_MGMT'} eq '') {print SERVERCONF
"management localhost $cgiparams{'DEST_PORT'}\n"}
1007 else {print SERVERCONF
"management localhost $cgiparams{'OVPN_MGMT'}\n"};
1016 if ($cgiparams{'ACTION'} eq $Lang::tr
{'save'} && $cgiparams{'TYPE'} eq 'net' && $cgiparams{'SIDE'} eq 'client')
1019 my @ovsubnettemp = split(/\./,$cgiparams{'OVPN_SUBNET'});
1020 my $ovsubnet = "$ovsubnettemp[0].$ovsubnettemp[1].$ovsubnettemp[2]";
1021 my @remsubnet = split(/\//,$cgiparams{'REMOTE_SUBNET'});
1024 unless(-d
"${General::swroot}/ovpn/n2nconf/"){mkdir "${General::swroot}/ovpn/n2nconf", 0755 or die "Unable to create dir $!";}
1025 unless(-d
"${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}"){mkdir "${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}", 0770 or die "Unable to create dir $!";}
1027 open(CLIENTCONF
, ">${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf") or die "Unable to open ${General::swroot}/ovpn/n2nconf/$cgiparams{'NAME'}/$cgiparams{'NAME'}.conf: $!";
1029 flock CLIENTCONF
, 2;
1030 print CLIENTCONF
"# IPFire rewritten n2n Open VPN Client Config by ummeegge und m.a.d\n";
1031 print CLIENTCONF
"#\n";
1032 print CLIENTCONF
"# User Security\n";
1033 print CLIENTCONF
"user nobody\n";
1034 print CLIENTCONF
"group nobody\n";
1035 print CLIENTCONF
"persist-tun\n";
1036 print CLIENTCONF
"persist-key\n";
1037 print CLIENTCONF
"script-security 2\n";
1038 print CLIENTCONF
"# IP/DNS for remote Server Gateway\n";
1039 print CLIENTCONF
"remote $cgiparams{'REMOTE'}\n";
1040 print CLIENTCONF
"float\n";
1041 print CLIENTCONF
"# IP adresses of the VPN Subnet\n";
1042 print CLIENTCONF
"ifconfig $ovsubnet.2 $ovsubnet.1\n";
1043 print CLIENTCONF
"# Server Gateway Network\n";
1044 print CLIENTCONF
"route $remsubnet[0] $remsubnet[1]\n";
1045 print CLIENTCONF
"up \"/etc/init.d/static-routes start\"\n";
1046 print CLIENTCONF
"# tun Device\n";
1047 print CLIENTCONF
"dev tun\n";
1048 print CLIENTCONF
"#Logfile for statistics\n";
1049 print CLIENTCONF
"status-version 1\n";
1050 print CLIENTCONF
"status /var/run/openvpn/$cgiparams{'NAME'}-n2n 10\n";
1051 print CLIENTCONF
"# Port and Protokol\n";
1052 print CLIENTCONF
"port $cgiparams{'DEST_PORT'}\n";
1054 if ($cgiparams{'PROTOCOL'} eq 'tcp') {
1055 print CLIENTCONF
"proto tcp-client\n";
1056 print CLIENTCONF
"# Packet size\n";
1057 if ($cgiparams{'MTU'} eq '') {$tunmtu = '1400'} else {$tunmtu = $cgiparams{'MTU'}};
1058 print CLIENTCONF
"tun-mtu $tunmtu\n";
1061 if ($cgiparams{'PROTOCOL'} eq 'udp') {
1062 print CLIENTCONF
"proto udp\n";
1063 print CLIENTCONF
"# Paketsize\n";
1064 if ($cgiparams{'MTU'} eq '') {$tunmtu = '1500'} else {$tunmtu = $cgiparams{'MTU'}};
1065 print CLIENTCONF
"tun-mtu $tunmtu\n";
1066 if ($cgiparams{'FRAGMENT'} ne '') {print CLIENTCONF
"fragment $cgiparams{'FRAGMENT'}\n";}
1067 if ($cgiparams{'MSSFIX'} eq 'on') {print CLIENTCONF
"mssfix\n"; };
1070 # Check host certificate if X509 is RFC3280 compliant.
1071 # If not, old --ns-cert-type directive will be used.
1072 # If appropriate key usage extension exists, new --remote-cert-tls directive will be used.
1073 my $hostcert = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
1074 if ($hostcert !~ /TLS Web Server Authentication/) {
1075 print CLIENTCONF
"ns-cert-type server\n";
1077 print CLIENTCONF
"remote-cert-tls server\n";
1079 print CLIENTCONF
"# Auth. Client\n";
1080 print CLIENTCONF
"tls-client\n";
1081 print CLIENTCONF
"# Cipher\n";
1082 print CLIENTCONF
"cipher $cgiparams{'DCIPHER'}\n";
1083 print CLIENTCONF
"pkcs12 ${General::swroot}/ovpn/certs/$cgiparams{'NAME'}.p12\r\n";
1085 # If GCM cipher is used, do not use --auth
1086 if (($cgiparams{'DCIPHER'} eq 'AES-256-GCM') ||
1087 ($cgiparams{'DCIPHER'} eq 'AES-192-GCM') ||
1088 ($cgiparams{'DCIPHER'} eq 'AES-128-GCM')) {
1089 print CLIENTCONF
unless "# HMAC algorithm\n";
1090 print CLIENTCONF
unless "auth $cgiparams{'DAUTH'}\n";
1092 print CLIENTCONF
"# HMAC algorithm\n";
1093 print CLIENTCONF
"auth $cgiparams{'DAUTH'}\n";
1096 if ($cgiparams{'COMPLZO'} eq 'on') {
1097 print CLIENTCONF
"# Enable Compression\n";
1098 print CLIENTCONF
"comp-lzo\n";
1100 print CLIENTCONF
"# Debug Level\n";
1101 print CLIENTCONF
"verb 3\n";
1102 print CLIENTCONF
"# Tunnel check\n";
1103 print CLIENTCONF
"keepalive 10 60\n";
1104 print CLIENTCONF
"# Start as daemon\n";
1105 print CLIENTCONF
"daemon $cgiparams{'NAME'}n2n\n";
1106 print CLIENTCONF
"writepid /var/run/$cgiparams{'NAME'}n2n.pid\n";
1107 print CLIENTCONF
"# Activate Management Interface and Port\n";
1108 if ($cgiparams{'OVPN_MGMT'} eq '') {print CLIENTCONF
"management localhost $cgiparams{'DEST_PORT'}\n"}
1109 else {print CLIENTCONF
"management localhost $cgiparams{'OVPN_MGMT'}\n"};
1115 ### Save main settings
1118 if ($cgiparams{'ACTION'} eq $Lang::tr
{'save'} && $cgiparams{'TYPE'} eq '' && $cgiparams{'KEY'} eq '') {
1119 &General
::readhash
("${General::swroot}/ovpn/settings", \
%vpnsettings);
1120 #DAN do we really need (to to check) this value? Besides if we listen on blue and orange too,
1121 #DAN this value has to leave.
1122 if ($cgiparams{'ENABLED'} eq 'on'){
1123 unless (&General
::validfqdn
($cgiparams{'VPN_IP'}) || &General
::validip
($cgiparams{'VPN_IP'})) {
1124 $errormessage = $Lang::tr
{'invalid input for hostname'};
1125 goto SETTINGS_ERROR
;
1129 if (! &General
::validipandmask
($cgiparams{'DOVPN_SUBNET'})) {
1130 $errormessage = $Lang::tr
{'ovpn subnet is invalid'};
1131 goto SETTINGS_ERROR
;
1133 my @tmpovpnsubnet = split("\/",$cgiparams{'DOVPN_SUBNET'});
1135 if (&General
::IpInSubnet
( $netsettings{'RED_ADDRESS'},
1136 $tmpovpnsubnet[0], $tmpovpnsubnet[1])) {
1137 $errormessage = "$Lang::tr{'ovpn subnet overlap'} IPFire RED Network $netsettings{'RED_ADDRESS'}";
1138 goto SETTINGS_ERROR
;
1141 if (&General
::IpInSubnet
( $netsettings{'GREEN_ADDRESS'},
1142 $tmpovpnsubnet[0], $tmpovpnsubnet[1])) {
1143 $errormessage = "$Lang::tr{'ovpn subnet overlap'} IPFire Green Network $netsettings{'GREEN_ADDRESS'}";
1144 goto SETTINGS_ERROR
;
1147 if (&General
::IpInSubnet
( $netsettings{'BLUE_ADDRESS'},
1148 $tmpovpnsubnet[0], $tmpovpnsubnet[1])) {
1149 $errormessage = "$Lang::tr{'ovpn subnet overlap'} IPFire Blue Network $netsettings{'BLUE_ADDRESS'}";
1150 goto SETTINGS_ERROR
;
1153 if (&General
::IpInSubnet
( $netsettings{'ORANGE_ADDRESS'},
1154 $tmpovpnsubnet[0], $tmpovpnsubnet[1])) {
1155 $errormessage = "$Lang::tr{'ovpn subnet overlap'} IPFire Orange Network $netsettings{'ORANGE_ADDRESS'}";
1156 goto SETTINGS_ERROR
;
1158 open(ALIASES
, "${General::swroot}/ethernet/aliases") or die 'Unable to open aliases file.';
1162 my @tempalias = split(/\,/,$_);
1163 if ($tempalias[1] eq 'on') {
1164 if (&General
::IpInSubnet
($tempalias[0] ,
1165 $tmpovpnsubnet[0], $tmpovpnsubnet[1])) {
1166 $errormessage = "$Lang::tr{'ovpn subnet overlap'} IPFire alias entry $tempalias[0]";
1171 if ($errormessage ne ''){
1172 goto SETTINGS_ERROR
;
1174 if ($cgiparams{'ENABLED'} !~ /^(on|off)$/) {
1175 $errormessage = $Lang::tr
{'invalid input'};
1176 goto SETTINGS_ERROR
;
1178 if ((length($cgiparams{'DMTU'})==0) || (($cgiparams{'DMTU'}) < 1000 )) {
1179 $errormessage = $Lang::tr
{'invalid mtu input'};
1180 goto SETTINGS_ERROR
;
1183 unless (&General
::validport
($cgiparams{'DDEST_PORT'})) {
1184 $errormessage = $Lang::tr
{'invalid port'};
1185 goto SETTINGS_ERROR
;
1188 # Create ta.key for tls-auth if not presant
1189 if ($cgiparams{'TLSAUTH'} eq 'on') {
1190 if ( ! -e
"${General::swroot}/ovpn/certs/ta.key") {
1191 system('/usr/sbin/openvpn', '--genkey', '--secret', "${General::swroot}/ovpn/certs/ta.key");
1193 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1194 goto SETTINGS_ERROR
;
1199 $vpnsettings{'ENABLED_BLUE'} = $cgiparams{'ENABLED_BLUE'};
1200 $vpnsettings{'ENABLED_ORANGE'} =$cgiparams{'ENABLED_ORANGE'};
1201 $vpnsettings{'ENABLED'} = $cgiparams{'ENABLED'};
1202 $vpnsettings{'VPN_IP'} = $cgiparams{'VPN_IP'};
1203 #new settings for daemon
1204 $vpnsettings{'DOVPN_SUBNET'} = $cgiparams{'DOVPN_SUBNET'};
1205 $vpnsettings{'DPROTOCOL'} = $cgiparams{'DPROTOCOL'};
1206 $vpnsettings{'DDEST_PORT'} = $cgiparams{'DDEST_PORT'};
1207 $vpnsettings{'DMTU'} = $cgiparams{'DMTU'};
1208 $vpnsettings{'DCOMPLZO'} = $cgiparams{'DCOMPLZO'};
1209 $vpnsettings{'DCIPHER'} = $cgiparams{'DCIPHER'};
1210 $vpnsettings{'DAUTH'} = $cgiparams{'DAUTH'};
1211 $vpnsettings{'TLSAUTH'} = $cgiparams{'TLSAUTH'};
1214 if ( $vpnsettings{'ENABLED_BLUE'} eq 'on' ) {system("touch ${General::swroot}/ovpn/enable_blue 2>/dev/null");}else{system("unlink ${General::swroot}/ovpn/enable_blue 2>/dev/null");}
1215 if ( $vpnsettings{'ENABLED_ORANGE'} eq 'on' ) {system("touch ${General::swroot}/ovpn/enable_orange 2>/dev/null");}else{system("unlink ${General::swroot}/ovpn/enable_orange 2>/dev/null");}
1216 if ( $vpnsettings{'ENABLED'} eq 'on' ) {system("touch ${General::swroot}/ovpn/enable 2>/dev/null");}else{system("unlink ${General::swroot}/ovpn/enable 2>/dev/null");}
1217 #new settings for daemon
1218 &General
::writehash
("${General::swroot}/ovpn/settings", \
%vpnsettings);
1219 &writeserverconf
();#hier ok
1222 ### Reset all step 2
1224 }elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'remove x509'} && $cgiparams{'AREUSURE'} eq 'yes') {
1226 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
1228 # Kill all N2N connections
1229 system("/usr/local/bin/openvpnctrl -kn2n &>/dev/null");
1231 foreach my $key (keys %confighash) {
1232 my $name = $confighash{$cgiparams{'$key'}}[1];
1234 if ($confighash{$key}[4] eq 'cert') {
1235 delete $confighash{$cgiparams{'$key'}};
1238 system ("/usr/local/bin/openvpnctrl -drrd $name &>/dev/null");
1240 while ($file = glob("${General::swroot}/ovpn/ca/*")) {
1243 while ($file = glob("${General::swroot}/ovpn/certs/*")) {
1246 while ($file = glob("${General::swroot}/ovpn/crls/*")) {
1249 &cleanssldatabase
();
1250 if (open(FILE
, ">${General::swroot}/ovpn/caconfig")) {
1254 if (open(FILE
, ">${General::swroot}/ovpn/ccdroute")) {
1258 if (open(FILE
, ">${General::swroot}/ovpn/ccdroute2")) {
1262 while ($file = glob("${General::swroot}/ovpn/ccd/*")) {
1265 while ($file = glob("${General::swroot}/ovpn/ccd/*")) {
1268 if (open(FILE
, ">${General::swroot}/ovpn/ovpn-leases.db")) {
1272 if (open(FILE
, ">${General::swroot}/ovpn/ovpnconfig")) {
1276 while ($file = glob("${General::swroot}/ovpn/n2nconf/*")) {
1277 system ("rm -rf $file");
1280 # Remove everything from the collectd configuration
1281 &writecollectdconf
();
1283 #&writeserverconf();
1285 ### Reset all step 1
1287 }elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'remove x509'}) {
1288 &Header
::showhttpheaders
();
1289 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
1290 &Header
::openbigbox
('100%', 'left', '', '');
1291 &Header
::openbox
('100%', 'left', $Lang::tr
{'are you sure'});
1293 <form method='post'>
1294 <table width='100%'>
1297 <input type='hidden' name='AREUSURE' value='yes' />
1298 <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}</font></b>:
1299 $Lang::tr{'resetting the vpn configuration will remove the root ca, the host certificate and all certificate based connections'}</td>
1302 <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'remove x509'}' />
1303 <input type='submit' name='ACTION' value='$Lang::tr{'cancel'}' /></td>
1309 &Header
::closebox
();
1310 &Header
::closebigbox
();
1311 &Header
::closepage
();
1315 ### Generate DH key step 2
1317 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'generate dh key'} && $cgiparams{'AREUSURE'} eq 'yes') {
1318 # Delete if old key exists
1319 if (-f
"${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}") {
1320 unlink "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}";
1322 # Create Diffie Hellmann Parameter
1323 system('/usr/bin/openssl', 'dhparam', '-out', "${General::swroot}/ovpn/ca/dh1024.pem", "$cgiparams{'DHLENGHT'}");
1325 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1326 unlink ("${General::swroot}/ovpn/ca/dh1024.pem");
1330 ### Generate DH key step 1
1332 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'generate dh key'}) {
1333 &Header
::showhttpheaders
();
1334 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
1335 &Header
::openbigbox
('100%', 'LEFT', '', '');
1336 &Header
::openbox
('100%', 'LEFT', "$Lang::tr{'gen dh'}:");
1338 <table width='100%'>
1340 <td width='20%'> </td> <td width='15%'></td> <td width='65%'></td>
1343 <td class='base'>$Lang::tr{'ovpn dh'}:</td>
1345 <form method='post'><input type='hidden' name='AREUSURE' value='yes' />
1346 <input type='hidden' name='KEY' value='$cgiparams{'KEY'}' />
1347 <select name='DHLENGHT'>
1348 <option value='2048' $selected{'DHLENGHT'}{'2048'}>2048 $Lang::tr{'bit'}</option>
1349 <option value='3072' $selected{'DHLENGHT'}{'3072'}>3072 $Lang::tr{'bit'}</option>
1350 <option value='4096' $selected{'DHLENGHT'}{'4096'}>4096 $Lang::tr{'bit'}</option>
1354 <tr><td colspan='4'><br></td></tr>
1356 <table width='100%'>
1358 <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}: </font></b>$Lang::tr{'dh key warn'}
1361 <td class='base'>$Lang::tr{'dh key warn1'}</td>
1363 <tr><td colspan='2'><br></td></tr>
1365 <td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'generate dh key'}' /></td>
1372 &Header
::closebox
();
1373 print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
1374 &Header
::closebigbox
();
1375 &Header
::closepage
();
1381 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'upload dh key'}) {
1382 unless (ref ($cgiparams{'FH'})) {
1383 $errormessage = $Lang::tr
{'there was no file upload'};
1384 goto UPLOADCA_ERROR
;
1386 # Move uploaded dh key to a temporary file
1387 (my $fh, my $filename) = tempfile
( );
1388 if (copy
($cgiparams{'FH'}, $fh) != 1) {
1390 goto UPLOADCA_ERROR
;
1392 my $temp = `/usr/bin/openssl dhparam -text -in $filename`;
1393 if ($temp !~ /DH Parameters: \((2048|3072|4096) bit\)/) {
1394 $errormessage = $Lang::tr
{'not a valid dh key'};
1396 goto UPLOADCA_ERROR
;
1398 # Delete if old key exists
1399 if (-f
"${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}") {
1400 unlink "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}";
1402 move
($filename, "${General::swroot}/ovpn/ca/$cgiparams{'DH_NAME'}");
1404 $errormessage = "$Lang::tr{'dh key move failed'}: $!";
1406 goto UPLOADCA_ERROR
;
1411 ### Upload CA Certificate
1413 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'upload ca certificate'}) {
1414 &General
::readhasharray
("${General::swroot}/ovpn/caconfig", \
%cahash);
1416 if ($cgiparams{'CA_NAME'} !~ /^[a-zA-Z0-9]+$/) {
1417 $errormessage = $Lang::tr
{'name must only contain characters'};
1418 goto UPLOADCA_ERROR
;
1421 if (length($cgiparams{'CA_NAME'}) >60) {
1422 $errormessage = $Lang::tr
{'name too long'};
1426 if ($cgiparams{'CA_NAME'} eq 'ca') {
1427 $errormessage = $Lang::tr
{'name is invalid'};
1428 goto UPLOADCA_ERROR
;
1431 # Check if there is no other entry with this name
1432 foreach my $key (keys %cahash) {
1433 if ($cahash{$key}[0] eq $cgiparams{'CA_NAME'}) {
1434 $errormessage = $Lang::tr
{'a ca certificate with this name already exists'};
1435 goto UPLOADCA_ERROR
;
1439 unless (ref ($cgiparams{'FH'})) {
1440 $errormessage = $Lang::tr
{'there was no file upload'};
1441 goto UPLOADCA_ERROR
;
1443 # Move uploaded ca to a temporary file
1444 (my $fh, my $filename) = tempfile
( );
1445 if (copy
($cgiparams{'FH'}, $fh) != 1) {
1447 goto UPLOADCA_ERROR
;
1449 my $temp = `/usr/bin/openssl x509 -text -in $filename`;
1450 if ($temp !~ /CA:TRUE/i) {
1451 $errormessage = $Lang::tr
{'not a valid ca certificate'};
1453 goto UPLOADCA_ERROR
;
1455 move
($filename, "${General::swroot}/ovpn/ca/$cgiparams{'CA_NAME'}cert.pem");
1457 $errormessage = "$Lang::tr{'certificate file move failed'}: $!";
1459 goto UPLOADCA_ERROR
;
1463 my $casubject = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/$cgiparams{'CA_NAME'}cert.pem`;
1464 $casubject =~ /Subject: (.*)[\n]/;
1466 $casubject =~ s
+/Email
+, E
+;
1467 $casubject =~ s/ ST=/ S=/;
1468 $casubject = &Header
::cleanhtml
($casubject);
1470 my $key = &General
::findhasharraykey
(\
%cahash);
1471 $cahash{$key}[0] = $cgiparams{'CA_NAME'};
1472 $cahash{$key}[1] = $casubject;
1473 &General
::writehasharray
("${General::swroot}/ovpn/caconfig", \
%cahash);
1474 # system('/usr/local/bin/ipsecctrl', 'R');
1479 ### Display ca certificate
1481 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'show ca certificate'}) {
1482 &General
::readhasharray
("${General::swroot}/ovpn/caconfig", \
%cahash);
1484 if ( -f
"${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem") {
1485 &Header
::showhttpheaders
();
1486 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
1487 &Header
::openbigbox
('100%', 'LEFT', '', $errormessage);
1488 &Header
::openbox
('100%', 'LEFT', "$Lang::tr{'ca certificate'}:");
1489 my $output = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem`;
1490 $output = &Header
::cleanhtml
($output,"y");
1491 print "<pre>$output</pre>\n";
1492 &Header
::closebox
();
1493 print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
1494 &Header
::closebigbox
();
1495 &Header
::closepage
();
1498 $errormessage = $Lang::tr
{'invalid key'};
1502 ### Download ca certificate
1504 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'download ca certificate'}) {
1505 &General
::readhasharray
("${General::swroot}/ovpn/caconfig", \
%cahash);
1507 if ( -f
"${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem" ) {
1508 print "Content-Type: application/octet-stream\r\n";
1509 print "Content-Disposition: filename=$cahash{$cgiparams{'KEY'}}[0]cert.pem\r\n\r\n";
1510 print `/usr/bin/openssl x509 -in ${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem`;
1513 $errormessage = $Lang::tr
{'invalid key'};
1517 ### Remove ca certificate (step 2)
1519 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'remove ca certificate'} && $cgiparams{'AREUSURE'} eq 'yes') {
1520 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
1521 &General
::readhasharray
("${General::swroot}/ovpn/caconfig", \
%cahash);
1523 if ( -f
"${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem" ) {
1524 foreach my $key (keys %confighash) {
1525 my $test = `/usr/bin/openssl verify -CAfile ${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem ${General::swroot}/ovpn/certs/$confighash{$key}[1]cert.pem`;
1526 if ($test =~ /: OK/) {
1528 # if ($vpnsettings{'ENABLED'} eq 'on' ||
1529 # $vpnsettings{'ENABLED_BLUE'} eq 'on') {
1530 # system('/usr/local/bin/ipsecctrl', 'D', $key);
1532 unlink ("${General::swroot}/ovpn//certs/$confighash{$key}[1]cert.pem");
1533 unlink ("${General::swroot}/ovpn/certs/$confighash{$key}[1].p12");
1534 delete $confighash{$key};
1535 &General
::writehasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
1536 # &writeipsecfiles();
1539 unlink ("${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem");
1540 delete $cahash{$cgiparams{'KEY'}};
1541 &General
::writehasharray
("${General::swroot}/ovpn/caconfig", \
%cahash);
1542 # system('/usr/local/bin/ipsecctrl', 'R');
1544 $errormessage = $Lang::tr
{'invalid key'};
1547 ### Remove ca certificate (step 1)
1549 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'remove ca certificate'}) {
1550 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
1551 &General
::readhasharray
("${General::swroot}/ovpn/caconfig", \
%cahash);
1553 my $assignedcerts = 0;
1554 if ( -f
"${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem" ) {
1555 foreach my $key (keys %confighash) {
1556 my $test = `/usr/bin/openssl verify -CAfile ${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem ${General::swroot}/ovpn/certs/$confighash{$key}[1]cert.pem`;
1557 if ($test =~ /: OK/) {
1561 if ($assignedcerts) {
1562 &Header
::showhttpheaders
();
1563 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
1564 &Header
::openbigbox
('100%', 'LEFT', '', $errormessage);
1565 &Header
::openbox
('100%', 'LEFT', $Lang::tr
{'are you sure'});
1567 <table><form method='post'><input type='hidden' name='AREUSURE' value='yes' />
1568 <input type='hidden' name='KEY' value='$cgiparams{'KEY'}' />
1569 <tr><td align='center'>
1570 <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}</font></b>: $assignedcerts
1571 $Lang::tr{'connections are associated with this ca. deleting the ca will delete these connections as well.'}
1572 <tr><td align='center'><input type='submit' name='ACTION' value='$Lang::tr{'remove ca certificate'}' />
1573 <input type='submit' name='ACTION' value='$Lang::tr{'cancel'}' /></td></tr>
1577 &Header
::closebox
();
1578 &Header
::closebigbox
();
1579 &Header
::closepage
();
1582 unlink ("${General::swroot}/ovpn/ca/$cahash{$cgiparams{'KEY'}}[0]cert.pem");
1583 delete $cahash{$cgiparams{'KEY'}};
1584 &General
::writehasharray
("${General::swroot}/ovpn/caconfig", \
%cahash);
1585 # system('/usr/local/bin/ipsecctrl', 'R');
1588 $errormessage = $Lang::tr
{'invalid key'};
1592 ### Display root certificate
1594 }elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'show root certificate'} ||
1595 $cgiparams{'ACTION'} eq $Lang::tr
{'show host certificate'}) {
1597 &Header
::showhttpheaders
();
1598 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
1599 &Header
::openbigbox
('100%', 'LEFT', '', '');
1600 if ($cgiparams{'ACTION'} eq $Lang::tr
{'show root certificate'}) {
1601 &Header
::openbox
('100%', 'LEFT', "$Lang::tr{'root certificate'}:");
1602 $output = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/ca/cacert.pem`;
1604 &Header
::openbox
('100%', 'LEFT', "$Lang::tr{'host certificate'}:");
1605 $output = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
1607 $output = &Header
::cleanhtml
($output,"y");
1608 print "<pre>$output</pre>\n";
1609 &Header
::closebox
();
1610 print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
1611 &Header
::closebigbox
();
1612 &Header
::closepage
();
1616 ### Download root certificate
1618 }elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'download root certificate'}) {
1619 if ( -f
"${General::swroot}/ovpn/ca/cacert.pem" ) {
1620 print "Content-Type: application/octet-stream\r\n";
1621 print "Content-Disposition: filename=cacert.pem\r\n\r\n";
1622 print `/usr/bin/openssl x509 -in ${General::swroot}/ovpn/ca/cacert.pem`;
1627 ### Download host certificate
1629 }elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'download host certificate'}) {
1630 if ( -f
"${General::swroot}/ovpn/certs/servercert.pem" ) {
1631 print "Content-Type: application/octet-stream\r\n";
1632 print "Content-Disposition: filename=servercert.pem\r\n\r\n";
1633 print `/usr/bin/openssl x509 -in ${General::swroot}/ovpn/certs/servercert.pem`;
1638 ### Download tls-auth key
1640 }elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'download tls-auth key'}) {
1641 if ( -f
"${General::swroot}/ovpn/certs/ta.key" ) {
1642 print "Content-Type: application/octet-stream\r\n";
1643 print "Content-Disposition: filename=ta.key\r\n\r\n";
1644 print `/bin/cat ${General::swroot}/ovpn/certs/ta.key`;
1649 ### Form for generating a root certificate
1651 }elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'generate root/host certificates'} ||
1652 $cgiparams{'ACTION'} eq $Lang::tr
{'upload p12 file'}) {
1654 &General
::readhash
("${General::swroot}/ovpn/settings", \
%vpnsettings);
1655 if (-f
"${General::swroot}/ovpn/ca/cacert.pem") {
1656 $errormessage = $Lang::tr
{'valid root certificate already exists'};
1657 $cgiparams{'ACTION'} = '';
1658 goto ROOTCERT_ERROR
;
1661 if (($cgiparams{'ROOTCERT_HOSTNAME'} eq '') && -e
"${General::swroot}/red/active") {
1662 if (open(IPADDR
, "${General::swroot}/red/local-ipaddress")) {
1663 my $ipaddr = <IPADDR
>;
1666 $cgiparams{'ROOTCERT_HOSTNAME'} = (gethostbyaddr(pack("C4", split(/\./, $ipaddr)), 2))[0];
1667 if ($cgiparams{'ROOTCERT_HOSTNAME'} eq '') {
1668 $cgiparams{'ROOTCERT_HOSTNAME'} = $ipaddr;
1671 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'upload p12 file'}) {
1672 unless (ref ($cgiparams{'FH'})) {
1673 $errormessage = $Lang::tr
{'there was no file upload'};
1674 goto ROOTCERT_ERROR
;
1677 # Move uploaded certificate request to a temporary file
1678 (my $fh, my $filename) = tempfile
( );
1679 if (copy
($cgiparams{'FH'}, $fh) != 1) {
1681 goto ROOTCERT_ERROR
;
1684 # Create a temporary dirctory
1685 my $tempdir = tempdir
( CLEANUP
=> 1 );
1687 # Extract the CA certificate from the file
1688 my $pid = open(OPENSSL
, "|-");
1689 $SIG{ALRM
} = sub { $errormessage = $Lang::tr
{'broken pipe'}; goto ROOTCERT_ERROR
;};
1690 if ($pid) { # parent
1691 if ($cgiparams{'P12_PASS'} ne '') {
1692 print OPENSSL
"$cgiparams{'P12_PASS'}\n";
1696 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1698 goto ROOTCERT_ERROR
;
1701 unless (exec ('/usr/bin/openssl', 'pkcs12', '-cacerts', '-nokeys',
1703 '-out', "$tempdir/cacert.pem")) {
1704 $errormessage = "$Lang::tr{'cant start openssl'}: $!";
1706 goto ROOTCERT_ERROR
;
1710 # Extract the Host certificate from the file
1711 $pid = open(OPENSSL
, "|-");
1712 $SIG{ALRM
} = sub { $errormessage = $Lang::tr
{'broken pipe'}; goto ROOTCERT_ERROR
;};
1713 if ($pid) { # parent
1714 if ($cgiparams{'P12_PASS'} ne '') {
1715 print OPENSSL
"$cgiparams{'P12_PASS'}\n";
1719 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1721 goto ROOTCERT_ERROR
;
1724 unless (exec ('/usr/bin/openssl', 'pkcs12', '-clcerts', '-nokeys',
1726 '-out', "$tempdir/hostcert.pem")) {
1727 $errormessage = "$Lang::tr{'cant start openssl'}: $!";
1729 goto ROOTCERT_ERROR
;
1733 # Extract the Host key from the file
1734 $pid = open(OPENSSL
, "|-");
1735 $SIG{ALRM
} = sub { $errormessage = $Lang::tr
{'broken pipe'}; goto ROOTCERT_ERROR
;};
1736 if ($pid) { # parent
1737 if ($cgiparams{'P12_PASS'} ne '') {
1738 print OPENSSL
"$cgiparams{'P12_PASS'}\n";
1742 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1744 goto ROOTCERT_ERROR
;
1747 unless (exec ('/usr/bin/openssl', 'pkcs12', '-nocerts',
1750 '-out', "$tempdir/serverkey.pem")) {
1751 $errormessage = "$Lang::tr{'cant start openssl'}: $!";
1753 goto ROOTCERT_ERROR
;
1757 move
("$tempdir/cacert.pem", "${General::swroot}/ovpn/ca/cacert.pem");
1759 $errormessage = "$Lang::tr{'certificate file move failed'}: $!";
1761 unlink ("${General::swroot}/ovpn/ca/cacert.pem");
1762 unlink ("${General::swroot}/ovpn/certs/servercert.pem");
1763 unlink ("${General::swroot}/ovpn/certs/serverkey.pem");
1764 goto ROOTCERT_ERROR
;
1767 move
("$tempdir/hostcert.pem", "${General::swroot}/ovpn/certs/servercert.pem");
1769 $errormessage = "$Lang::tr{'certificate file move failed'}: $!";
1771 unlink ("${General::swroot}/ovpn/ca/cacert.pem");
1772 unlink ("${General::swroot}/ovpn/certs/servercert.pem");
1773 unlink ("${General::swroot}/ovpn/certs/serverkey.pem");
1774 goto ROOTCERT_ERROR
;
1777 move
("$tempdir/serverkey.pem", "${General::swroot}/ovpn/certs/serverkey.pem");
1779 $errormessage = "$Lang::tr{'certificate file move failed'}: $!";
1781 unlink ("${General::swroot}/ovpn/ca/cacert.pem");
1782 unlink ("${General::swroot}/ovpn/certs/servercert.pem");
1783 unlink ("${General::swroot}/ovpn/certs/serverkey.pem");
1784 goto ROOTCERT_ERROR
;
1787 goto ROOTCERT_SUCCESS
;
1789 } elsif ($cgiparams{'ROOTCERT_COUNTRY'} ne '') {
1791 # Validate input since the form was submitted
1792 if ($cgiparams{'ROOTCERT_ORGANIZATION'} eq ''){
1793 $errormessage = $Lang::tr
{'organization cant be empty'};
1794 goto ROOTCERT_ERROR
;
1796 if (length($cgiparams{'ROOTCERT_ORGANIZATION'}) >60) {
1797 $errormessage = $Lang::tr
{'organization too long'};
1798 goto ROOTCERT_ERROR
;
1800 if ($cgiparams{'ROOTCERT_ORGANIZATION'} !~ /^[a-zA-Z0-9 ,\.\-_]*$/) {
1801 $errormessage = $Lang::tr
{'invalid input for organization'};
1802 goto ROOTCERT_ERROR
;
1804 if ($cgiparams{'ROOTCERT_HOSTNAME'} eq ''){
1805 $errormessage = $Lang::tr
{'hostname cant be empty'};
1806 goto ROOTCERT_ERROR
;
1808 unless (&General
::validfqdn
($cgiparams{'ROOTCERT_HOSTNAME'}) || &General
::validip
($cgiparams{'ROOTCERT_HOSTNAME'})) {
1809 $errormessage = $Lang::tr
{'invalid input for hostname'};
1810 goto ROOTCERT_ERROR
;
1812 if ($cgiparams{'ROOTCERT_EMAIL'} ne '' && (! &General
::validemail
($cgiparams{'ROOTCERT_EMAIL'}))) {
1813 $errormessage = $Lang::tr
{'invalid input for e-mail address'};
1814 goto ROOTCERT_ERROR
;
1816 if (length($cgiparams{'ROOTCERT_EMAIL'}) > 40) {
1817 $errormessage = $Lang::tr
{'e-mail address too long'};
1818 goto ROOTCERT_ERROR
;
1820 if ($cgiparams{'ROOTCERT_OU'} ne '' && $cgiparams{'ROOTCERT_OU'} !~ /^[a-zA-Z0-9 ,\.\-_]*$/) {
1821 $errormessage = $Lang::tr
{'invalid input for department'};
1822 goto ROOTCERT_ERROR
;
1824 if ($cgiparams{'ROOTCERT_CITY'} ne '' && $cgiparams{'ROOTCERT_CITY'} !~ /^[a-zA-Z0-9 ,\.\-_]*$/) {
1825 $errormessage = $Lang::tr
{'invalid input for city'};
1826 goto ROOTCERT_ERROR
;
1828 if ($cgiparams{'ROOTCERT_STATE'} ne '' && $cgiparams{'ROOTCERT_STATE'} !~ /^[a-zA-Z0-9 ,\.\-_]*$/) {
1829 $errormessage = $Lang::tr
{'invalid input for state or province'};
1830 goto ROOTCERT_ERROR
;
1832 if ($cgiparams{'ROOTCERT_COUNTRY'} !~ /^[A-Z]*$/) {
1833 $errormessage = $Lang::tr
{'invalid input for country'};
1834 goto ROOTCERT_ERROR
;
1837 # Copy the cgisettings to vpnsettings and save the configfile
1838 $vpnsettings{'ROOTCERT_ORGANIZATION'} = $cgiparams{'ROOTCERT_ORGANIZATION'};
1839 $vpnsettings{'ROOTCERT_HOSTNAME'} = $cgiparams{'ROOTCERT_HOSTNAME'};
1840 $vpnsettings{'ROOTCERT_EMAIL'} = $cgiparams{'ROOTCERT_EMAIL'};
1841 $vpnsettings{'ROOTCERT_OU'} = $cgiparams{'ROOTCERT_OU'};
1842 $vpnsettings{'ROOTCERT_CITY'} = $cgiparams{'ROOTCERT_CITY'};
1843 $vpnsettings{'ROOTCERT_STATE'} = $cgiparams{'ROOTCERT_STATE'};
1844 $vpnsettings{'ROOTCERT_COUNTRY'} = $cgiparams{'ROOTCERT_COUNTRY'};
1845 &General
::writehash
("${General::swroot}/ovpn/settings", \
%vpnsettings);
1847 # Replace empty strings with a .
1848 (my $ou = $cgiparams{'ROOTCERT_OU'}) =~ s/^\s*$/\./;
1849 (my $city = $cgiparams{'ROOTCERT_CITY'}) =~ s/^\s*$/\./;
1850 (my $state = $cgiparams{'ROOTCERT_STATE'}) =~ s/^\s*$/\./;
1853 #system ('/bin/touch', "${General::swroot}/ovpn/gencanow");
1855 # Create the CA certificate
1856 my $pid = open(OPENSSL
, "|-");
1857 $SIG{ALRM
} = sub { $errormessage = $Lang::tr
{'broken pipe'}; goto ROOTCERT_ERROR
;};
1858 if ($pid) { # parent
1859 print OPENSSL
"$cgiparams{'ROOTCERT_COUNTRY'}\n";
1860 print OPENSSL
"$state\n";
1861 print OPENSSL
"$city\n";
1862 print OPENSSL
"$cgiparams{'ROOTCERT_ORGANIZATION'}\n";
1863 print OPENSSL
"$ou\n";
1864 print OPENSSL
"$cgiparams{'ROOTCERT_ORGANIZATION'} CA\n";
1865 print OPENSSL
"$cgiparams{'ROOTCERT_EMAIL'}\n";
1868 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1869 unlink ("${General::swroot}/ovpn/ca/cakey.pem");
1870 unlink ("${General::swroot}/ovpn/ca/cacert.pem");
1871 goto ROOTCERT_ERROR
;
1874 unless (exec ('/usr/bin/openssl', 'req', '-x509', '-nodes',
1875 '-days', '999999', '-newkey', 'rsa:4096', '-sha512',
1876 '-keyout', "${General::swroot}/ovpn/ca/cakey.pem",
1877 '-out', "${General::swroot}/ovpn/ca/cacert.pem",
1878 '-config',"${General::swroot}/ovpn/openssl/ovpn.cnf")) {
1879 $errormessage = "$Lang::tr{'cant start openssl'}: $!";
1880 goto ROOTCERT_ERROR
;
1884 # Create the Host certificate request
1885 $pid = open(OPENSSL
, "|-");
1886 $SIG{ALRM
} = sub { $errormessage = $Lang::tr
{'broken pipe'}; goto ROOTCERT_ERROR
;};
1887 if ($pid) { # parent
1888 print OPENSSL
"$cgiparams{'ROOTCERT_COUNTRY'}\n";
1889 print OPENSSL
"$state\n";
1890 print OPENSSL
"$city\n";
1891 print OPENSSL
"$cgiparams{'ROOTCERT_ORGANIZATION'}\n";
1892 print OPENSSL
"$ou\n";
1893 print OPENSSL
"$cgiparams{'ROOTCERT_HOSTNAME'}\n";
1894 print OPENSSL
"$cgiparams{'ROOTCERT_EMAIL'}\n";
1895 print OPENSSL
".\n";
1896 print OPENSSL
".\n";
1899 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1900 unlink ("${General::swroot}/ovpn/certs/serverkey.pem");
1901 unlink ("${General::swroot}/ovpn/certs/serverreq.pem");
1902 goto ROOTCERT_ERROR
;
1905 unless (exec ('/usr/bin/openssl', 'req', '-nodes',
1906 '-newkey', 'rsa:2048',
1907 '-keyout', "${General::swroot}/ovpn/certs/serverkey.pem",
1908 '-out', "${General::swroot}/ovpn/certs/serverreq.pem",
1909 '-extensions', 'server',
1910 '-config', "${General::swroot}/ovpn/openssl/ovpn.cnf" )) {
1911 $errormessage = "$Lang::tr{'cant start openssl'}: $!";
1912 unlink ("${General::swroot}/ovpn/certs/serverkey.pem");
1913 unlink ("${General::swroot}/ovpn/certs/serverreq.pem");
1914 unlink ("${General::swroot}/ovpn/ca/cakey.pem");
1915 unlink ("${General::swroot}/ovpn/ca/cacert.pem");
1916 goto ROOTCERT_ERROR
;
1920 # Sign the host certificate request
1921 system('/usr/bin/openssl', 'ca', '-days', '999999',
1922 '-batch', '-notext',
1923 '-in', "${General::swroot}/ovpn/certs/serverreq.pem",
1924 '-out', "${General::swroot}/ovpn/certs/servercert.pem",
1925 '-extensions', 'server',
1926 '-config', "${General::swroot}/ovpn/openssl/ovpn.cnf");
1928 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1929 unlink ("${General::swroot}/ovpn/ca/cakey.pem");
1930 unlink ("${General::swroot}/ovpn/ca/cacert.pem");
1931 unlink ("${General::swroot}/ovpn/serverkey.pem");
1932 unlink ("${General::swroot}/ovpn/certs/serverreq.pem");
1933 unlink ("${General::swroot}/ovpn/certs/servercert.pem");
1934 &newcleanssldatabase
();
1935 goto ROOTCERT_ERROR
;
1937 unlink ("${General::swroot}/ovpn/certs/serverreq.pem");
1938 &deletebackupcert
();
1941 # Create an empty CRL
1942 system('/usr/bin/openssl', 'ca', '-gencrl',
1943 '-out', "${General::swroot}/ovpn/crls/cacrl.pem",
1944 '-config', "${General::swroot}/ovpn/openssl/ovpn.cnf" );
1946 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1947 unlink ("${General::swroot}/ovpn/certs/serverkey.pem");
1948 unlink ("${General::swroot}/ovpn/certs/servercert.pem");
1949 unlink ("${General::swroot}/ovpn/ca/cacert.pem");
1950 unlink ("${General::swroot}/ovpn/crls/cacrl.pem");
1951 &cleanssldatabase
();
1952 goto ROOTCERT_ERROR
;
1954 # &cleanssldatabase();
1956 # Create ta.key for tls-auth
1957 system('/usr/sbin/openvpn', '--genkey', '--secret', "${General::swroot}/ovpn/certs/ta.key");
1959 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1960 &cleanssldatabase
();
1961 goto ROOTCERT_ERROR
;
1963 # Create Diffie Hellmann Parameter
1964 system('/usr/bin/openssl', 'dhparam', '-out', "${General::swroot}/ovpn/ca/dh1024.pem", "$cgiparams{'DHLENGHT'}");
1966 $errormessage = "$Lang::tr{'openssl produced an error'}: $?";
1967 unlink ("${General::swroot}/ovpn/certs/serverkey.pem");
1968 unlink ("${General::swroot}/ovpn/certs/servercert.pem");
1969 unlink ("${General::swroot}/ovpn/ca/cacert.pem");
1970 unlink ("${General::swroot}/ovpn/crls/cacrl.pem");
1971 unlink ("${General::swroot}/ovpn/ca/dh1024.pem");
1972 &cleanssldatabase
();
1973 goto ROOTCERT_ERROR
;
1975 # &cleanssldatabase();
1977 goto ROOTCERT_SUCCESS
;
1980 if ($cgiparams{'ACTION'} ne '') {
1981 &Header
::showhttpheaders
();
1982 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
1983 &Header
::openbigbox
('100%', 'LEFT', '', '');
1984 if ($errormessage) {
1985 &Header
::openbox
('100%', 'LEFT', $Lang::tr
{'error messages'});
1986 print "<class name='base'>$errormessage";
1987 print " </class>";
1988 &Header
::closebox
();
1990 &Header
::openbox
('100%', 'LEFT', "$Lang::tr{'generate root/host certificates'}:");
1992 <form method='post' enctype='multipart/form-data'>
1993 <table width='100%' border='0' cellspacing='1' cellpadding='0'>
1994 <tr><td width='30%' class='base'>$Lang::tr{'organization name'}: <img src='/blob.gif' alt='*' /></td>
1995 <td width='35%' class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_ORGANIZATION' value='$cgiparams{'ROOTCERT_ORGANIZATION'}' size='32' /></td>
1996 <td width='35%' colspan='2'> </td></tr>
1997 <tr><td class='base'>$Lang::tr{'ipfires hostname'}: <img src='/blob.gif' alt='*' /></td>
1998 <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_HOSTNAME' value='$cgiparams{'ROOTCERT_HOSTNAME'}' size='32' /></td>
1999 <td colspan='2'> </td></tr>
2000 <tr><td class='base'>$Lang::tr{'your e-mail'}:</td>
2001 <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_EMAIL' value='$cgiparams{'ROOTCERT_EMAIL'}' size='32' /></td>
2002 <td colspan='2'> </td></tr>
2003 <tr><td class='base'>$Lang::tr{'your department'}:</td>
2004 <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_OU' value='$cgiparams{'ROOTCERT_OU'}' size='32' /></td>
2005 <td colspan='2'> </td></tr>
2006 <tr><td class='base'>$Lang::tr{'city'}:</td>
2007 <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_CITY' value='$cgiparams{'ROOTCERT_CITY'}' size='32' /></td>
2008 <td colspan='2'> </td></tr>
2009 <tr><td class='base'>$Lang::tr{'state or province'}:</td>
2010 <td class='base' nowrap='nowrap'><input type='text' name='ROOTCERT_STATE' value='$cgiparams{'ROOTCERT_STATE'}' size='32' /></td>
2011 <td colspan='2'> </td></tr>
2012 <tr><td class='base'>$Lang::tr{'country'}:</td>
2013 <td class='base'><select name='ROOTCERT_COUNTRY'>
2017 foreach my $country (sort keys %{Countries
::countries
}) {
2018 print "<option value='$Countries::countries{$country}'";
2019 if ( $Countries::countries
{$country} eq $cgiparams{'ROOTCERT_COUNTRY'} ) {
2020 print " selected='selected'";
2022 print ">$country</option>";
2026 <tr><td class='base'>$Lang::tr{'ovpn dh'}:</td>
2027 <td class='base'><select name='DHLENGHT'>
2028 <option value='2048' $selected{'DHLENGHT'}{'2048'}>2048 $Lang::tr{'bit'}</option>
2029 <option value='3072' $selected{'DHLENGHT'}{'3072'}>3072 $Lang::tr{'bit'}</option>
2030 <option value='4096' $selected{'DHLENGHT'}{'4096'}>4096 $Lang::tr{'bit'}</option>
2036 <td><input type='submit' name='ACTION' value='$Lang::tr{'generate root/host certificates'}' /></td>
2037 <td> </td><td> </td></tr>
2038 <tr><td class='base' colspan='4' align='left'>
2039 <img src='/blob.gif' valign='top' alt='*' /> $Lang::tr{'required field'}</td></tr>
2040 <tr><td colspan='2'><br></td></tr>
2041 <table width='100%'>
2043 <b><font color='${Header::colourred}'>$Lang::tr{'capswarning'}: </font></b>$Lang::tr{'ovpn generating the root and host certificates'}
2044 <td class='base'>$Lang::tr{'dh key warn'}</td>
2047 <td class='base'>$Lang::tr{'dh key warn1'}</td>
2049 <tr><td colspan='2'><br></td></tr>
2053 <table width='100%'>
2054 <tr><td colspan='4'><hr></td></tr>
2055 <tr><td class='base' nowrap='nowrap'>$Lang::tr{'upload p12 file'}: <img src='/blob.gif' alt='*' /></td>
2056 <td nowrap='nowrap'><input type='file' name='FH' size='32'></td>
2057 <td colspan='2'> </td></tr>
2058 <tr><td class='base'>$Lang::tr{'pkcs12 file password'}:</td>
2059 <td class='base' nowrap='nowrap'><input type='password' name='P12_PASS' value='$cgiparams{'P12_PASS'}' size='32' /></td>
2060 <td colspan='2'> </td></tr>
2062 <td><input type='submit' name='ACTION' value='$Lang::tr{'upload p12 file'}' /></td>
2063 <td colspan='2'> </td></tr>
2064 <tr><td class='base' colspan='4' align='left'>
2065 <img src='/blob.gif' valign='top' alt='*' > $Lang::tr{'required field'}</td>
2070 &Header
::closebox
();
2071 print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
2072 &Header
::closebigbox
();
2073 &Header
::closepage
();
2078 system ("chmod 600 ${General::swroot}/ovpn/certs/serverkey.pem");
2079 # if ($vpnsettings{'ENABLED'} eq 'on' ||
2080 # $vpnsettings{'ENABLE_BLUE'} eq 'on') {
2081 # system('/usr/local/bin/ipsecctrl', 'S');
2085 ### Enable/Disable connection
2092 }elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'toggle enable disable'}) {
2094 &General
::readhash
("${General::swroot}/ovpn/settings", \
%vpnsettings);
2095 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
2096 # my $n2nactive = '';
2097 my $n2nactive = `/bin/ps ax|grep $confighash{$cgiparams{'KEY'}}[1]|grep -v grep|awk \'{print \$1}\'`;
2099 if ($confighash{$cgiparams{'KEY'}}) {
2100 if ($confighash{$cgiparams{'KEY'}}[0] eq 'off') {
2101 $confighash{$cgiparams{'KEY'}}[0] = 'on';
2102 &General
::writehasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
2104 if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
2105 system('/usr/local/bin/openvpnctrl', '-sn2n', $confighash{$cgiparams{'KEY'}}[1]);
2106 &writecollectdconf
();
2110 $confighash{$cgiparams{'KEY'}}[0] = 'off';
2111 &General
::writehasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
2113 if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
2114 if ($n2nactive ne '') {
2115 system('/usr/local/bin/openvpnctrl', '-kn2n', $confighash{$cgiparams{'KEY'}}[1]);
2116 &writecollectdconf
();
2120 $errormessage = $Lang::tr
{'invalid key'};
2126 ### Download OpenVPN client package
2130 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'dl client arch'}) {
2131 &General
::readhash
("${General::swroot}/ovpn/settings", \
%vpnsettings);
2132 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
2134 my $clientovpn = '';
2136 my $tempdir = tempdir
( CLEANUP
=> 1 );
2137 my $zippath = "$tempdir/";
2143 if ($confighash{$cgiparams{'KEY'}}[3] eq 'net'){
2145 my $zipname = "$confighash{$cgiparams{'KEY'}}[1]-Client.zip";
2146 my $zippathname = "$zippath$zipname";
2147 $clientovpn = "$confighash{$cgiparams{'KEY'}}[1].conf";
2148 my @ovsubnettemp = split(/\./,$confighash{$cgiparams{'KEY'}}[27]);
2149 my $ovsubnet = "$ovsubnettemp[0].$ovsubnettemp[1].$ovsubnettemp[2]";
2151 my @remsubnet = split(/\//,$confighash{$cgiparams{'KEY'}}[8]);
2152 my $n2nfragment = '';
2154 open(CLIENTCONF
, ">$tempdir/$clientovpn") or die "Unable to open tempfile: $!";
2155 flock CLIENTCONF
, 2;
2157 my $zip = Archive
::Zip
->new();
2158 print CLIENTCONF
"# IPFire n2n Open VPN Client Config by ummeegge und m.a.d\n";
2159 print CLIENTCONF
"# \n";
2160 print CLIENTCONF
"# User Security\n";
2161 print CLIENTCONF
"user nobody\n";
2162 print CLIENTCONF
"group nobody\n";
2163 print CLIENTCONF
"persist-tun\n";
2164 print CLIENTCONF
"persist-key\n";
2165 print CLIENTCONF
"script-security 2\n";
2166 print CLIENTCONF
"# IP/DNS for remote Server Gateway\n";
2167 print CLIENTCONF
"remote $vpnsettings{'VPN_IP'}\n";
2168 print CLIENTCONF
"float\n";
2169 print CLIENTCONF
"# IP adresses of the VPN Subnet\n";
2170 print CLIENTCONF
"ifconfig $ovsubnet.2 $ovsubnet.1\n";
2171 print CLIENTCONF
"# Server Gateway Network\n";
2172 print CLIENTCONF
"route $remsubnet[0] $remsubnet[1]\n";
2173 print CLIENTCONF
"# tun Device\n";
2174 print CLIENTCONF
"dev tun\n";
2175 print CLIENTCONF
"#Logfile for statistics\n";
2176 print CLIENTCONF
"status-version 1\n";
2177 print CLIENTCONF
"status /var/run/openvpn/$cgiparams{'NAME'}-n2n 10\n";
2178 print CLIENTCONF
"# Port and Protokoll\n";
2179 print CLIENTCONF
"port $confighash{$cgiparams{'KEY'}}[29]\n";
2181 if ($confighash{$cgiparams{'KEY'}}[28] eq 'tcp') {
2182 print CLIENTCONF
"proto tcp-client\n";
2183 print CLIENTCONF
"# Packet size\n";
2184 if ($confighash{$cgiparams{'KEY'}}[31] eq '') {$tunmtu = '1400'} else {$tunmtu = $confighash{$cgiparams{'KEY'}}[31]};
2185 print CLIENTCONF
"tun-mtu $tunmtu\n";
2188 if ($confighash{$cgiparams{'KEY'}}[28] eq 'udp') {
2189 print CLIENTCONF
"proto udp\n";
2190 print CLIENTCONF
"# Paketsize\n";
2191 if ($confighash{$cgiparams{'KEY'}}[31] eq '') {$tunmtu = '1500'} else {$tunmtu = $confighash{$cgiparams{'KEY'}}[31]};
2192 print CLIENTCONF
"tun-mtu $tunmtu\n";
2193 if ($confighash{$cgiparams{'KEY'}}[24] ne '') {print CLIENTCONF
"fragment $confighash{$cgiparams{'KEY'}}[24]\n";}
2194 if ($confighash{$cgiparams{'KEY'}}[23] eq 'on') {print CLIENTCONF
"mssfix\n";}
2196 # Check host certificate if X509 is RFC3280 compliant.
2197 # If not, old --ns-cert-type directive will be used.
2198 # If appropriate key usage extension exists, new --remote-cert-tls directive will be used.
2199 my $hostcert = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
2200 if ($hostcert !~ /TLS Web Server Authentication/) {
2201 print CLIENTCONF
"ns-cert-type server\n";
2203 print CLIENTCONF
"remote-cert-tls server\n";
2205 print CLIENTCONF
"# Auth. Client\n";
2206 print CLIENTCONF
"tls-client\n";
2207 print CLIENTCONF
"# Cipher\n";
2208 print CLIENTCONF
"cipher $confighash{$cgiparams{'KEY'}}[40]\n";
2209 if ($confighash{$cgiparams{'KEY'}}[4] eq 'cert' && -f
"${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12") {
2210 print CLIENTCONF
"pkcs12 ${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12\r\n";
2211 $zip->addFile( "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12", "$confighash{$cgiparams{'KEY'}}[1].p12") or die "Can't add file $confighash{$cgiparams{'KEY'}}[1].p12\n";
2214 # If GCM cipher is used, do not use --auth
2215 if (($confighash{$cgiparams{'KEY'}}[40] eq 'AES-256-GCM') ||
2216 ($confighash{$cgiparams{'KEY'}}[40] eq 'AES-192-GCM') ||
2217 ($confighash{$cgiparams{'KEY'}}[40] eq 'AES-128-GCM')) {
2218 print CLIENTCONF
unless "# HMAC algorithm\n";
2219 print CLIENTCONF
unless "auth $confighash{$cgiparams{'KEY'}}[39]\n";
2221 print CLIENTCONF
"# HMAC algorithm\n";
2222 print CLIENTCONF
"auth $confighash{$cgiparams{'KEY'}}[39]\n";
2225 if ($confighash{$cgiparams{'KEY'}}[30] eq 'on') {
2226 print CLIENTCONF
"# Enable Compression\n";
2227 print CLIENTCONF
"comp-lzo\n";
2229 print CLIENTCONF
"# Debug Level\n";
2230 print CLIENTCONF
"verb 3\n";
2231 print CLIENTCONF
"# Tunnel check\n";
2232 print CLIENTCONF
"keepalive 10 60\n";
2233 print CLIENTCONF
"# Start as daemon\n";
2234 print CLIENTCONF
"daemon $confighash{$cgiparams{'KEY'}}[1]n2n\n";
2235 print CLIENTCONF
"writepid /var/run/$confighash{$cgiparams{'KEY'}}[1]n2n.pid\n";
2236 print CLIENTCONF
"# Activate Management Interface and Port\n";
2237 if ($confighash{$cgiparams{'KEY'}}[22] eq '') {print CLIENTCONF
"management localhost $confighash{$cgiparams{'KEY'}}[29]\n"}
2238 else {print CLIENTCONF
"management localhost $confighash{$cgiparams{'KEY'}}[22]\n"};
2239 print CLIENTCONF
"# remsub $confighash{$cgiparams{'KEY'}}[11]\n";
2244 $zip->addFile( "$tempdir/$clientovpn", $clientovpn) or die "Can't add file $clientovpn\n";
2245 my $status = $zip->writeToFileNamed($zippathname);
2247 open(DLFILE
, "<$zippathname") or die "Unable to open $zippathname: $!";
2248 @fileholder = <DLFILE
>;
2249 print "Content-Type:application/x-download\n";
2250 print "Content-Disposition:attachment;filename=$zipname\n\n";
2256 my $zipname = "$confighash{$cgiparams{'KEY'}}[1]-TO-IPFire.zip";
2257 my $zippathname = "$zippath$zipname";
2258 $clientovpn = "$confighash{$cgiparams{'KEY'}}[1]-TO-IPFire.ovpn";
2264 open(CLIENTCONF
, ">$tempdir/$clientovpn") or die "Unable to open tempfile: $!";
2265 flock CLIENTCONF
, 2;
2267 my $zip = Archive
::Zip
->new();
2269 print CLIENTCONF
"#OpenVPN Client conf\r\n";
2270 print CLIENTCONF
"tls-client\r\n";
2271 print CLIENTCONF
"client\r\n";
2272 print CLIENTCONF
"nobind\r\n";
2273 print CLIENTCONF
"dev tun\r\n";
2274 print CLIENTCONF
"proto $vpnsettings{'DPROTOCOL'}\r\n";
2276 # Check if we are using fragment, mssfix and set MTU to 1500
2277 # or use configured value.
2278 if ($vpnsettings{FRAGMENT
} ne '' && $vpnsettings{DPROTOCOL
} ne 'tcp' )
2279 { print CLIENTCONF
"tun-mtu 1500\r\n"; }
2280 elsif ($vpnsettings{MSSFIX
} eq 'on')
2281 { print CLIENTCONF
"tun-mtu 1500\r\n"; }
2283 { print CLIENTCONF
"tun-mtu $vpnsettings{'DMTU'}\r\n"; }
2285 if ( $vpnsettings{'ENABLED'} eq 'on'){
2286 print CLIENTCONF
"remote $vpnsettings{'VPN_IP'} $vpnsettings{'DDEST_PORT'}\r\n";
2287 if ( $vpnsettings{'ENABLED_BLUE'} eq 'on' && (&haveBlueNet
())){
2288 print CLIENTCONF
"#Coment the above line and uncoment the next line, if you want to connect on the Blue interface\r\n";
2289 print CLIENTCONF
";remote $netsettings{'BLUE_ADDRESS'} $vpnsettings{'DDEST_PORT'}\r\n";
2291 if ( $vpnsettings{'ENABLED_ORANGE'} eq 'on' && (&haveOrangeNet
())){
2292 print CLIENTCONF
"#Coment the above line and uncoment the next line, if you want to connect on the Orange interface\r\n";
2293 print CLIENTCONF
";remote $netsettings{'ORANGE_ADDRESS'} $vpnsettings{'DDEST_PORT'}\r\n";
2295 } elsif ( $vpnsettings{'ENABLED_BLUE'} eq 'on' && (&haveBlueNet
())){
2296 print CLIENTCONF
"remote $netsettings{'BLUE_ADDRESS'} $vpnsettings{'DDEST_PORT'}\r\n";
2297 if ( $vpnsettings{'ENABLED_ORANGE'} eq 'on' && (&haveOrangeNet
())){
2298 print CLIENTCONF
"#Coment the above line and uncoment the next line, if you want to connect on the Orange interface\r\n";
2299 print CLIENTCONF
";remote $netsettings{'ORANGE_ADDRESS'} $vpnsettings{'DDEST_PORT'}\r\n";
2301 } elsif ( $vpnsettings{'ENABLED_ORANGE'} eq 'on' && (&haveOrangeNet
())){
2302 print CLIENTCONF
"remote $netsettings{'ORANGE_ADDRESS'} $vpnsettings{'DDEST_PORT'}\r\n";
2305 my $file_crt = new File
::Temp
( UNLINK
=> 1 );
2306 my $file_key = new File
::Temp
( UNLINK
=> 1 );
2307 my $include_certs = 0;
2309 if ($confighash{$cgiparams{'KEY'}}[4] eq 'cert' && -f
"${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12") {
2310 if ($cgiparams{'MODE'} eq 'insecure') {
2314 print CLIENTCONF
";ca cacert.pem\r\n";
2315 $zip->addFile("${General::swroot}/ovpn/ca/cacert.pem", "cacert.pem") or die "Can't add file cacert.pem\n";
2317 # Extract the certificate
2318 system('/usr/bin/openssl', 'pkcs12', '-in', "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12",
2319 '-clcerts', '-nokeys', '-nodes', '-out', "$file_crt" , '-passin', 'pass:');
2321 die "openssl error: $?";
2324 $zip->addFile("$file_crt", "$confighash{$cgiparams{'KEY'}}[1].pem") or die;
2325 print CLIENTCONF
";cert $confighash{$cgiparams{'KEY'}}[1].pem\r\n";
2328 system('/usr/bin/openssl', 'pkcs12', '-in', "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12",
2329 '-nocerts', '-nodes', '-out', "$file_key", '-passin', 'pass:');
2331 die "openssl error: $?";
2334 $zip->addFile("$file_key", "$confighash{$cgiparams{'KEY'}}[1].key") or die;
2335 print CLIENTCONF
";key $confighash{$cgiparams{'KEY'}}[1].key\r\n";
2337 print CLIENTCONF
"pkcs12 $confighash{$cgiparams{'KEY'}}[1].p12\r\n";
2338 $zip->addFile( "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12", "$confighash{$cgiparams{'KEY'}}[1].p12") or die "Can't add file $confighash{$cgiparams{'KEY'}}[1].p12\n";
2341 print CLIENTCONF
"ca cacert.pem\r\n";
2342 print CLIENTCONF
"cert $confighash{$cgiparams{'KEY'}}[1]cert.pem\r\n";
2343 print CLIENTCONF
"key $confighash{$cgiparams{'KEY'}}[1].key\r\n";
2344 $zip->addFile( "${General::swroot}/ovpn/ca/cacert.pem", "cacert.pem") or die "Can't add file cacert.pem\n";
2345 $zip->addFile( "${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem", "$confighash{$cgiparams{'KEY'}}[1]cert.pem") or die "Can't add file $confighash{$cgiparams{'KEY'}}[1]cert.pem\n";
2347 print CLIENTCONF
"cipher $vpnsettings{DCIPHER}\r\n";
2348 print CLIENTCONF
"auth $vpnsettings{'DAUTH'}\r\n";
2350 if ($vpnsettings{'TLSAUTH'} eq 'on') {
2351 if ($cgiparams{'MODE'} eq 'insecure') {
2352 print CLIENTCONF
";";
2354 print CLIENTCONF
"tls-auth ta.key\r\n";
2355 $zip->addFile( "${General::swroot}/ovpn/certs/ta.key", "ta.key") or die "Can't add file ta.key\n";
2357 if ($vpnsettings{DCOMPLZO
} eq 'on') {
2358 print CLIENTCONF
"comp-lzo\r\n";
2360 print CLIENTCONF
"verb 3\r\n";
2361 # Check host certificate if X509 is RFC3280 compliant.
2362 # If not, old --ns-cert-type directive will be used.
2363 # If appropriate key usage extension exists, new --remote-cert-tls directive will be used.
2364 my $hostcert = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/servercert.pem`;
2365 if ($hostcert !~ /TLS Web Server Authentication/) {
2366 print CLIENTCONF
"ns-cert-type server\r\n";
2368 print CLIENTCONF
"remote-cert-tls server\r\n";
2370 print CLIENTCONF
"verify-x509-name $vpnsettings{ROOTCERT_HOSTNAME} name\r\n";
2371 if ($vpnsettings{MSSFIX
} eq 'on') {
2372 print CLIENTCONF
"mssfix\r\n";
2374 if ($vpnsettings{FRAGMENT
} ne '' && $vpnsettings{DPROTOCOL
} ne 'tcp' ) {
2375 print CLIENTCONF
"fragment $vpnsettings{'FRAGMENT'}\r\n";
2378 if ($include_certs) {
2379 print CLIENTCONF
"\r\n";
2382 open(FILE
, "<${General::swroot}/ovpn/ca/cacert.pem");
2383 print CLIENTCONF
"<ca>\r\n";
2386 print CLIENTCONF
"$_\r\n";
2388 print CLIENTCONF
"</ca>\r\n\r\n";
2392 open(FILE
, "<$file_crt");
2393 print CLIENTCONF
"<cert>\r\n";
2396 print CLIENTCONF
"$_\r\n";
2398 print CLIENTCONF
"</cert>\r\n\r\n";
2402 open(FILE
, "<$file_key");
2403 print CLIENTCONF
"<key>\r\n";
2406 print CLIENTCONF
"$_\r\n";
2408 print CLIENTCONF
"</key>\r\n\r\n";
2412 if ($vpnsettings{'TLSAUTH'} eq 'on') {
2413 open(FILE
, "<${General::swroot}/ovpn/certs/ta.key");
2414 print CLIENTCONF
"<tls-auth>\r\n";
2417 print CLIENTCONF
"$_\r\n";
2419 print CLIENTCONF
"</tls-auth>\r\n\r\n";
2424 # Print client.conf.local if entries exist to client.ovpn
2425 if (!-z
$local_clientconf && $vpnsettings{'ADDITIONAL_CONFIGS'} eq 'on') {
2426 open (LCC
, "$local_clientconf");
2427 print CLIENTCONF
"\n#---------------------------\n";
2428 print CLIENTCONF
"# Start of custom directives\n";
2429 print CLIENTCONF
"# from client.conf.local\n";
2430 print CLIENTCONF
"#---------------------------\n\n";
2432 print CLIENTCONF
$_;
2434 print CLIENTCONF
"\n#---------------------------\n";
2435 print CLIENTCONF
"# End of custom directives\n";
2436 print CLIENTCONF
"#---------------------------\n\n";
2441 $zip->addFile( "$tempdir/$clientovpn", $clientovpn) or die "Can't add file $clientovpn\n";
2442 my $status = $zip->writeToFileNamed($zippathname);
2444 open(DLFILE
, "<$zippathname") or die "Unable to open $zippathname: $!";
2445 @fileholder = <DLFILE
>;
2446 print "Content-Type:application/x-download\n";
2447 print "Content-Disposition:attachment;filename=$zipname\n\n";
2455 ### Remove connection
2459 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'remove'}) {
2460 &General
::readhash
("${General::swroot}/ovpn/settings", \
%vpnsettings);
2461 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
2463 if ($confighash{$cgiparams{'KEY'}}) {
2464 # Revoke certificate if certificate was deleted and rewrite the CRL
2465 my $temp = `/usr/bin/openssl ca -revoke ${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem -config ${General::swroot}/ovpn/openssl/ovpn.cnf`;
2466 my $tempA = `/usr/bin/openssl ca -gencrl -out ${General::swroot}/ovpn/crls/cacrl.pem -config ${General::swroot}/ovpn/openssl/ovpn.cnf`;
2472 if ($confighash{$cgiparams{'KEY'}}[3] eq 'net') {
2473 # Stop the N2N connection before it is removed
2474 system('/usr/local/bin/openvpnctrl', '-kn2n', $confighash{$cgiparams{'KEY'}}[1]);
2476 my $conffile = glob("${General::swroot}/ovpn/n2nconf/$confighash{$cgiparams{'KEY'}}[1]/$confighash{$cgiparams{'KEY'}}[1].conf");
2477 my $certfile = glob("${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12");
2481 if (-e
"${General::swroot}/ovpn/n2nconf/$confighash{$cgiparams{'KEY'}}[1]") {
2482 rmdir ("${General::swroot}/ovpn/n2nconf/$confighash{$cgiparams{'KEY'}}[1]") || die "Kann Verzeichnis nicht loeschen: $!";
2486 unlink ("${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem");
2487 unlink ("${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12");
2489 # A.Marx CCD delete ccd files and routes
2491 if (-f
"${General::swroot}/ovpn/ccd/$confighash{$cgiparams{'KEY'}}[2]")
2493 unlink "${General::swroot}/ovpn/ccd/$confighash{$cgiparams{'KEY'}}[2]";
2496 &General
::readhasharray
("${General::swroot}/ovpn/ccdroute", \
%ccdroutehash);
2497 foreach my $key (keys %ccdroutehash) {
2498 if ($ccdroutehash{$key}[0] eq $confighash{$cgiparams{'KEY'}}[1]){
2499 delete $ccdroutehash{$key};
2502 &General
::writehasharray
("${General::swroot}/ovpn/ccdroute", \
%ccdroutehash);
2504 &General
::readhasharray
("${General::swroot}/ovpn/ccdroute2", \
%ccdroute2hash);
2505 foreach my $key (keys %ccdroute2hash) {
2506 if ($ccdroute2hash{$key}[0] eq $confighash{$cgiparams{'KEY'}}[1]){
2507 delete $ccdroute2hash{$key};
2510 &General
::writehasharray
("${General::swroot}/ovpn/ccdroute2", \
%ccdroute2hash);
2514 # Update collectd configuration and delete all RRD files of the removed connection
2515 &writecollectdconf
();
2516 system ('/usr/local/bin/openvpnctrl', '-drrd', $confighash{$cgiparams{'KEY'}}[1]);
2518 delete $confighash{$cgiparams{'KEY'}};
2519 my $temp2 = `/usr/bin/openssl ca -gencrl -out ${General::swroot}/ovpn/crls/cacrl.pem -config ${General::swroot}/ovpn/openssl/ovpn.cnf`;
2520 &General
::writehasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
2523 $errormessage = $Lang::tr
{'invalid key'};
2525 &General
::firewall_reload
();
2528 ### Download PKCS12 file
2530 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'download pkcs12 file'}) {
2531 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
2533 print "Content-Disposition: filename=" . $confighash{$cgiparams{'KEY'}}[1] . ".p12\r\n";
2534 print "Content-Type: application/octet-stream\r\n\r\n";
2535 print `/bin/cat ${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1].p12`;
2539 ### Display certificate
2541 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'show certificate'}) {
2542 &General
::readhasharray
("${General::swroot}/ovpn/ovpnconfig", \
%confighash);
2544 if ( -f
"${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem") {
2545 &Header
::showhttpheaders
();
2546 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
2547 &Header
::openbigbox
('100%', 'LEFT', '', '');
2548 &Header
::openbox
('100%', 'LEFT', "$Lang::tr{'certificate'}:");
2549 my $output = `/usr/bin/openssl x509 -text -in ${General::swroot}/ovpn/certs/$confighash{$cgiparams{'KEY'}}[1]cert.pem`;
2550 $output = &Header
::cleanhtml
($output,"y");
2551 print "<pre>$output</pre>\n";
2552 &Header
::closebox
();
2553 print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
2554 &Header
::closebigbox
();
2555 &Header
::closepage
();
2560 ### Display Diffie-Hellman key
2562 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'show dh'}) {
2564 if (! -e
"${General::swroot}/ovpn/ca/dh1024.pem") {
2565 $errormessage = $Lang::tr
{'not present'};
2567 &Header
::showhttpheaders
();
2568 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
2569 &Header
::openbigbox
('100%', 'LEFT', '', '');
2570 &Header
::openbox
('100%', 'LEFT', "$Lang::tr{'dh'}:");
2571 my $output = `/usr/bin/openssl dhparam -text -in ${General::swroot}/ovpn/ca/dh1024.pem`;
2572 $output = &Header
::cleanhtml
($output,"y");
2573 print "<pre>$output</pre>\n";
2574 &Header
::closebox
();
2575 print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
2576 &Header
::closebigbox
();
2577 &Header
::closepage
();
2582 ### Display tls-auth key
2584 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'show tls-auth key'}) {
2586 if (! -e
"${General::swroot}/ovpn/certs/ta.key") {
2587 $errormessage = $Lang::tr
{'not present'};
2589 &Header
::showhttpheaders
();
2590 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
2591 &Header
::openbigbox
('100%', 'LEFT', '', '');
2592 &Header
::openbox
('100%', 'LEFT', "$Lang::tr{'ta key'}:");
2593 my $output = `/bin/cat ${General::swroot}/ovpn/certs/ta.key`;
2594 $output = &Header
::cleanhtml
($output,"y");
2595 print "<pre>$output</pre>\n";
2596 &Header
::closebox
();
2597 print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
2598 &Header
::closebigbox
();
2599 &Header
::closepage
();
2604 ### Display Certificate Revoke List
2606 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'show crl'}) {
2607 # &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%confighash);
2609 if (! -e
"${General::swroot}/ovpn/crls/cacrl.pem") {
2610 $errormessage = $Lang::tr
{'not present'};
2612 &Header
::showhttpheaders
();
2613 &Header
::openpage
($Lang::tr
{'ovpn'}, 1, '');
2614 &Header
::openbigbox
('100%', 'LEFT', '', '');
2615 &Header
::openbox
('100%', 'LEFT', "$Lang::tr{'crl'}:");
2616 my $output = `/usr/bin/openssl crl -text -noout -in ${General::swroot}/ovpn/crls/cacrl.pem`;
2617 $output = &Header
::cleanhtml
($output,"y");
2618 print "<pre>$output</pre>\n";
2619 &Header
::closebox
();
2620 print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
2621 &Header
::closebigbox
();
2622 &Header
::closepage
();
2627 ### Advanced Server Settings
2630 } elsif ($cgiparams{'ACTION'} eq $Lang::tr
{'advanced server'}) {
2635 &General
::readhash
("${General::swroot}/ovpn/settings", \
%cgiparams);
2639 # if ($cgiparams{'CLIENT2CLIENT'} eq '') {
2640 # $cgiparams{'CLIENT2CLIENT'} = 'on';
2643 if ($cgiparams{'MAX_CLIENTS'} eq '') {
2644 $cgiparams{'MAX_CLIENTS'} = '100';
2646 if ($cgiparams{'KEEPALIVE_1'} eq '') {
2647 $cgiparams{'KEEPALIVE_1'} = '10';
2649 if ($cgiparams{'KEEPALIVE_2'} eq '') {
2650 $cgiparams{'KEEPALIVE_2'} = '60';
2652 if ($cgiparams{'LOG_VERB'} eq '') {
2653 $cgiparams{'LOG_VERB'} = '3';
2655 if ($cgiparams{'TLSAUTH'} eq '') {
2656 $cgiparams{'TLSAUTH'} = 'off';
2658 $checked{'CLIENT2CLIENT'}{'off'} = '';
2659 $checked{'CLIENT2CLIENT'}{'on'} = '';
2660 $checked{'CLIENT2CLIENT'}{$cgiparams{'CLIENT2CLIENT'}} = 'CHECKED';
2661 $checked{'REDIRECT_GW_DEF1'}{'off'} = '';
2662 $checked{'REDIRECT_GW_DEF1'}{'on'} = '';
2663 $checked{'REDIRECT_GW_DEF1'}{$cgiparams{'REDIRECT_GW_DEF1'}} = 'CHECKED';
2664 $checked{'DCOMPLZO'}{'off'} = '';
2665 $checked{'DCOMPLZO'}{'on'} = '';
2666 $checked{'DCOMPLZO'}{$cgiparams{'DCOMPLZO'}} = 'CHECKED';
2667 $checked{'ADDITIONAL_CONFIGS'}{'off'} = '';
2668 $checked{'ADDITIONAL_CONFIGS'}{'on'} = '';
2669 $checked{'ADDITIONAL_CONFIGS'}{$cgiparams{'ADDITIONAL_CONFIGS'}} = 'CHECKED';
2670 $checked{'MSSFIX'}{'off'} = '';
2671 $checked{'MSSFIX'}{'on'} = '';
2672 $checked{'MSSFIX'}{$cgiparams{'MSSFIX'}} = 'CHECKED';
2673 $selected{'LOG_VERB'}{'0'} = '';
2674 $selected{'LOG_VERB'}{'1'} = '';
2675 $selected{'LOG_VERB'}{'2'} = '';
2676 $selected{'LOG_VERB'}{'3'} = '';
2677 $selected{'LOG_VERB'}{'4'} = '';
2678 $selected{'LOG_VERB'}{'5'} = '';
2679 $selected{'LOG_VERB'}{'6'} = '';
2680 $selected{'LOG_VERB'}{'7'} = '';
2681 $selected{'LOG_VERB'}{'8'} = '';
2682 $selected{'LOG_VERB'}{'9'} = '';
2683 $selected{'LOG_VERB'}{'10'} = '';
2684 $selected{'LOG_VERB'}{'11'} = '';
2685 $selected{'LOG_VERB'}{$cgiparams{'LOG_VERB'}} = 'SELECTED';
2687 &Header
::showhttpheaders
();
2688 &Header
::openpage
($Lang::tr
{'status ovpn'}, 1, '');
2689 &Header
::openbigbox
('100%', 'LEFT', '', $errormessage);
2690 if ($errormessage) {
2691 &Header
::openbox
('100%', 'LEFT', $Lang::tr
{'error messages'});
2692 print "<class name='base'>$errormessage\n";
2693 print " </class>\n";
2694 &Header
::closebox
();
2696 &Header
::openbox
('100%', 'LEFT', $Lang::tr
{'advanced server'});
2698 <form method='post' enctype='multipart/form-data'>
2699 <table width='100%' border=0>
2701 <td colspan='4'><b>$Lang::tr{'dhcp-options'}</b></td>
2704 <td width='25%'></td> <td width='20%'> </td><td width='25%'> </td><td width='30%'></td>
2707 <td class='base'>Domain</td>
2708 <td><input type='TEXT' name='DHCP_DOMAIN' value='$cgiparams{'DHCP_DOMAIN'}' size='30' /></td>
2711 <td class='base'>DNS</td>
2712 <td><input type='TEXT' name='DHCP_DNS' value='$cgiparams{'DHCP_DNS'}' size='30' /></td>
2715 <td class='base'>WINS</td>
2716 <td><input type='TEXT' name='DHCP_WINS' value='$cgiparams{'DHCP_WINS'}' size='30' /></td>
2719 <td colspan='4'><b>$Lang::tr{'ovpn routes push options'}</b></td>
2722 <td class='base'>$Lang::tr{'ovpn routes push'}</td>
2724 <textarea name='ROUTES_PUSH' cols='26' rows='6' wrap='off'>
2728 if ($cgiparams{'ROUTES_PUSH'} ne '')
2730 print $cgiparams{'ROUTES_PUSH'};
2739 <table width='100%'>
2741 <td class'base'><b>$Lang::tr{'misc-options'}</b></td>
2745 <td width='20%'></td> <td width='15%'> </td><td width='35%'> </td><td width='20%'></td><td width='35%'></td>
2749 <td class='base'>Client-To-Client</td>
2750 <td><input type='checkbox' name='CLIENT2CLIENT' $checked{'CLIENT2CLIENT'}{'on'} /></td>
2754 <td class='base'>Redirect-Gateway def1</td>
2755 <td><input type='checkbox' name='REDIRECT_GW_DEF1' $checked{'REDIRECT_GW_DEF1'}{'on'} /></td>
2758 <tr><td class='boldbase' nowrap='nowrap'>$Lang::tr{'comp-lzo'}</td>
2759 <td><input type='checkbox' name='DCOMPLZO' $checked{'DCOMPLZO'}{'on'} /></td>
2760 <td>$Lang::tr{'openvpn default'}: off <font color='red'>($Lang::tr{'attention'} exploitable via Voracle)</font></td>
2764 <td class='base'>$Lang::tr{'ovpn add conf'}</td>
2765 <td><input type='checkbox' name='ADDITIONAL_CONFIGS' $checked{'ADDITIONAL_CONFIGS'}{'on'} /></td>
2766 <td>$Lang::tr{'openvpn default'}: off</td>
2770 <td class='base'>mssfix</td>
2771 <td><input type='checkbox' name='MSSFIX' $checked{'MSSFIX'}{'on'} /></td>
2772 <td>$Lang::tr{'openvpn default'}: off</td>
2776 <td class='base'>fragment <br></td>
2777 <td><input type='TEXT' name='FRAGMENT' value='$cgiparams{'FRAGMENT'}' size='10' /></td>
2782 <td class='base'>Max-Clients</td>
2783 <td><input type='text' name='MAX_CLIENTS' value='$cgiparams{'MAX_CLIENTS'}' size='10' /></td>
2786 <td class='base'>Keepalive <br />
2787 (ping/ping-restart)</td>
2788 <td><input type='TEXT' name='KEEPALIVE_1' value='$cgiparams{'KEEPALIVE_1'}' size='10' /></td>
2789 <td><input type='TEXT' name='KEEPALIVE_2' value='$cgiparams{'KEEPALIVE_2'}' size='10' /></td>
2794 <table width='100%'>
2796 <td class'base'><b>$Lang::tr{'log-options'}</b></td>
2799 <td width='20%'></td> <td width='30%'> </td><td width='25%'> </td><td width='25%'></td>
2802 <tr><td class='base'>VERB</td>
2803 <td><select name='LOG_VERB'>
2804 <option value='0' $selected{'LOG_VERB'}{'0'}>0</option>
2805 <option value='1' $selected{'LOG_VERB'}{'1'}>1</option>
2806 <option value='2' $selected{'LOG_VERB'}{'2'}>2</option>
2807 <option value='3' $selected{'LOG_VERB'}{'3'}>3</option>
2808 <option value='4' $selected{'LOG_VERB'}{'4'}>4</option>
2809 <option value='5' $selected{'LOG_VERB'}{'5'}>5</option>
2810 <option value='6' $selected{'LOG_VERB'}{'6'}>6</option>
2811 <option value='7' $selected{'LOG_VERB'}{'7'}>7</option>
2812 <option value='8' $selected{'LOG_VERB'}{'8'}>8</option>
2813 <option value='9' $selected{'LOG_VERB'}{'9'}>9</option>
2814 <option value='10' $selected{'LOG_VERB'}{'10'}>10</option>
2815 <option value='11' $selected{'LOG_VERB'}{'11'}>11</option>
2822 if ( -e
"/var/run/openvpn.pid"){
2823 print" <br><b><font color='#990000'>$Lang::tr{'attention'}:</b></font><br>
2824 $Lang::tr{'server restart'}<br><br>
2827 <table width='100%'>
2830 <td allign='center'><input type='submit' name='ACTION' value='$Lang::tr{'save-adv-options'}' disabled='disabled' /></td>
2831 <td allign='center'><input type='submit' name='ACTION' value='$Lang::tr{'cancel-adv-options'}' /></td>
2843 <table width='100%'>
2846 <td allign='center'><input type='submit' name='ACTION' value='$Lang::tr{'save-adv-options'}' /></td>
2847 <td allign='center'><input type='submit' name='ACTION' value='$Lang::tr{'cancel-adv-options'}' /></td>
2855 &Header
::closebox
();
2856 # print "<div align='center'><a href='/cgi-bin/ovpnmain.cgi'>$Lang::tr{'back'}</a></div>";
2857 &Header
::closebigbox
();
2858 &Header
::closepage
();