Newsgroup: it.comp.os.linux.iniziare
Titolo: Collegare eth1 e tap

Ciao a tutti,
ho cominciato da poco ad usare Linux e sono riuscito a aprire un
device tap assegnandogli con ifconfig un indirizzo IP.
A questo punto "ifconfig -a" mi restituisce eth0, eth1 e tap, con i
rispettivi indirizzi IP.
Io ho sviluppato un programmino che legge dal descrittore del tap
acquisendo le informazioni che sono inviate al tap (e simmetricamente
è in grado di scrivere dati verso tale descrittore).
Il mio obiettivo è quello di fare arrivare al tap e quindi al mio
programmino dei dati da un altro PC, dal quale riesco a pingare
correttamente eth1.
Vengo alla domanda. Come faccio a collegare eth1 e tap perché
dall'altro PC possa mandare informazioni al tap (e similmente dal mio
programmino che gestisce il tap possa rispondere verso l'altro PC).
Vi ringrazio fin da adesso,
Marco



Probabilmente devi semplicemente attivare il routing tra le interfacce nel
pc in cui si trova l'interfaccia tap, e assicurarti che il computer remoto
(quello da cui dici che riesci a pingare eth1) abbia una route per
raggiungere l'indirizzo IP che hai assegnato a tap.
Per la prima cosa, usa
$ echo 1 > /proc/sys/net/ipv4/ip_forward
e per la seconda, qualcosa del tipo (sul computer remoto)
ip route add <tap-ip> via <ip del gw che usi per raggiungere eth1>
O questo, oppure non ho capito cosa vuoi fare :) (anche questo e'
possibile). 

Grazie mille per la risposta.
Ora vado a sperimentare quanto hai scritto, però - dimmi se ho capito
bene - questa soluzione implica che la macchina remota abbia una
visibilità dell'IP del tap della macchina in questione.
Io vorrei invece che la macchina remota potesse semplicemente spedire
all'indirizzo eth1 della mia macchina e che poi fosse la mia macchina
a rigirare i pacchetti al tap. Cioè vorrei che la macchina remota non
avesse cognizione del fatto che c'è un tap, ma spedisse all'IP di
eth1.
Marco



Si' quello che dici e' giusto. Ci sono modi per fare anche come vorresti tu,
che pero' sono tutti un po' degli hack che vengono normalmente usati per
altri scopi. C'e' un motivo particolare per cui hai bisogno di fare cosi'?

 eth1.
potresti configurare un bridge

 Marco
Forse ti è utile uno switch virtuale, cerca e installa vde switch.
Un esempio di configurazione di vde switch da me, la uso per agganciarci
virtual box, qemu, ecc. (ignora la parte per g15 daemon e qemu):
#! /bin/bash
#
# gdb-vde_qemu: Start/Stop the vde for qemu
#
# chkconfig: 2345 60 10
# description: Vde for qemu
# processname: gdb-vde_qemu
# config: /etc/?
# pidfile: /var/run/gdb-vde_qemu.pid
# Source function library.
. /etc/init.d/functions
RETVAL=0
# See how we were called.
PATH=$PATH:/usr/local/bin:/usr/local/sbin
MemShm="900"
ServName="gdb-vde_qemu"
ServDes="Vde for qemu"
prog="vde_switch"
ProgRun="/var/run/"$ServName".pid"
ProgSock="/tmp/vde_qemu.ctl"
IPSwitch="192.168.0.254"
MaskSwitch="255.255.255.0"
start(){
    local ServPid MntTmpFs SizeTmpFs
# Avvia il g15 daemon
    if ! lsmod | grep uinput > /dev/null; then
        modprobe uinput
        echo "Caricato il modulo uinput"
    fi
    g15daemon
# Imposta la memoria condivisa
    SizeTmpFs=`df -m -t tmpfs | grep shm | (read sez1 sez2 sez3 sez4
sez5 ;echo
$sez4)`
    if [ "$SizeTmpFs" -lt "$MemShm" ]; then
#       umount /dev/shm
        mount -t tmpfs -o size=$MemShm"m" none /dev/shm
        echo "Impostato memoria condivisa da "$SizeTmpFs" a "$MemShm" Mb"
    fi
# Carica il modulo di accelerazione kqemu
    if ! lsmod | grep kqemu > /dev/null; then
        modprobe kqemu
        echo "Caricato il modulo kqemu"
    fi
    echo -n $"Starting $ServDes: (tap0 $IPSwitch)"
    ServPid=`pidfileofproc $ServName`
    if [ "$ServPid" ]; then
        RETVAL=1
    else
# Carica il modulo 'tun'
        if ! lsmod | grep tun > /dev/null; then
            modprobe tun
# Wait for the module to be loaded
            while ! lsmod |grep -q "^tun"; do echo Waiting for tun
device;sleep
1; done
        fi
# Start tap switch
        daemon $prog -tap tap0 -sock $ProgSock -m 0770 -daemon -pidfile
$ProgRun
 -M /tmp/vde.mgmt
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
            chgrp users $ProgSock && chgrp users "$ProgSock/ctl" && chmod
760 "$
ProgSock/ctl"
            ifconfig tap0 $IPSwitch netmask $MaskSwitch
        fi
    fi
    echo
    [ $RETVAL -eq 0 ] && touch "/var/lock/subsys/"$ServName
    return $RETVAL
}
stop(){
    echo -n $"Stopping $ServDes: "
# Ferma il g15 daemon
    g15daemon -k
    modprobe -r uinput
    ifconfig tap0 down
    killproc $ServName -HUP
# Remove the control socket
    rm -f /tmp/vde.*
    RETVAL=$?
    sleep 0.2
    modprobe -r tun
    modprobe -r kqemu
    echo
    [ $RETVAL -eq 0 ] && rm -f "/var/lock/subsys/"$ServName
    return $RETVAL
}
case "$1" in
    start)
        start ;;
    stop)
        stop ;;
    restart)
        stop
        start
        ;;
    status)
        status $prog ;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1
esac
exit $?

 Marco
Forse non ho capito quello che volevi fare, probabilmente ti serve solo 
(insieme a echo 1 > /proc/sys/net/ipv4/ip_forward ) aggiungere una regola
di masquerare ad iptable (lo switch virtuale forse non ti serve a niente),
per esempio da me:
# Attiva il nat per le connessione delle rete virtuale locale
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
''instrada'' tutto il traffico internet delle rete virtuale connessa al tap
(i guest) sulla connessione ad internet ppp0 del sistema reale (host)