Comparez les prix des domaines et des services informatiques des vendeurs du monde entier

hostapd Câblé 802.1x Avec pont

j'ai APU PCEngines régi par Debian Jessie.

J'essaie de configurer hostapd Pour effectuer une authentification filaire 802.1x sur le contrôleur de domaine distant sur lequel il exécute NPS sur 2008 R2.

J'aimerais 2 À partir de ses ports réseau, ils ont rejoint l'interface du pont après l'authentification dans laquelle notre sous-réseau sera configuré, le relais DHCP et l'adresse IP du routeur, avec lequel nos clients peuvent être touchés.

Après une fracture, le paramètre "pont" de configuration dans hostapd Il semble applicable uniquement pour les conducteurs spécifiques WiFi, et pas pour un conducteur filaire.

Si j'ajoute des ports au pont lors du chargement, mais sur chaque interface est en cours d'exécution hostapd, Les utilisateurs peuvent passer du trafic et utilisent des interfaces sans authentification.

Sans cela, les clients peuvent se connecter et s'authentifier correctement, mais évidemment, ils n'ont aucun réseau avec lequel ils pourraient parler (J'ai essayé de définir le paramètre de configuration du pont, en espérant qu'elle se connecterait automatiquement au pont, mais ce n'était pas).

Ma configuration hostapd comme suit:

interface=eth1

driver=wired

ieee8021x=1

use_pae_group_addr=1

eap_reauth_period=3600
eapol_version=2

# RADIUS authentication server
auth_server_addr=**secret**
auth_server_port=1812
auth_server_shared_secret=**secret**
# RADIUS accounting server
acct_server_addr=**secret**
acct_server_port=1813
acct_server_shared_secret=**secret**

logger_syslog=-1
logger_syslog_level=2

Est-ce que quelqu'un sait s'il est possible que j'ai besoin, ou que je fais mal?

Éditer:

je lis ça hostapd Ne met pas en place une pile d'authentification complète pour un pilote "câblé", il ne peut donc pas être utilisé pour protéger le port en utilisant 802.1x de la boite.

J'ai également lu que vous pouvez utiliser l'interface de contrôle pour écouter des événements, puis utiliser le programme de contrôle de pont externe.

Je l'ai fait, et cela fonctionne initialement, mais approximativement à travers 3 Les clients sont toujours déconnectés. Il est enregistré dans le magazine système en raison de l'inaction.

Néanmoins, je comprendrai votre code CGO ci-dessous:

package main

/*
#cgo CFLAGS: -DCONFIG_CTRL_IFACE -DCONFIG_CTRL_IFACE_UNIX
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "libbridge.h"
#include "wpa_ctrl.h"
*/
import "C"
import "unsafe"
import "fmt"
import "time"
import "strings"

var briface string = "br0"
var auiface string = "eth1"
var hostapd_path string = "/var/run/hostapd/"

var connected bool
var current_mac string

var wpa_ctl *C.struct_wpa_ctrl

func main() {
br_del()

hostapd_connect()
defer func(){
if wpa_ctl != nil {
C.wpa_ctrl_detach(wpa_ctl)
C.wpa_ctrl_close(wpa_ctl)
}
}()

for {
for C.wpa_ctrl_pending(wpa_ctl) &gt; 0 {
log(fmt.Sprintf("Reading message from hostapd..."))
var buf [256]C.char
var llen C.size_t = C.size_t(unsafe.Sizeof(buf) - 1)
if C.wpa_ctrl_recv(wpa_ctl, &amp;buf[0], &amp;llen) == 0 {
null := C.CString("\000")
buf[llen] = *null
C.free(unsafe.Pointer(null))
//fmt.Printf("%s\n", C.GoString(&amp;buf[0]))
msg := C.GoString(&amp;buf[0])
mData := strings.Split(msg, " ")

if len(mData) &lt; 2 {
log(fmt.Sprintf("Event data too short when processing message: %s", msg))
continue
}
switch (mData[0]){
case "&lt;3&gt;AP-STA-CONNECTED":
log(fmt.Sprintf("Got Device Authentication, adding to bridge..."))
br_add()
connected = true
current_mac = mData[1]
case "&lt;3&gt;AP-STA-DISCONNECTED":
log(fmt.Sprintf("Got Device Disconnect, removing from bridge..."))
br_del()
connected = false
case "&lt;3&gt;CTRL-EVENT-EAP-STARTED":
if connected {
if mData[1] != current_mac {
log(fmt.Sprintf("Got active MAC different from current MAC. %s vs %s - Disconnecting current.", mData[1], current_mac))
hostapd_disconnect(current_mac)
}
}
}

} else {
break
}
}

if ! hostapd_ping() {
C.wpa_ctrl_detach(wpa_ctl)
C.wpa_ctrl_close(wpa_ctl)
log(fmt.Sprintf("Lost connection to hostapd, reconnecting..."))
hostapd_connect()
}

time.Sleep(time.Millisecond * 100)
}
}

func hostapd_connect(){
ci := C.CString(hostapd_path + auiface)
defer C.free(unsafe.Pointer(ci))

for {
wpa_ctl = C.wpa_ctrl_open(ci)
if wpa_ctl != nil {
log(fmt.Sprintf("Connected to hostapd OK, attach..."))
if C.wpa_ctrl_attach(wpa_ctl) == 0 {
log(fmt.Sprintf("Attached event listener..."))
break
} else {
fmt.Printf("Failed to attach to event listener.")
C.wpa_ctrl_close(wpa_ctl)
}
} else {
log(fmt.Sprintf("Failed to connect to hostapd control socket, waiting for retry..."))
}
time.Sleep(time.Millisecond * 100)
}
}

func hostapd_disconnect(mac string){
ci := C.CString(hostapd_path + auiface)
defer C.free(unsafe.Pointer(ci))

dc := C.wpa_ctrl_open(ci)
if dc == nil {
log(fmt.Sprintf("Error opening connection to disconnect current station."))
return
}
defer C.wpa_ctrl_close(dc)

var buf [4096]C.char
var len C.size_t = C.size_t(unsafe.Sizeof(buf) - 1)

cping := C.CString("deauthenticate " + mac)
defer C.free(unsafe.Pointer(cping))

ret := C.wpa_ctrl_request(dc, cping, C.strlen(cping), &amp;buf[0], &amp;len, nil)

if (ret == -2) {
log(fmt.Sprintf("Station disconnect failed with timeout..."))
} else if (ret &lt; 0) {
log(fmt.Sprintf("Station disconnect failed..."))
}
log(fmt.Sprintf("Station disconnect requested."))
}

func hostapd_ping() (bool) {
var buf [4096]C.char
var len C.size_t = C.size_t(unsafe.Sizeof(buf) - 1)

cping := C.CString("PING")
defer C.free(unsafe.Pointer(cping))

ret := C.wpa_ctrl_request(wpa_ctl, cping, C.strlen(cping), &amp;buf[0], &amp;len, nil)

if (ret == -2) {
log(fmt.Sprintf("PING failed with timeout..."))
return false
} else if (ret &lt; 0) {
log(fmt.Sprintf("PING failed..."))
return false
}
return true
}

func br_add(){
br := C.CString(briface)
defer C.free(unsafe.Pointer(br))
ifa := C.CString(auiface)
defer C.free(unsafe.Pointer(ifa))

if ( C.br_init() &gt; 0 ) {
log(fmt.Sprintf("Can't setup bridge control in br_add. Failed to add interface to bridge."))
return
}

ret := C.br_add_interface(br, ifa)
if ret &gt; 0 {
log(fmt.Sprintf("Failed to add interface to bridge, error code: %d", ret))
return
}
}

func br_del(){
br := C.CString(briface)
defer C.free(unsafe.Pointer(br))
ifa := C.CString(auiface)
defer C.free(unsafe.Pointer(ifa))

if ( C.br_init() &gt; 0 ) {
log(fmt.Sprintf("Can't setup bridge control in br_del. Failed to remove interface from bridge."))
return
}

ret := C.br_del_interface(br, ifa)
if ret &gt; 0 {
log(fmt.Sprintf("Failed to remove interface from bridge, error code: %d", ret))
return
}
}

func log(data string) {
fmt.Printf("%s\n", data)
}

</string.h></stdio.h></stdlib.h>
Invité:

Pour répondre aux questions, connectez-vous ou registre