Domanda

mi chiedevo se c'è qualche modo per regolare (su un sistema Linux), il MTU per una data presa. (Per rendere strato di frammentazione IP in blocchi più piccoli che il MTU dispositivo reale).

Quando dico per una data presa, non intendo programatically nel codice dell'applicazione possedere la presa, ma piuttosto dall'esterno, ad esempio tramite una voce di sysfs.

Se non v'è attualmente alcun modo farlo, hai qualche idea su dove agganciare / patch in linux kernel per implementare una tale possibilità?

Grazie.

EDIT: perché diavolo voglio farlo

Sto facendo alcune Layer3-in-layer4 (ad esempio: tunneling IP e soprattutto tramite TCP tunnel) tunneling. A differenza di VPN-come soluzioni, non sto utilizzando un'interfaccia virtuale per raggiungere questo obiettivo. Sto catturare i pacchetti con iptables, farli cadere per il loro modo normale e scrivendoli alla presa del tunnel.

Pensate al caso di un grande trasferimento di file, tutti i pacchetti sono riempiti fino al formato MTU. Quando sono tunnel li, aggiungo certo overhead, portando in ogni pacchetto originale per produrre due pacchetti tunnel, è sotto-ottimale.

È stato utile?

Soluzione

Se il socket è creato in modo tale che DF insieme sui pacchetti in uscita si potrebbe avere un po 'di fortuna in spoofing (iniezione) una frammentazione necessaria messaggio indietro ICMP a voi stessi fino a quando si finisce con l'MTU desiderato. Piuttosto brutto, ma a seconda di come sei disperato potrebbe essere opportuno.

Si potrebbe ad esempio generare questi pacchetti con le regole di iptables, quindi l'abbinamento e l'invio è semplice ed esterna alla propria applicazione. Sembra che il target REJECT per iptables non ha un rifiuto, con la frammentazione necessaria, però, probabilmente non sarebbe troppo difficile per aggiungere uno.

L'altro approccio, se è solo TCP pacchetti vi preoccupate è si potrebbe avere un pò di fortuna con l'opzione socket TCP_MAXSEG o la destinazione TCPMSS se questo è appropriato per il vostro problema.

Per UDP o prime sei libero di send() pacchetti piccoli come avete voglia!

Aggiornamento:

Sulla base del "perché dovrei farlo?" risposta, sembra che frammentare i pacchetti se DF non è impostato o alzando ICMP "frammentazione necessaria" e caduta sarebbe in realtà la soluzione corretta.

E 'quello di un router più "normale" avrebbe fatto e forniti i firewall non mangiare il pacchetto ICMP allora si comporterà in modo sano in tutti gli scenari, mentre retrospettivamente cambiare le cose è una ricetta per il comportamento strano.

Il iptables morsetto MSS è abbastanza un buon correzione per TCP su questo " VPN", anche se, in particolare per quanto si sta già facendo ampio uso di iptables sembra.

Altri suggerimenti

MTU è una proprietà di un link, non è presa. Appartengono a diversi strati della pila. Detto scoperta TCP esegue Path MTU durante il three-way handshake e cerca molto difficile da evitare la frammentazione. Avrai la preparazione di tempo frammenti TCP invio duri. Con UDP il più facile è quello di forzare un po 'di MTU piuttosto piccolo su un'interfaccia con ifconfig(8) e poi inviare i pacchetti più grande allora quel valore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top