Üdv mindenkinek!
Tud valaki olyan leírásról ami használható és leírják benne, hogy a tap interface-t hogyan kell használni?
Már teljesen kikészít.
Annyira lenne szükségem, hogy a programom létre tudjon hozni egy tap interface-t és ki tudja olvasni az arra küldött csomagokat majd át tudja írni egy másikra.
- 1444 megtekintés
Hozzászólások
Ne használja ugyanazt a hálózati címet, mint a fizikai hálózat!
Például, ha a fizikai hálózat 192.168.0.x, eltérő IP cím 192.168.200.y
* te tudod hogy qju vagyok ?
- A hozzászóláshoz be kell jelentkezni
Ezt most komolyan gondoltad? :D
- A hozzászóláshoz be kell jelentkezni
Aha.
- A hozzászóláshoz be kell jelentkezni
Ha jól tévedek a hercules emulátor használ tun/tap device-t. Nézz bele a forráskódjába, ott hogy csinálják!
- A hozzászóláshoz be kell jelentkezni
Letrehozas, mknod.
Ha emlekeim nem csalnak, siman open, select, read, write a menete.
Itt a forraskodban volt regen minta program is, ha jol emlekszem pont a te problemadra:
http://vtun.sourceforge.net/
- A hozzászóláshoz be kell jelentkezni
...
int fd;
struct ifreq ifr;
if ( (fd=open("/dev/net/tun",O_RDWR)) < 0 )
return(-1);
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
if ( dev != NULL && *dev )
strncpy(ifr.ifr_name,dev,IFNAMSIZ);
if ( (err=ioctl(fd,TUNSETIFF,(void *)&ifr)) < 0 )
{ close(fd);
return(err);
}
/* + check ifr.ifr_name */
egy-ket megjegyzes:
- ha csak tun-t kell csinalnod, akkor igy erdemes. ha tap-ot, akkor is (IFF_TAP), csak vigyazz, hogy akkor a teljes eth-frame kijon a cso"bo"l, es nemcsak az ip-csomag
- az IFF_NO_PI-t erdemes beallitani, mert igy tenyleg csak a csomagok jonnek ki az fd-bol. ha ezt nem allitod be akkor 4 byte-ot kikuld (es elva'r) minden csomag elott, aminek (szerintem legalabbis) a gyakorlatban semmi jelentosege nincs, teljesen redundans (konkretan tun-nal ez 00 00 08 00)
- ha ez a fenti tun/tap alloka'tor lefut, neked me'g ezt az interface-t ugyanugy fel kell konfiguralni. erre ket lehetoseged van: 1/ vagy kezzel futtatsz valamit (shell-bol /sbin/ifconfig, vagy progibol system()-mel vagy execve()-vel kihivod), 2/ vagy szinten ioctl()-ekkel felprogramozod. .. de:
- ezutobbi esetben nem ezt a /dev/net/tun-ra mutato fd-t kell konfiguralnod, hanem csinalsz egy pf_packet/sock_raw osztalyu socket-et, erre a socket-re kersz a megfelelo nevvel (amit az ifr.ifr_name-ban megtalalsz) egy iface indexet (SIOCGIFINDEX), majd ha ez megvan, akkor a tobbi ifreq struktura't - ami maga't az ifconfig-ola'st (de sze'p ige :]) vegzi a hozza kapcsolodo ioctl()-eken keresztul - feltoltod megfelelo ertekekkel es ezzel az interface indexszel. de elso peldaprogramra/tesztelesre egyszerubb ha kezzel meghivod az /sbin/ifconfig-ot ;)
mi az alapproblemad egyebkent amire ez kell? (csak pl tun-nal /ami egy ppp osztalyu interface-t ad/ egyszerubb dolgozni... nagyon kell a tap?)
a.
- A hozzászóláshoz be kell jelentkezni
subs
- A hozzászóláshoz be kell jelentkezni
szerk: bocs, nem feltetlenul pf_packet/sock_raw osztalyu socket-et kell csinalni, ha ifconfigolnal, mert ez inkabb eth-szinten nyul a csomagokhoz (azaz ha kezzel akarsz eth frame-kat kuldozgetni, fogadni, pl aoe-t implementalsz, vagy ilyesmivel jatszani... ezzel kevertem igy hirtelen). a pf_inet/sock_dgram/ipproto_ip lehet a nyero" vagy a pf_inet/sock_raw/0. mondjuk a vicc az, hogy ha pf_inet szinen kezeljuk a socket-et, akkor is ki lehet nyerni a hwaddr-t meg ilyesmiket, amiknek elvileg nemsok koze van az ip(v4) layerhez. meg lehet nezni peldaul egy `strace /sbin/ifconfig -a` hivast, hogy miket, milyen ioctl()-eket meg socket()-eket hiv meg, es kezi konfiguralasnal ugyanezt kell csinalni csak a SIOCGIF* helyett a megfelelo" SIOCSIF* request-ekkel.
- A hozzászóláshoz be kell jelentkezni