Dyo IP addr se ena ethernet interface

Christos Ricudis ricudis at itc.auth.gr
Wed Dec 2 20:43:17 EET 2009


Thanasis wrote:
> on 12/02/2009 06:31 PM Antonis Christofides wrote the following:
>   
>> Καλησπέρα. Έχω ένα Debian σέρβερ, με ένα σωρό services, και μία κάρτα
>> δικτύου eth1 (3c905B). (Έχει και μια eth0 που δεν χρησιμοποιείται).
>> Για κάποιο λόγο που δεν θέλω τώρα να εξηγήσω γιατί είναι εκτός
>> θέματος, χρειάζεται να του βάλω και δεύτερη IP address.
>>
>> auto eth1
>> iface eth1 inet static
>>     address ...
>>     ...
>>
>> auto eth1:1
>> iface eth1:1 inet static
>>     address ...
>>     ...
>>
>> Αυτό δούλεψε μεν, αλλά έχει το πρόβλημα πως (ενίοτε ή πάντα, δεν είμαι
>> σίγουρος) όταν στέλνει email στον smarthost τα στέλνει από το eth1:1,
>> ενώ εγώ θέλω πάντα να τα στέλνει από το eth1. Μπορώ μεν στο exim να
>> βάλω κάπου την παράμετρο interfaces στο smtp transport, που θα λύσει
>> αυτό το πρόβλημα, έτσι όμως θα λύσω ένα επιμέρους σύμπτωμα. Αυτό που
>> θα ήθελα είναι ΠΑΝΤΑ να χρησιμοποιείται η eth1, για όλες τις
>> εξερχόμενες συνδέσεις. 
>>     
> Δηλαδή το eth1:1 θα το χρησιμοποιεί μόνο όταν έχεις εισερχόμενες, και
> ενδεχομένως για εξερχόμενες που αποτελούν απάντηση σε εισερχόμενες;
>
>   

Kaylh erwthsh. H apanthsh einai oti sto unix to multi-homing roufaei, 
kai de ftaiei gi ayto toso to unix, oso o tropos pou xrhsimopoioun ta 
BSD sockets oi application developers.

Sexhgoumai :

Sthn periptwsh twn servers, h synh8hs diadikasia pou akolou8eitai einai 
h ekshs :

    struct sockaddr_in stSockAddr;
    int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    stSockAddr.sin_family = AF_INET;
    stSockAddr.sin_port = htons(1100);
    stSockAddr.sin_addr.s_addr = INADDR_ANY;
 
    bind(SocketFD,(const struct sockaddr *)&stSockAddr, sizeof(struct 
sockaddr_in)));

    listen(SocketFD, 10);

    loop me accept() ktl ktl

To INADDR_ANY sto sin_addr.s_addr leei sto kernel socket code, oti to 
sygkekrimeno socket proorizetai gia na apodextei connections poy 
katalhgoun se *opoiodhpote* apo ta IPs pou einai configured se kapoio 
interface tou systhmatos. To socket code gnwrizei arketa gia na gemisei 
ta ypoloipa pedia tou socket structure pou epistrefei h accept() apo 
mono tou me ton swsto tropo.

Se periptwsh twra poy enas server 8eloume na akouei mono se ena 
sygkekrimeno IP, "apla" to bazoume sto sin_addr.s_addr tou listening 
socket. To socket programming einai etsi ki alliws arketa anwmalo, wste 
o perissoteros kosmos otan katalabainei oti ayth h epilogh prepei na 
synodeyetai kai me configurable user options ktl ktl, leei "de gamietai" 
kai xrhsimopoiei apla to INADDR_ANY. Sto server-side ayto den einai kai 
toso megalo problhma, mia poy yparxoun arketoi enallaktikoi tropoi na 
perioriseis to traffic pou den 8eleis.

Sthn periptwsh twn clients twra, synh8ws o kosmos kanei kati san ayto :

    struct sockaddr_in stSockAddr;
    int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    stSockAddr.sin_family = AF_INET;
    stSockAddr.sin_port = htons(1100);

    Res = inet_pton(AF_INET, "192.168.1.3", &stSockAddr.sin_addr);
 
    connect(SocketFD, (const struct sockaddr *)&stSockAddr, 
sizeof(struct sockaddr_in));

Prosekste oti leipei h bind(). H bind() ayto poy kanei sthn ousia einai 
na orizei to *local* endpoint tou socket. Synh8ws sto client-side kaneis 
den th xrhsimopoiei, pragma poy einai to antistoixo toy na les ston 
kernel "kane oti goustareis". H *swsth* diadikasia einai na kaneis 
bind() to socket prin thn connect, me akoma ena user-configurable option 
pou na epitrepei sto xrhsth na epileksei to IP poy 8a xrhsimopoih8ei gia 
ta outgoing connections ktl ktl ktl.

Sthn praksh twra einai poly pio eykolo na xrhsimopoihseis kati etoimo.

Proteinw ayto edw :

https://code.grnet.gr/projects/iffool














More information about the Linux-greek-users mailing list