1 По безопасности : Можно использовать VPN ... (Упрятав простой но не безопасный сервис  внутри защищенной сети   )
Кстати а можно ли используя VPN параллельно иметь доступ к ресурсам обычного интернета или нужен некий специальный шлюз ?)   
2  
   Задача сделать "интернет" без серверов
 Мой пост "с  картинками"  смотрел ?
Именно это и делает мой  гибрид сервера и браузера : Создает "виртуальный  сервер"  строит помощью системы встроенных скриптов веб-интерфейс для веб-приложения  который "не отходя от кассы" используется во встроенном браузере.    
Может показаться, что это "самоедский цикл" годный только для "локального" веб-приложения.  Однако это не так!
 Суть в том, что сервер при всей своей "виртуальности" может быть доступен глобально (При нормальном "внешнем" IP  ).
То есть одно веб-приложение может управлять целым кластером серверов разбросанных по  всему интернету, а те вовсю очередь слать запрос этот конкретный сервер .
(Кстати, простейшая защита все-же уже присутствует  в виде возможности использовать нестандартный  порт вместо 80-го)
"Дальше больше" поскольку сервер полностью "свой в доску" его можно заставить делать, что угодно  (У меня он умеет выполнять внешние утилиты, рисовать графику,  использовать БД и тд ... Разумеется все это должно быть описано в "сервером  скрипте" ...  а часть потенциально  опасных действий вообще доступна  только  при описании их в "белом списке" редактирование, которого по замыслу доступно только оффлайн.  Но прикол в том,, что сам северный скрипт вполне можно сделать загружаемым или редактируемым в он-лайн !  ).             
Как пример вот  мой старый скрипт генерации страницы "теста графики".
(То есть где-то есть простой файл конфигурации где есть вот такая сточка :
N :"Тест графики " ID:"pageGraph001" NBP :"gr001.htm" NFS :"gr001.pas" OP :"[REM]//Построить график //[OPTION]//A=1//B=PIC.JPG////"
и при обращении 
http://<адрес сервера>/pageGraph001 выполняется скрипт Скрипт  ''Тест графики ''   )   
Собственно скрипт ...
- Код: Выделить всё
- (*SEdit*********************************
 Генерация 2
 Скрипт  ''Тест графики ''
 VN:"Ap_FIL" REM:"Запрос" NZ:"index.htm"
 VN:"Ap_ZAP" REM:"Расширенный запрос " NZ:""
 VN:"ADV_URL" REM:"Расширение адреса" NZ:""
 VN:"BPage" REM:"Фон" NZ:"F.htm"
 VN:"POpt" REM:"Опции" NZ:"Var_A=' FFF';"
 
 //****************************************)
 // Скрипт  ''Тест графики ''
 Var
 REZ,FP:String;
 Ap_FIL:String;
 Ap_ZAP:String;
 ADV_URL:String;
 BPage:String;
 SavZP:String;
 Procedure WL(S:String);
 begin
 REZ:= REZ+S+#13+#10;
 end;
 Procedure HR(Tx,url:String);
 begin
 WL('<a href="'+URL+'">'+TX+'</a>');
 end;
 
 Procedure BT(Tx,url:String);
 begin
 WL('<input type="submit" value="'
 +TX+'"onclick=' +#39+ 'document.location = "'
 +ADV_URL+URL+'"'+#39+' >');
 end;
 
 Procedure BT2(Tx:String);
 begin
 WL('<input type="submit" value="'+TX+'" >');
 end;
 
 Procedure INP(ID,VL:String);
 begin
 WL( ID+' <input type="text" name="memo" value="'+VL+'" >');
 end;
 
 Procedure INP_PSW(ID,VL:String);
 begin
 WL(ID+' <input type="password"  name="psw" value="'+VL+'" >');
 end;
 
 Procedure BR;
 begin
 WL( '<br>');
 end;
 
 Type
 Real=  Double;
 //Const pI:Double=3.14;
 
 Var
 v11,v12,v13,v21,v22,v23,v32,v33,v43,
 screen_dist:real;
 C1:real;c2:Real;
 ///var p, i,j,k,iu,ju,ku, x,y,s,shag:Real;
 procedure Persp(x,y,z:Real;var XX,YY:Real);
 var
 xe,ye,ze:real;
 begin
 
 xe:=v11*x+v21*y;
 ye:=v12*x+v22*y+v32*z;
 ze:=v13*x+v23*y+v33*z+v43;
 
 XX:=Screen_dist*xe/Ze+c1;
 YY:=Screen_dist*ye/Ze+c2;
 end;
 Var vx,vy,Color:Integer;
 Procedure dw(x,y,z:real);
 var xx,yy: Real;
 x1,y1:Integer;
 begin
 persp(x,y,z,xx,yy);
 {x1:=Round(XX*50);Y1:=Round(yy)*50;}
 x1:=10+trunc(XX*50);Y1:=10+trunc(yy*50);
 DrawOnIMG('W12','LINE',IntToStr(x1 div 2)+','+IntToStr(y1 div 2)+','+IntToStr(vx div 2)+','+IntToStr(vy div 2));
 //msg(IntToStr(x1)+','+IntToStr(y1)+IntToStr(vx)+','+IntToStr(vy));
 //line(X1,y1,vx,vy,Color);
 vx:=x1;vy:=y1;
 end;
 Procedure Mw(x,y,z:real);
 var xx,yy: Real;
 x1,y1:Integer;
 begin
 persp(x,y,z,xx,yy);
 vx:=10+trunc(XX*50);vY:=10+trunc(yy*50);
 end;
 procedure cof(Rho,theta,phi:real);
 var
 ph,  th,costh,sinth,cosph,sinph,Factor:real;
 begin
 Factor:=pi/180;
 th:=theta*factor; ph:=phi*factor;
 Costh:=cos(th); sinth:=Sin(th);
 Cosph:=cos(ph); sinph:=Sin(ph);
 v11:= -sinth;v12:=-cosph*costh;v13:=-sinph*Costh;
 v21:=costh; v22:=-cosph*Sinth; v23:=-sinph*sinth;
 v32:=sinph;        v33:=-Cosph;
 v43:=rho;
 end;
 procedure drawKub( Rho,theta,phi:real);
 //const h=20;
 var
 H:Integer;
 begin
 h:=50;
 mw(h,-h,-h);dw(h,h,-h);
 dw(-h,h,-h);
 dw(-h,h,h);
 dw(-h,-h,h);
 dw(h,-h,h);
 dw(h,-h,-h);
 mw(h,h,-h);dw(h,h,h);
 dw(-h,h,h);
 mw(h,h,h);dw(h,-h,h);
 mw(h,-h,-h);dw(-h,-h,-h);
 dw(-h,h,-h);
 mw(-h,-h,-h);dw(-h,-h,h);
 end;
 
 procedure draw3(XZ:integer);
 var p, i,j,k,iu,ju,ku, x,y,s,shag:Real;
 begin
 screen_dist:=4;
 J:=30;k:=70;
 Ju:=30;ku:=70;
 i:=100; iu:=200;
 Shag:=4;
 cof(i+xZ,j-xz,k+xz);
 //cof(i+8,j,k);
 mw(0,0,50);dw(0,0,0);
 mw(50,50,50);dw(-50,-50,50);
 mw(-50,50,50);dw(50,-50,50);
 
 p:=0; S:=pi/(2+Rnd(6));
 while P<2*pi do begin
 mw(0,0,0);dw(20*Cos(p),20*Sin(p),-25+rnd(15));
 p:=P+s;
 end;
 p:=0;x:=0; S:=pi/(2+Rnd(6));
 mw((x+20)*Cos(p),(x+20)*Sin(p),-25+x/2);
 while P<4*pi do
 begin
 Color:=Rnd(15);
 
 X:=x+3;
 dw((X+20)*Cos(p),(x+20)*Sin(p),-25+x/2);
 p:=P+s;
 end;
 drawKub(i,j,k);
 //drawKub(100,1,1);
 end;
 var
 S:String;
 X,y:Integer;
 begin
 C1:=4.5;c2:=3.5;
 rez:='';
 Ap_FIL:= GetParam('Ap_FIL');
 Ap_ZAP:= GetParam('Ap_ZAP');
 ADV_URL:= GetParam('ADV_URL');
 SavZP:= GetParam('SavZP');
 SetParam('SavZP',REZ);
 
 //rez:=R_LoadText('f1.htm')+ REZ+ R_LoadText('f2.htm');
 br;br;br;
 //----------------------------
 //Тут размещается основной код
 WL('<html>');
 WL('<script language="javascript">');
 WL('  function timer11(_data_){');
 WL(' document.location = "pageGraph001" ');
 WL(' }</script>');
 
 WL('<body onload='+#39+'setInterval("timer11()",1500);'+#39+'>');
 //'+#39+'document.location = "'+ADV_URL+'pageLLL"'+#39+'
 WL( ' Уже работает ... ');
 If ExecUtil('Load_WC.ex') then
 WL('<img src='+#39+'K.jpg'+#39+' alt='+#39+'Logo'+#39+' id='+#39+'logo'+#39+'  style="width: 30%; height: 30%;"<br><br>')
 else
 WL('<img src='+#39+'http://91.237.244.6/files/image.jpg?dummy=1445094378184'+#39+' alt='+#39+'Logo'+#39+' id='+#39+'logo'+#39+'  style="width: 30%; height: 30%;"<br><br>');
 br;br;
 WL('<center>');
 WL('<B>Окно в мир графики ..</B>');br;
 br;
 WL('<img src='+#39+'K1.jpg'+#39+' alt='+#39+'Logo'+#39+' id='+#39+'logo'+#39+'  style="width: 60%; height: 40%;"<br><br>')
 WL('</center>');
 WL('  </body>');
 WL('</html>');
 
 NewIMG('W12',320,200)
 LoadIMG('W12','K0.JPG');
 //DrawOnIMG('W12','CLEAR','');
 
 //DrawOnIMG('W12','RectANGLE','1,1,50,50');
 DrawOnIMG('W12','SetCOLoR','$F1010');
 DrawOnIMG('W12','FRAME','1,1,50,50');
 DrawOnIMG('W12','ELLIPSE','1,1,50,50');
 DrawOnIMG('W12','SetBrCOLoR','$FF');
 DrawOnIMG('W12','FillRect','1,1,20,20');
 DrawOnIMG('W12','SetBrCOLoR','$ffffFF');
 X:=25-RnD(50); Y:=25-RnD(50);
 
 DrawOnIMG('W12','LINE','25,25,'+IntToStr(25+x)+','+IntToStr(25+x));
 X:=StrToInt(GetParam('X')); If X>25 then X:=0;
 
 DrawOnIMG('W12','LINE','25,25,'+IntToStr(25+x)+',0');
 SetParam('X',IntToStr(X+3));
 DrawOnIMG('W12','outText','25,25,'+IntToStr(25+x));
 draw3(X);
 SaveIMG('W12','K1.jpg',true,true);
 
 DeleteIMG('W12');//!!!!
 
 //-------------------------------
 BPage:= R_LoadText(GetParam('BPage'));
 BPage:=StrReplace(BPage,'PAGE_NAME','Тест 999');
 rez:=StrReplace(BPage,'<ZZZ>',REZ);
 
 SetParam('OUT',REZ);
 end.
 
Что делает скрипт ?
 Генерирует страничку для сервера в которой показывает кадр  с веб-камеры   + рисует на картинке что-то вроде кадра 3д-анимации 
(В страничку встроен скрипт который тупо  перезагружает ее по таймеру  каждые полторы секунды )