Recomiendo leer un post anterior en el que describo como está estructurada la red en el Centro.
El Profesor:
El profesor se conecta vía web a una intranet alojada en el equipo virtualizado VWEBINTERNA en cual tiene Internet Information Server como servidor web y ASP.NET habilitado (versión 4.0).
Me gusta utilizar el IIS ya que permite la seguridad integrada de NT, de tal forma que puedo indicar en el IIS no sólo que se pueda conectar desde una IP determinada, sino que puedo cambiar los permisos de las carpetas donde se encuentra las páginas, para que sólo tengan acceso los usuarios de NT que pertenezcan al grupo de profesores del centro. De esta forma el profesor con su usuario de entrada NT ya está validado y no necesitamos crear protocolos de acceso Login-Password.
Cuando un profesor inicia sesión cargará la siguiente página ASP.NET:
En ella el profesor puede escoger:
- Dejar pasar a todos los equipos o solo a algunos (aparece una lista en la que el profesor añade a los equipos).
- Dejar navegar (puerto 80) junto acceso a google; Dejar navegación segura (puertos 80 y 443); Acceso a puertos específicos (aparece una lista en la que el profesor añade los puertos); Dejar pasar todo el tráfico.
- Indicar hasta que hora se deja Internet abierto. Al llegar a esa hora el tráfico se cierra automaticamente sin que el profesor tenga que hacer nada.
En la página web, las horas que se cargan en el combo ATA (hasta en gallego) vienen de una base de datos SQL Server.
Esta entrada no pretende ser un manual de IP Tables, para eso tenéis múltiples entradas en Internet. Simplemente comentar que todas las opciones que aparecen en esta página van a tener una traducción en una entrada IPtables del ordenador VProxy.
Cuando el Profesor determina a qué equipos y puertos va a permitir acceder y hasta que hora estará habilitado Internet para esa aula, pulsará el botón 'Aplicar Reglas'.
Al hacerlo realizamos dos procesos:
- Creamos un archivo en el Servidor NT(VWebInterna) donde está alojado la página ASP.NET con las órdenes IPTables necesarias para dar acceso a Internet.
- Transferimos dicho archivo por SSH al equipo VProxy y procedemos a su ejecución. Entre las órdenes de dicho archivo se encuentran unas que crean un fichero en /etc/cron.d/AULAXX con lo necesario para eliminar las reglas que dan acceso a la hora indicada por el profesor.
Servidor Virtualizado: VPROXY
Recomiendo leer el post anterior en el que describo el equipo VProxy que es el que va a permitir salir el tráfico hacia Internet.
Enruta los paquetes desde la red interna (192.168.0.0/255.255.0.0 y 172.30.0.0/255.255.0.0) a la red conectada a Internet. Partimos de la base de que ya está configurado para enrutar el tráfico.
Dispone de dos tarjetas de red con las siguientes IP´s:
- eth1: 69.57.157.200 (red externa)
- eht0: 172.30.128.1 (red interna)
El resto de direcciones harán FORWARD.
Por defecto, se permite pasar todo el tráfico menos el que provenga de las aulas y no sea un profesor (dirección 192.168.aula.100).
Se producirá un enmascaramiento de la dirección para que las peticiones salgan con la IP externa de VProxy
El script que ejecuta el equipo es el siguiente:
IFACEIN=eth0
IFACEOUT=eth1
modprobe ip_nat_ftp
#// Activar el enrutamiento en un sistema Linux
echo "1" > /proc/sys/net/ipv4/ip_forward
# Limpiar reglas
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
iptables -F -t nat
iptables -F -t mangle
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A FORWARD -i ${IFACEIN} -o ${IFACEOUT} -j ACCEPT
iptables -t nat -A PREROUTING -i ${IFACEIN} -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -o ${IFACEOUT} -j MASQUERADE
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i ${IFACEIN} -j ACCEPT
iptables -A INPUT -i ${IFACEOUT} -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j DROP
#Dejamos pasar los servidores
iptables -I INPUT 1 -s 192.168.130.0/24 -m comment --comment "SERVIDORES" -j ACCEPT
# AULA E PROFESORES
iptables -I INPUT 1 -s 192.168.0.100/255.255.0.255 -m comment --comment "REGRAFIXA_PROFESORES" -j ACCEPT
iptables -I INPUT 3 -s 192.168.0.0/16 -m comment --comment "REGRAFIJA_ALUMNOS" -j DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o ${IFACEIN} -j ACCEPT
iptables -A OUTPUT -o ${IFACEOUT} -j ACCEPT
iptables -A OUTPUT -j DROP
# SERVIDORES
iptables -I FORWARD 1 -s 192.168.130.0/24 -m comment --comment "SERVIDORES" -j ACCEPT
# PROFESORES
iptables -I FORWARD 2 -s 192.168.0.100/255.255.0.255 -m comment --comment "REGRAFIJA_PROFESORES" -j ACCEPT
# ALUMNOS
iptables -I FORWARD 3 -s 192.168.0.0/16 -m comment --comment "REGRA_FIXA" -j DROP
En negrilla están las reglas que impiden que las aulas puedan tener acceso a Internet. Fijarse que se
INSERTAN en las primeras posiciones por lo que van primero que las que creé inicialmente que dejaban pasar todo el tráfico....
MODIFICANDO IPTABLES: ACCESO A INTERNET
Ahora llega el momento de enseñar como hago para que desde una página web desarrollada en un servidor Windows con ASP.Net le lleguen las órdenes al Proxy Linux.
Objetivo:
La idea es crear un fichero con las órdenes para dejar pasar el tráfico a un aula determinada.
Esas órdenes se aplicarán sobre el iptables. Al mismo tiempo se creará un archivo en /etc/cron.d/ donde se indicará la hora a la que el acceso a Internet debe desactivarse (es decir, borrar la entrada del iptables que afecta a esa aula).
El archivo con las órdenes se creará en el servidor windows VWebInterna y se pasará por ssh al equipo Linux VProxy.
La idea inicial era utilizar la herramienta plink . Para quien no lo sepa es un comando que permite iniciar una sesión ssh y ejecutar un archivo o comandos.
Pero resulta que plink, cuando se conecta por primera vez a un servidor, espera recibir un texto (la tecla y de yes) para guardar en caché el host-key del servidor al que se conecta.
Resulta que en versiones anteriores de plink se podía indicar que se guardara sin pedir confirmación, pero ahora ya no.
Buscando por internet encuentras esta solución:
echo y | plink -ssh root@REMOTE_IP_HERE "exit"
Pero desde ASP.Net ejecutar este comando no está permitido, ya que la cuenta desde la que se ejecuta (servicio de red) no tiene permiso para ejecutar una orden consola.También intenté por medio de un Process enviar al flujo de entrada el caracter 'y' pero no funcionó, o más bien, algunas veces parece que funcionaba, pero al cabo del tiempo, y de forma aleatoria, en el servidor quedaban ejecutándose procesos plink, supongo que esperando pulsar la tecla 'y'.
Al final buscando por Internet encontré unas librerías que permiten abrir sesiones ssh en ASP.NET: https://sshnet.codeplex.com/
Una vez incorporada a nuestro proyecto ASP.NET ya tenemos las clases necesarias para abrir una consola ssh y mandar ejecutar los comandos en el equipo con el Squid instalado (VProxy).En este apartado tenemos que diferenciar la parte en que la página web ASP.NET va a generar los comandos y la parte de enviar dichos comandos al servidor por SSH.
NOTA: Vuelvo a comentar que mi sistema es un poco 'complicado' ya que se podría desarrollar una página web php en el propio servidor VProxy y ejecutar las órdenes directamente sin necesidad de utilizar ssh, pero de esta forma me parece más seguro y aprovechando la seguridad integrada de NT en el IIS como mencioné anteriormente....
GENERANDO LOS COMANDOS:
La idea es muy simple: Debemos de añadir una orden iptables en la que dejemos pasar el tráfico de la red del aula en que nos encontremos.Primero: Identificamos el aula (en base a la IP del equipo del profesor). Así si el profesor tiene la ip 192.168.1.100 sabemos que el aula es la Aula 1 (red 192.168.1.X)
Segundo: Guardamos en un archivo de nombre firewall_aula (en el ejemplo sería firewall_1) las órdenes de iptables para habilitar o quitar el acceso a internet.
Así, cuando añadimos una regla de dejar paso hacia a Internet a el aula, añadimos a esa regla una etiqueta con el valor _AULAXX_
Cuando queremos quitar el acceso al aula, eliminamos del iptables todas las líneas con dicha etiqueta.
Operación CORTAR EL TRAFICO (sería pulsar el botón 'Pechar Internet' de la página ASP.NET'):
cadea = String.Format("iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'", obterAula())
operacionArquivo(obterNomeArquivo(), cadea, True)
' Borramos o arquivo de crontab
cadea = String.Format("rm /etc/cron.d/AULA{0}", obterAula())
operacionArquivo(obterNomeArquivo(), cadea, False)
Estas dos órdenes son las que se guardarían en el archivo. La segunda elimina el fichero a ejecutar por el CRON para cortar el acceso a Internet a una hora determinada.
- obterAula() es una función que en base a la ip obtiene el número de aula (en el ejemplo sería 1)
- obterNomeArquivo() es una función que devuelve el nombre del archivo donde se guardan estas sentencias (en el ejemplo sería firewall_1)
Operación HABILITAR EL TRAFICO (sería pulsar el botón 'Aplicar Reglas' de la página ASP.NET'):
Dependiendo de las opciones escogidas gráficamente, añadiremos más o menos reglas. Recordar que todo lo que vaya al puerto 80 es capturado por el SQUID y el resto pasa (FORWARD) a través del equipo VPROXY.
Por ejemplo, si queremos dar acceso a Internet a todos los equipos de un aula, escribiremos en el archivo:
regras(1) = String.Format("iptables -I INPUT 1 -s 192.168.{0}.0/24 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regras(1), False)
regras(2) = String.Format("iptables -I FORWARD 1 -d www.google.es -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regras(2), False)
Como vemos, en el caso de acceso a la web la regla es de tipo INPUT y a mayores, como queremos que puedan ir a google (ahora usa conexiones https) dejamos pasar el tráfico FORWARD a la dirección de www.google.es.
Fijarse como en el comentario pongo la etiqueta _AULA1_ que será utilizada después para eliminar todas las reglas que permiten el acceso al AULA1.
Ahora dependiendo de las opciones que marque el profesor en la página se van escribiendo en el archivo las órdenes IPTABLES.
Un ejemplo del archivo creado con la opción de abrir Internet con conexiones seguras sería:
iptables -S | sed '/_AULA4_/s/-A/iptables -D/e'
iptables -I INPUT 1 -s 192.168.4.0/24 -p tcp -m comment --comment '_AULA4_' -j ACCEPT
iptables -I FORWARD 1 -p tcp --dport 443 -s 192.168.4.0/24 -m comment --comment '_AULA4_' -j ACCEPT
Después añadimos al archivo las órdenes necesarias para crear en /etc/cron.d/ un archivo de cron con la hora a la que debe eliminar las reglas (de esta forma se cierra Internet automáticamente sin que el profesor haga nada).
La combo de la página ASP.NET donde está la hora que cierra Internet guarda los valores de la forma: hh:mm
' Borramos o arquivo de crontab
cadea = String.Format("rm /etc/cron.d/AULA{0}", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
cadea = String.Format("touch /etc/cron.d/AULA{0}", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
cadea = String.Format("echo ""SHELL=/bin/sh"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
cadea = String.Format("echo ""PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
' HORA PARA PECHAR INTERNET
Dim hora As String = ddlHorario.SelectedValue.Substring(0, ddlHorario.SelectedValue.IndexOf(":"))
Dim min As String = ddlHorario.SelectedValue.Substring(ddlHorario.SelectedValue.IndexOf(":") + 1)
Dim dia As String = Date.Now.Day.ToString
Dim mes As String = Date.Now.Month.ToString
cadea = String.Format("echo ""{1} {2} {3} {4} * root iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula, min.Trim, hora.Trim, dia.Trim, mes.Trim)
operacionArquivo(obterNomeArquivo(), cadea, False)
cadea = String.Format("chmod 744 /etc/cron.d/AULA{0}", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
'Recargamos o cron
cadea = String.Format("service cron reload")
operacionArquivo(obterNomeArquivo(), cadea, False)
La orden de cron sería:
String.Format("echo ""{1} {2} {3} {4} * root iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula, min.Trim, hora.Trim, dia.Trim, mes.Trim)
Esta orden borrará a la hora indicada las entradas de IPTABLES que tengan como etiqueta _AULAX_
Recordar que obterAula devuelve el número de aula y el método operacionArquivo añade al archivo la orden que le indiquemos.Un ejemplo del archivo creado para el AULA4:
rm /etc/cron.d/AULA4
touch /etc/cron.d/AULA4
echo "SHELL=/bin/sh" | sudo tee -a /etc/cron.d/AULA4
echo "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" | sudo tee -a /etc/cron.d/AULA4
echo "00 15 14 10 * root iptables -S | sed '/_AULA4_/s/-A/iptables -D/e'" | sudo tee -a /etc/cron.d/AULA4
chmod 744 /etc/cron.d/AULA4
service cron reload
PASANDO LOS COMANDOS POR SFTP A VPROXY:
Partimos de la base que el servidor VPROXY tiene instalado y configurado el servicio SSH.Una vez tenemos el archivo creado en el Servidor VWEBINTERNA, debemos de pasar dicho archivo por SSH al servidor Linux VPROXY y ejecutarlo.
Para ello hacemos uso de las librerías comentadas anteriormente (https://sshnet.codeplex.com/).
Primero pasamos el archivo al servidor. El codigo es el siguinte:
Private ReadOnly RUTA_SERVIDOR_WINDOWS As String = "C:\firewall\"
Private ReadOnly RUTA_SERVIDOR_LINUX As String = "/firewall/"
Sub chamarProcedemento(ByVal nomearquivo As String)
Dim SERVIDOR_IP As String = "AA.BB.CC.DD"
Dim PUERTO_SSH As Int16 = XXXX
'//////////////////////////////////PASAMOS O ARQUIVO AO SERVIDOR////////////////////////////////////
Dim cliente As SftpClient
Try
cliente = New SftpClient(SERVIDOR_IP, PUERTO_SSH,"USUARIO_SSH", "PASSWORD_SSH")
cliente.Connect()
Catch ex As Exception
MsgBox(ex.Message)
Return
End Try
cliente.ChangeDirectory(RUTA_SERVIDOR_LINUX)
Dim filestream As New FileStream(RUTA_SERVIDOR_WINDOWS + nomearquivo, FileMode.Open, FileAccess.Read)
cliente.BufferSize = 1024
cliente.UploadFile(filestream, nomearquivo)
filestream.Close()
filestream.Dispose()
cliente.Disconnect()
cliente.Dispose()
Como vemos, el código lo tengo dentro de un procedimiento al que le paso el nombre del archivo (recordemos que el nombre es 'firewall_NUMAULA'). Lo que hago es pasar el archivo desde C:\FIREWALL de la máquina WINDOWS al directorio /firewall/ de la máquina LINUX.
Una vez pasado, el segundo paso es ejecutarlo con una consola SSH:
'//////////////////////////////////EXECUTAMOS O SCRIPT ////////////////////////////////////
Dim ssh = New SshClient(SERVIDOR_IP, PUERTO_SSH, "USER_SSH", "PASSWORD_SSH")
ssh.Connect()
Dim answer As StringBuilder
Dim ss As ShellStream = ssh.CreateShellStream("COMANDO", 80, 24, 800, 600, 1024)
Dim reader = New StreamReader(ss)
Dim writer = New StreamWriter(ss)
writer.AutoFlush = True
While (ss.Length = 0)
Thread.Sleep(500)
End While
reader.ReadToEnd()
WriteStream("sudo su", writer, ss)
reader.ReadToEnd()
WriteStream("cd " + RUTA_SERVIDOR_LINUX, writer, ss)
reader.ReadToEnd()
WriteStream("dos2unix " + RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss) ' CONVERTIMOS A FORMAT UNIX. INSTALADO PREVIAMENTE NO SERVIDOR O executable dos2unix
reader.ReadToEnd()
WriteStream("chmod 755 " + RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss)
reader.ReadToEnd()
WriteStream(RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss) answer = ReadStream(reader)
ss.Dispose()
ssh.Disconnect()
ssh.Dispose()
La orden que ejecuta el archivo está marcada en negrilla.
Comentar que debido al formato de los archivos y a pesar que el archivo se crea como UTF-8, daba problemas y tuve que instalar en el equipo LINUX la utilidad dos2unix para pasar el formato del archivo a LINUX.
Os dejo a continuación el código completo de la página ASP.NET, pero recordando que está hecha para funcionar con mi BD en SQLServer, por lo que cada uno tendría que adaptarlo a su caso:
PAGINA ASP.NET
Comentar que guardo registro de las operaciones que realiza el profesor, por lo que en la parte inferior de la página aparece la última operación realizada y quien la hizo.firewall.aspx:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="firewall.aspx.vb" Inherits="firewall" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Internet nas AULAS</title>
<link href="App_Themes/StyleSheet.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div id='superior'>
<asp:Label ID="lblAula" runat="server" Style="text-align:center; margin:20px auto; display:block;width:60%; border-bottom:solid 1px Maroon; border-top:solid 1px Maroon;" Text="Label" Font-Bold="True" Font-Size="X-Large" ForeColor="Maroon"></asp:Label>
<asp:Label ID="lblNome" runat="server"
Style="text-align:center; margin:20px auto; display:block;width:60%;"
Text="Label" Font-Bold="True" Font-Size="Large" ForeColor="#FF6600"></asp:Label>
<br />
<asp:SqlDataSource ID="SqlDataRexistroError" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
InsertCommand="GLOBAL_RexistroError" InsertCommandType="StoredProcedure" SelectCommand="GLOBAL_RexistroError"
SelectCommandType="StoredProcedure"
ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>">
<SelectParameters>
<asp:Parameter Name="aplicacion" Type="String" />
<asp:Parameter Name="evento" Type="String" />
<asp:Parameter Name="mensaxe" Type="String" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="aplicacion" Type="String" />
<asp:Parameter Name="evento" Type="String" />
<asp:Parameter Name="mensaxe" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
<asp:Panel ID="pnlIEquiposOpcions" runat="server" GroupingText="Lista de equipos" style="margin:0px auto"
Width="70%">
<asp:RadioButtonList ID="rblEquipos" runat="server" AutoPostBack="True"
RepeatDirection="Horizontal" CellSpacing="10" ForeColor="#336699">
<asp:ListItem Selected="True" Value="0">Todos os equipos</asp:ListItem>
<asp:ListItem Value="1">Algúns equipos</asp:ListItem>
</asp:RadioButtonList>
<br />
<asp:Panel ID="pnlEquiposLista" runat="server" ForeColor="#336699" style="margin-left:10px"
HorizontalAlign="Left" Visible="False" Height="226px">
<asp:Label ID="Label1" runat="server" ForeColor="#006699"
Text="Número de equipo:"></asp:Label>
<asp:TextBox ID="txtNumEquipo" runat="server" MaxLength="3" Width="43px"></asp:TextBox>
<asp:Button ID="btnEngadirEquipo" runat="server" Text="Engadir Equipo" />
<asp:RangeValidator ID="RangeValidator1" runat="server"
ControlToValidate="txtNumEquipo"
ErrorMessage="Só son válidos números dende 1 a 199" MaximumValue="199"
MinimumValue="1" Type="Integer"></asp:RangeValidator>
<br />
<br />
<asp:ListBox ID="lstEquipos" runat="server" Height="170px" Width="178px"
ToolTip="Nota: Premer dúas veces para eliminar o equipo da lista">
</asp:ListBox>
<p /><br />
</asp:Panel>
</asp:Panel>
<asp:Panel ID="pnlProtocolos" runat="server"
GroupingText="Lista de portos e tipo de tráfico" style="margin:0px auto"
Width="70%">
<asp:CheckBox ID="chkICMP" runat="server" Text="Permitir tráfico ICMP" style="float:left;margin:5px 0px 0px 5px"
TextAlign="Left" ForeColor="#336699"/>
<p /><br />
<asp:RadioButtonList ID="rblProtocolosOpcions" runat="server" AutoPostBack="True"
RepeatDirection="Horizontal" CellSpacing="10" ForeColor="#336699">
<asp:ListItem Selected="True" Value="0">Acceso Internet (incluido google)</asp:ListItem>
<asp:ListItem Value="1">Acceso Internet con conexións seguras (Dropbox,correo,...)</asp:ListItem>
<asp:ListItem Value="2">Acceso Internet a portos específicos</asp:ListItem>
<asp:ListItem Value="3">Acceso Internet todos os portos</asp:ListItem>
</asp:RadioButtonList>
<br />
<asp:Panel ID="pnlProtocolosLista" runat="server" ForeColor="#336699" style="margin-left:10px"
HorizontalAlign="Left" Visible="False">
<asp:Label ID="Label2" runat="server" ForeColor="#006699"
Text="Número de porto:"></asp:Label>
<asp:TextBox ID="txtNumPorto" runat="server" MaxLength="5" Width="43px"></asp:TextBox>
<asp:Button ID="btnEngadirPorto" runat="server" Text="Engadir Porto" />
<asp:RangeValidator ID="RangeValidator2" runat="server"
ControlToValidate="txtNumPorto"
ErrorMessage="Só son válidos números dende 1 a 65535" MaximumValue="65535"
MinimumValue="1" Type="Integer"></asp:RangeValidator>
<br />
<br />
<asp:RadioButtonList ID="rbtlTipoProtocolo" runat="server"
RepeatDirection="Horizontal">
<asp:ListItem Selected="True" Value="tcp">TCP</asp:ListItem>
<asp:ListItem Value="udp">UDP</asp:ListItem>
</asp:RadioButtonList>
<br />
<asp:ListBox ID="lstPortos" runat="server" Height="170px"
ToolTip="Nota: Premer dúas veces para eliminar o porto da lista" Width="168px">
</asp:ListBox>
<p /><br />
</asp:Panel>
</asp:Panel>
<br />
<asp:Panel ID="pnlHabilitar" runat="server" GroupingText="Habilitar Internet" style="margin:0px auto"
Width="70%" Height="133px">
<br />
<asp:Label ID="Label3" runat="server" Text="ATA: " Font-Bold="True"
Font-Size="Large"></asp:Label>
<asp:DropDownList ID="ddlHorario" runat="server" DataSourceID="SqlDataHoras"
DataTextField="desc_horas" DataValueField="horas">
</asp:DropDownList>
<br />
<br />
<u><b>Nota:</b></u> Internet pecharase automaticamente cando se chegue á hora seleccionada<br />
<br />
<asp:SqlDataSource ID="SqlDataHoras" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="DevolucionHoras" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="tarde" Type="Boolean" />
</SelectParameters>
</asp:SqlDataSource>
<asp:Button ID="btnAbrirInternet" runat="server" Text="Aplicar Regras" />
<asp:Button ID="btnPecharInternet" runat="server" Text="Pechar Internet" />
<br />
<br />
</asp:Panel>
<br />
<br />
<asp:Panel ID="pnlUltimoAcceso" runat="server"
GroupingText="Información Ultimo Acceso" style="margin:0px auto"
Width="70%" Height="180px">
<br />
<asp:DetailsView ID="dtvwDatosRexistro" runat="server" AutoGenerateRows="False" style="margin:0px auto"
CellPadding="4" DataSourceID="SqlDataRexistroActividade"
EmptyDataText="Sen Datos" ForeColor="#333333" GridLines="None" Height="50px"
HorizontalAlign="Center" Width="820px">
<AlternatingRowStyle BackColor="White" />
<CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" HorizontalAlign="Left" />
<EditRowStyle BackColor="#2461BF" />
<FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" HorizontalAlign="Left"
Width="30%" />
<Fields>
<asp:BoundField DataField="nome_prof" HeaderText="Nome do Profesor:"
SortExpression="nome_prof" />
<asp:BoundField DataField="hora_permiso" HeaderText="Dia/Hora do permiso:"
SortExpression="hora_permiso" />
<asp:BoundField DataField="ata_hora" HeaderText="Ata a hora:"
SortExpression="ata_hora" />
<asp:TemplateField HeaderText="Tipo de permiso:" SortExpression="tipo_permiso">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("tipo_permiso") %>'></asp:TextBox>
</EditItemTemplate>
<InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("tipo_permiso") %>'></asp:TextBox>
</InsertItemTemplate>
<ItemTemplate>
<br />
<asp:TextBox ID="TextBox2" runat="server" ReadOnly="True" Rows="4"
Text='<%# Bind("tipo_permiso", "{0}") %>' TextMode="MultiLine" Width="80%"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Fields>
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#EFF3FB" />
</asp:DetailsView>
<br />
<br />
<asp:SqlDataSource ID="SqlDataHoras0" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="DevolucionHoras"
SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="tarde" Type="Boolean" />
</SelectParameters>
</asp:SqlDataSource>
<br />
</asp:Panel>
<asp:SqlDataSource ID="SqlDataRexistroActividade" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
InsertCommand="AltaRexistro" InsertCommandType="StoredProcedure"
SelectCommand="ConsultaRexistro" SelectCommandType="StoredProcedure">
<InsertParameters>
<asp:Parameter Name="aula" Type="String" />
<asp:Parameter Name="ip" Type="String" />
<asp:Parameter Name="ata_hora" Type="String" />
<asp:Parameter Name="tipo_permiso" Type="String" />
</InsertParameters>
<SelectParameters>
<asp:ControlParameter ControlID="ddlAulas" Name="aula"
PropertyName="SelectedItem.Text" Type="String" />
<asp:Parameter DefaultValue="0" Name="tipo" />
</SelectParameters>
</asp:SqlDataSource>
<br />
</div>
<asp:Label ID="lblErro" runat="server" Text="Label" EnableViewState="False" Visible="False" Font-Size="X-Large" ForeColor="#C04000"></asp:Label>
<asp:SqlDataSource ID="SqlDataDatosProfesor" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>"
SelectCommand="Devolucion_DatosProfesor"
SelectCommandType="StoredProcedure"></asp:SqlDataSource>
</form>
</body>
</html>
firewall.aspx.vb:
Imports System.IO
Imports System.Net
Imports System.Diagnostics
Imports System.Security
Imports System.Threading
Imports Renci.SshNet
Partial Class firewall
Inherits System.Web.UI.Page
Private ReadOnly RUTA_SERVIDOR_WINDOWS As String = "C:\firewall\"
Private ReadOnly RUTA_SERVIDOR_LINUX As String = "/firewall/"
Private ip_conectado As String
Sub chamarProcedemento(ByVal nomearquivo As String)
Dim SERVIDOR_IP As String = "AA.BB.CC.DD"
Dim PUERTO_SSH As Int16 = PUERTO_SSH
'//////////////////////////////////PASAMOS O ARQUIVO AO SERVIDOR////////////////////////////////////
Dim cliente As SftpClient
Try
cliente = New SftpClient(SERVIDOR_IP, PUERTO_SSH, "USER_SSH", "PASSWORD_SSH")
cliente.Connect()
Catch ex As Exception
MsgBox(ex.Message)
Return
End Try
cliente.ChangeDirectory("/firewall")
Dim filestream As New FileStream(RUTA_SERVIDOR_WINDOWS + nomearquivo, FileMode.Open, FileAccess.Read)
cliente.BufferSize = 1024
cliente.UploadFile(filestream, nomearquivo)
filestream.Close()
filestream.Dispose()
cliente.Disconnect()
cliente.Dispose()
'//////////////////////////////////EXECUTAMOS O SCRIPT ////////////////////////////////////
Dim ssh = New SshClient(SERVIDOR_IP, PUERTO_SSH, "USER_SSH", "PASSWORD_SSH")
ssh.Connect()
Dim answer As StringBuilder
Dim ss As ShellStream = ssh.CreateShellStream("COMANDO", 80, 24, 800, 600, 1024)
Dim reader = New StreamReader(ss)
Dim writer = New StreamWriter(ss)
writer.AutoFlush = True
While (ss.Length = 0)
Thread.Sleep(500)
End While
reader.ReadToEnd()
WriteStream("sudo su", writer, ss)
reader.ReadToEnd()
WriteStream("cd " + RUTA_SERVIDOR_LINUX, writer, ss)
reader.ReadToEnd()
WriteStream("dos2unix " + RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss) ' CONVERTIMOS A FORMAT UNIX. INSTALADO PREVIAMENTE NO SERVIDOR O executable dos2unix
reader.ReadToEnd()
WriteStream("chmod 755 " + RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss)
reader.ReadToEnd()
WriteStream(RUTA_SERVIDOR_LINUX + obterNomeArquivo(), writer, ss)
answer = ReadStream(reader)
ss.Dispose()
ssh.Disconnect()
ssh.Dispose()
End Sub
Private Sub gardarErro(ByVal aplicacion As String, ByVal mensaxe As String, ByVal evento As String)
Me.SqlDataRexistroError.InsertParameters("aplicacion").DefaultValue = aplicacion
Me.SqlDataRexistroError.InsertParameters("evento").DefaultValue = evento
Me.SqlDataRexistroError.InsertParameters("mensaxe").DefaultValue = mensaxe
Me.SqlDataRexistroError.Insert()
End Sub
Private Sub amosarErro(ByVal mensaxe As String)
lblErro.Text = mensaxe
lblErro.Visible = True
End Sub
Private Function obterNomeArquivo() As String
Return "firewall_" + obterAula() + ".txt"
End Function
Private Function obterAula() As String
Try
Dim ip As String
If (ddlAulas.Visible = True) Then
If ddlAulas.SelectedIndex <> -1 Then
ip = ddlAulas.SelectedValue
Else
ip = ddlAulas.Items(0).Value
End If
Else
ip = ip_conectado
End If
Dim tercerpunto As Integer = ip.LastIndexOf(".") - 1
Dim segundopunto As Integer = ip.LastIndexOf(".", tercerpunto - 1)
Dim aula As String = ip.Substring(segundopunto + 1, tercerpunto - segundopunto)
'If aula.Length = 1 Then
' aula = "0" + aula
'End If
Return aula
Catch ex As Exception
Return Nothing
End Try
End Function
Private Sub operacionArquivo(ByVal nomearquivo As String, ByVal cadea As String, ByVal borrar As Boolean)
' Xera o arquivo para abrir ou pechar Internet nunha aula
Dim arquivoescritura As IO.StreamWriter
Dim aberto As Boolean = False
Try
If (borrar) Then
IO.File.Delete(RUTA_SERVIDOR_WINDOWS + nomearquivo)
End If
If Not IO.File.Exists((RUTA_SERVIDOR_WINDOWS + nomearquivo)) Then
arquivoescritura = New StreamWriter((RUTA_SERVIDOR_WINDOWS + nomearquivo), False, Encoding.UTF8)
Else
arquivoescritura = New StreamWriter((RUTA_SERVIDOR_WINDOWS + nomearquivo), True, Encoding.UTF8)
End If
arquivoescritura.NewLine = ControlChars.Lf ' PARA S.O. LINUX
' DE TODAS FORMAS DEIXA CARACTERES 'RAROS' POLO TIPO UTF8. => Convertimos no servidor a linux
arquivoescritura.WriteLine(cadea)
arquivoescritura.Close()
Catch ex As Exception
amosarErro("ERRO: " + ex.Message)
End Try
End Sub
Private Function establecerEstado() As Boolean
Dim primerpunto As Integer = ip_conectado.IndexOf(".") + 1
Dim segundopunto As Integer = ip_conectado.IndexOf(".", primerpunto + 1) + 1
Dim tercerpunto As Integer = ip_conectado.IndexOf(".", segundopunto + 1) + 1
Dim resul As Data.DataView
Try
resul = Me.SqlDataDatosProfesor.Select(DataSourceSelectArguments.Empty)
Me.lblNome.Text = "Profesor conectado: " + resul.Item(0).Row.Item("nombre")
dtvwDatosRexistro.Visible = True
lblAula.Text = "AULA " + obterAula()
Return True
Catch ex As Exception
gardarErro("FIREWALL", ex.Message, "Metodo EstablecerEstado")
amosarErro(ex.Message)
Return False
End Try
End Function
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ip_conectado = Request.ServerVariables("REMOTE_ADDR")
If (Not IsPostBack) Then
establecerEstado()
End If
' Xestionamos o double click das listas
lstEquipos.Attributes.Add("ondblclick", ClientScript.GetPostBackEventReference(lstEquipos, "event_lstEquipos_doubleclicklista"))
If (Request("__EVENTARGUMENT") IsNot vbNullString) And (Request("__EVENTARGUMENT") = "event_lstEquipos_doubleclicklista") Then
lstEquipos.Items.RemoveAt(lstEquipos.SelectedIndex)
End If
lstPortos.Attributes.Add("ondblclick", ClientScript.GetPostBackEventReference(lstEquipos, "event_lstPortos_doubleclicklista"))
If (Request("__EVENTARGUMENT") IsNot vbNullString) And (Request("__EVENTARGUMENT") = "event_lstPortos_doubleclicklista") Then
lstPortos.Items.RemoveAt(lstPortos.SelectedIndex)
End If
End Sub
Protected Sub rblEquipos_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rblEquipos.SelectedIndexChanged
If rblEquipos.SelectedValue = 0 Then
lstEquipos.Items.Clear()
pnlEquiposLista.Visible = False
Else
pnlEquiposLista.Visible = True
End If
End Sub
Protected Sub btnEngadirEquipo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEngadirEquipo.Click
Dim elem As New ListItem("EQUIPO " + txtNumEquipo.Text, txtNumEquipo.Text)
Dim elemLista As ListItem = lstEquipos.Items.FindByText("EQUIPO " + txtNumEquipo.Text)
If (txtNumEquipo.Text <> "") Then
If Not IsNothing(elemLista) Then
enviarMensaxeCliente("O EQUIPO XA ESTÁ NA LISTA")
Else
lstEquipos.Items.Add(elem)
End If
txtNumEquipo.Text = ""
End If
End Sub
Protected Sub btnEngadirPorto_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEngadirPorto.Click
If txtNumPorto.Text <> "" Then
Dim elemLista As ListItem = lstPortos.Items.FindByText("PORTO " + txtNumPorto.Text)
If Not IsNothing(elemLista) Then
enviarMensaxeCliente("O PORTO XA ESTÁ NA LISTA")
Else
lstPortos.Items.Add(New ListItem("PORTO " + txtNumPorto.Text + "(" + rbtlTipoProtocolo.Text + ")", txtNumPorto.Text + "-" + rbtlTipoProtocolo.Text))
End If
txtNumPorto.Text = ""
End If
End Sub
Protected Sub rblProtocolosOpcions_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rblProtocolosOpcions.SelectedIndexChanged
If rblProtocolosOpcions.SelectedValue = 2 Then
pnlProtocolosLista.Visible = True
Else
lstPortos.Items.Clear()
pnlProtocolosLista.Visible = False
End If
End Sub
Protected Sub SqlDataHoras_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataHoras.Selecting
' Cargamos as horas de maña ou tarde
If (DateTime.Now.Hour < 15) Then
e.Command.Parameters.Item("@tarde").Value = 0
Else
e.Command.Parameters.Item("@tarde").Value = 1
End If
End Sub
Private Sub WriteStream(ByVal cmd As String, ByVal writer As StreamWriter, ByVal stream As ShellStream)
writer.WriteLine(cmd)
While (stream.Length = 0)
Thread.Sleep(500)
End While
End Sub
Private Function ReadStream(ByVal reader As StreamReader) As StringBuilder
Dim result As StringBuilder = New StringBuilder()
Dim line As String = "EMPEZANDO"
While (line IsNot Nothing)
line = reader.ReadLine()
result.AppendLine(line)
End While
Return result
End Function
Protected Sub btnPecharInternet_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPecharInternet.Click
Dim cadea As String
' Primeiro eliminamos as regras que teríamos postas no iptables e borramos o arquivo de cron.d desa aula
cadea = String.Format("iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'", obterAula())
operacionArquivo(obterNomeArquivo(), cadea, True)
' Borramos o arquivo de crontab
cadea = String.Format("rm /etc/cron.d/AULA{0}", obterAula())
operacionArquivo(obterNomeArquivo(), cadea, False)
lstEquipos.Items.Clear()
lstPortos.Items.Clear()
rblEquipos.SelectedIndex = 0
rblProtocolosOpcions.SelectedIndex = 0
pnlProtocolosLista.Visible = False
pnlEquiposLista.Visible = False
chkICMP.Checked = False
chamarProcedemento(obterNomeArquivo())
enviarMensaxeCliente("OPERACION REALIZADA")
End Sub
Private Sub enviarMensaxeCliente(ByVal mensaxe As String)
Dim codigo As String = String.Format("<script type=""text/javascript"">alert('{0}');</script>", mensaxe)
Page.ClientScript.RegisterClientScriptBlock(Me.GetType, "detallesocio", codigo)
End Sub
Protected Sub btnAbrirInternet_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAbrirInternet.Click
Dim numregra As Integer
Dim regra As String
Dim cadea As String
Dim hora_fin_cadea As String = ddlHorario.SelectedValue
Dim hora_actual As New DateTime
Dim hora_fin As New DateTime(Date.Now.Year, Date.Now.Month, Date.Now.Day, Integer.Parse(hora_fin_cadea.Substring(0, hora_fin_cadea.IndexOf(":"))), Integer.Parse(hora_fin_cadea.Substring(hora_fin_cadea.IndexOf(":") + 1)), 0)
' LANZAMOS O SCRIPT AO SERVIDOR
hora_actual = DateTime.Now
If (hora_actual.CompareTo(hora_fin) > 0) Then
enviarMensaxeCliente("A hora de fin de acceso a Internet non pode ser menor que a hora actual...")
Return
End If
' Primeiro eliminamos as regras que teríamos postas no iptables e borramos o arquivo de cron.d desa aula
cadea = String.Format("iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, True)
If rblEquipos.SelectedValue = 1 And lstEquipos.Items.Count > 0 Then ' MARCAMOS ALGUN EQUIPO
If rblProtocolosOpcions.SelectedValue = 0 Or rblProtocolosOpcions.SelectedValue = 1 Then
' ============================REGRAS DE ACCESO A INTERNET BASICO PARA ALGUNS EQUIPOS==================================
For Each equipo As ListItem In lstEquipos.Items
If rblProtocolosOpcions.SelectedValue = 0 Then
' EQUIPOS
regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
operacionArquivo(obterNomeArquivo(), regra, False)
regra = String.Format("iptables -I FORWARD 1 -d www.google.es -s 192.168.{0}.{1}/32 -m comment --comment '_AULA{0}_' -j ACCEPT ", obterAula, equipo.Value)
operacionArquivo(obterNomeArquivo(), regra, False)
End If
Next
End If
If rblProtocolosOpcions.SelectedValue = 1 Then ' ACCESO SEGURO PARA ALGUNS EQUIPOS
For Each equipo As ListItem In lstEquipos.Items
regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
operacionArquivo(obterNomeArquivo(), regra, False)
regra = String.Format("iptables -I FORWARD 1 -p tcp --dport 443 -s 192.168.{0}.{1}/32 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
operacionArquivo(obterNomeArquivo(), regra, False)
Next
End If
If rblProtocolosOpcions.SelectedValue = 2 Then ' ACCESO A ALGUNS PORTOS
' ============================regras de acceso a portos especificos==================================
If (lstPortos.Items.Count > 0) Then
For Each equipo As ListItem In lstEquipos.Items
For Each porto As ListItem In lstPortos.Items
Dim separacion = porto.Value.IndexOf("-")
Dim porto_ = porto.Value.Substring(0, separacion)
Dim proto_ = porto.Value.Substring(separacion + 1)
If (porto_ = 80) Then ' Se é porto 80 vai por SQUID => INPUT
regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
Else
regra = String.Format("iptables -I FORWARD 1 -p " + proto_ + " --dport {1} -s 192.168.{0}.{2}/32 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, porto_, equipo.Value)
End If
operacionArquivo(obterNomeArquivo(), regra, False)
Next
Next
End If
End If
If rblProtocolosOpcions.SelectedValue = 3 Then ' ACCESO TOTAL A ALGUNS EQUIPOS
For Each equipo As ListItem In lstEquipos.Items
regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
operacionArquivo(obterNomeArquivo(), regra, False)
regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.{1}/32 -p udp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
operacionArquivo(obterNomeArquivo(), regra, False)
regra = String.Format("iptables -I FORWARD 1 -p tcp -s 192.168.{0}.{1}/32 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
operacionArquivo(obterNomeArquivo(), regra, False)
regra = String.Format("iptables -I FORWARD 1 -p udp -s 192.168.{0}.{1}/32 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
operacionArquivo(obterNomeArquivo(), regra, False)
Next
End If
If chkICMP.Checked Then ' TRAFICO ICMP
For Each equipo As ListItem In lstEquipos.Items
regra = String.Format("iptables -I FORWARD 1 -s 192.168.{0}.{1}/24 -p icmp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, equipo.Value)
operacionArquivo(obterNomeArquivo(), regra, False)
Next
End If
Else ' TODOS OS EQUIPOS DA AULA
' ============================REGRAS DE ACCESO A INTERNET BASICO PARA TODOS OS EQUIPOS==================================
If rblProtocolosOpcions.SelectedValue = 0 Then
' EQUIPOS
regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.0/24 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regra, False)
regra = String.Format("iptables -I FORWARD 1 -d www.google.es -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regra, False)
End If
'' ============================REGRAS DE ACCESO A INTERNET SEGURO==================================
If (rblProtocolosOpcions.SelectedValue = 1) Then
regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.0/24 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regra, False)
regra = String.Format("iptables -I FORWARD 1 -p tcp --dport 443 -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regra, False)
End If
' ============================regras de acceso a portos especificos==================================
If (rblProtocolosOpcions.SelectedValue = 2) And (lstPortos.Items.Count > 0) Then
For Each porto As ListItem In lstPortos.Items
Dim separacion As String = porto.Value.IndexOf("-")
Dim porto_ As String = porto.Value.Substring(0, separacion)
Dim proto_ As String = porto.Value.Substring(separacion + 1)
If (porto_ = "80") Then ' Se é porto 80 vai por SQUID => INPUT
regra = String.Format("iptables -I INPUT 1 -s 192.168.{0}.0/24 -p tcp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
Else
regra = String.Format("iptables -I FORWARD 1 -p " + proto_ + " --dport {1} -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula, porto_)
End If
operacionArquivo(obterNomeArquivo(), regra, False)
Next
End If
If rblProtocolosOpcions.SelectedValue = 3 Then ' ACCESO TOTAL A TODOS EQUIPOS
regra = String.Format("iptables -I INPUT 1 -p tcp -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regra, False)
numregra += 1
regra = String.Format("iptables -I INPUT 1 -p udp -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regra, False)
regra = String.Format("iptables -I FORWARD 1 -p tcp -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regra, False)
regra = String.Format("iptables -I FORWARD 1 -p udp -s 192.168.{0}.0/24 -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regra, False)
End If
If chkICMP.Checked Then
regra = String.Format("iptables -I FORWARD 1 -s 192.168.{0}.0/24 -p icmp -m comment --comment '_AULA{0}_' -j ACCEPT", obterAula)
operacionArquivo(obterNomeArquivo(), regra, False)
End If
End If
'===============CRONTAB=====================
' Cambiamnos os permisos para que se poida borrar
cadea = String.Format("chmod 777 /etc/cron.d/AULA{0}.sh", obterAula)
' Borramos o arquivo de crontab
cadea = String.Format("rm /etc/cron.d/AULA{0}", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
cadea = String.Format("touch /etc/cron.d/AULA{0}", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
cadea = String.Format("echo ""SHELL=/bin/sh"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
cadea = String.Format("echo ""PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
' HORA PARA PECHAR INTERNET
Dim hora As String = ddlHorario.SelectedValue.Substring(0, ddlHorario.SelectedValue.IndexOf(":"))
Dim min As String = ddlHorario.SelectedValue.Substring(ddlHorario.SelectedValue.IndexOf(":") + 1)
Dim dia As String = Date.Now.Day.ToString
Dim mes As String = Date.Now.Month.ToString
cadea = String.Format("echo ""{1} {2} {3} {4} * root iptables -S | sed '/_AULA{0}_/s/-A/iptables -D/e'"" | sudo tee -a /etc/cron.d/AULA{0} ", obterAula, min.Trim, hora.Trim, dia.Trim, mes.Trim)
operacionArquivo(obterNomeArquivo(), cadea, False)
cadea = String.Format("chmod 744 /etc/cron.d/AULA{0}", obterAula)
operacionArquivo(obterNomeArquivo(), cadea, False)
'Recargamos o cron
cadea = String.Format("service cron reload")
operacionArquivo(obterNomeArquivo(), cadea, False)
' REXISTRAMOS A ENTRADA NA BD.
SqlDataRexistroActividade.InsertParameters("aula").DefaultValue = lblAula.Text
SqlDataRexistroActividade.InsertParameters("ip").DefaultValue = ip_conectado
SqlDataRexistroActividade.InsertParameters("ata_hora").DefaultValue = ddlHorario.SelectedValue
Dim mensaxe As String = "EQUIPOS:" + rblEquipos.SelectedItem.Text + vbNewLine
If rblEquipos.SelectedValue = 1 Then ' Indicamos os equipos
For Each equipo As ListItem In lstEquipos.Items
mensaxe += vbTab + " ----> " + equipo.Text + vbNewLine
Next
End If
mensaxe += "TIPO CONEXION:" + vbNewLine
If chkICMP.Checked Then
mensaxe += vbTab + chkICMP.Text + vbNewLine
End If
mensaxe += vbTab + rblProtocolosOpcions.SelectedItem.Text + vbNewLine
If rblProtocolosOpcions.SelectedValue = 2 Then
For Each porto As ListItem In lstPortos.Items
mensaxe += vbTab + " ----> " + porto.Text + vbNewLine
Next
End If
SqlDataRexistroActividade.InsertParameters("tipo_permiso").DefaultValue = mensaxe
SqlDataRexistroActividade.Insert()
chamarProcedemento(obterNomeArquivo)
enviarMensaxeCliente("OPERACION FEITA.")
End Sub
Protected Sub SqlDataRexistroActividade_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataRexistroActividade.Selecting
If ddlAulas.Visible = False Then
e.Command.Parameters("@aula").Value = lblAula.Text
End If
End Sub
End Class
Y eso es todo.
Un saludo y hasta la próxima entrada.
No hay comentarios:
Publicar un comentario