=== Come portare l'unico IP statico dell' ADSL sulla macchina Linux === Lo scopo di questa configurazione e` disporre dell'unico indirizzo IP statico pubblico fornito dal provider ADSL sull'interfaccia WAN del firewall Linux, senza usare il NAT sul router. ==== Specifiche ==== Questa configurazione e` stata provata con: * ADSL con protocollo RFC 1483 (Telecom Smart, Atlanet, o altri) con un ip statico pubblico * Router Zyxel Prestige 642, 645, 650 (meglio se con una seriale!) * Firewall con Linux Debian (woody, sarge) e kernel 2.2, 2.4, e 2.6 Immagino che con alcuni aggiustamenti possa funzionare con altri router o con adsl che usano il PPPoA (questa la vedo piu` dura). ==== Principio di funzionamento ==== Si configura il router per non fare NAT (o SUA come lo chiama lo zyxel) ma per routare i pacchetti e basta. Il router in questa configurazione non disporra` di un indirizzo IP pubblico, in quanto l'unico indirizzo pubblico lo daremo al pc con linux. Fra il router e la macchina Linux si usera` una rete privata di appoggio che verra` usata solo per permettere al router e al PC con Linux di comunicare fra di loro, e su questa rete si mettono delle route statiche (sia sul router che sul PC) che consentono di instradare correttamente i pacchetti verso internet e verso l'unico indirizzo IP pubbblico a noi assegnato. Questo esempio assume che il router e il pc condividano una rete privata (usata SOLO per comunicare fra i due, e non per eventuali altri pc) con indirizzo 192.168.254.0/24. L'indirizzo pubblico fornitomi dal provider e` 213.199.31.71. L'indirizzo privato del router e` 192.168.254.1 e quello del PC e` 192.168.254.2. Sul PC uso l'interfaccia eth1 per comunicare con il router. ==== Configurazione del router Zyxel ==== Disponendo di una seriale sul router, e` meglio usare questa per configurarlo, in quanto e` facile tagliarsi fuori dal router nel fare questa configurazione. Se non c'e`, si fa lo stesso, pero` e` piu` difficile. * Prima di tutto, imposto il router con un indirizzo di rete privata sulla ethernet (192.168.254.1, mask 255.255.255.0) {{{ Menu 3.2 - TCP/IP and DHCP Ethernet Setup DHCP Setup DHCP= None Client IP Pool Starting Address= N/A Size of Client IP Pool= N/A Primary DNS Server= N/A Secondary DNS Server= N/A Remote DHCP Server= N/A TCP/IP Setup: IP Address= 192.168.254.1 IP Subnet Mask= 255.255.255.0 RIP Direction= None Version= N/A Multicast= None IP Policies= Edit IP Alias= No }}} * Quindi, imposto i settaggi per il provider. nota che non uso il SUA. Questo setup avra` l'effetto strano di impostare l'interfaccia WAN del router all'indirizzo 192.168.254.1 (quello che ho dato alla ethernet). Il motivo mi e` oscuro assai, tuttavia cosi` funziona, quindi non indago oltre. {{{ Menu 4 - Internet Access Setup ISP's Name= atlanet Encapsulation= RFC 1483 Multiplexing= LLC-based VPI #= 8 VCI #= 35 Service Name= N/A My Login= N/A My Password= N/A Single User Account= No IP Address Assignment= N/A IP Address= N/A ENET ENCAP Gateway= N/A }}} * Poi, se ci sono filtri impostati sulle porte, e` meglio rimuoverli tutti, per non incasinarsi con cose che al momento non ci interessano. Del resto il router non avra` mai un indirizzo pubblico, quindi filtrare a livello del router ha poco senso. Firewalleremo poi sul pc Linux. * Ora creiamo un roting statico che dica che il nostro IP pubblico si trova nella rete locale, ed esattamente sull'indirizzo 192.168.254.2, che ho assegnato al pc linux. {{{ Menu 12.1.1 - Edit IP Static Route Route #: 1 Route Name= ip_stat Active= Yes Destination IP Address= 213.199.31.71 IP Subnet Mask= 255.255.255.255 Gateway IP Address= 192.168.254.2 Metric= 1 Private= Yes }}} * Per curiosita` (facoltativo) andiamo a vedere come e` impostato il routing dopo aver messo dentro il nostro route statico: menu` 24-8 (accesso in command line), e diamo il comando {{{ip route status}}}. Dovremmo vedere una cosa di questo genere: {{{ Dest FF Len Interface Gateway Metric stat Timer Use 213.199.31.71 00 32 enif0 192.168.254.2 1 001b 0 40 192.168.254.0 00 24 enif0 192.168.254.1 1 041b 0 0 default 00 0 wanif0 atlanet 2 00ab 0 84 }}} Questo dice che la rete 192.168.254.0/24 (LAN) e` diretta verso l'interfaccia enif0 (ethernet locale) e che il gateway e` l'indirizzo IP della ethernet, appunto. Poi, dice che l'indirizzo pubblico in nostro possesso (213.199.31.71) e` diretto verso il PC linux (che e` il 192.168.254.2). Inoltre, il routing di default (0/0) e` diretto verso il provider "atlanet" (il nome e` quello impostato nel menu` 4) a mezzo della interfaccia wanif0. Prima di procedere, occorre conoscere il MAC address della interfaccia ethernet del router... per scoprire qual'e`, il modo piu` semplice e` guardare sotto al router, e segnarselo. La configurazione del router e` finita, passiamo al PC. ==== Configurazione del router PC Linux ==== * Prima di tutto, imposto la configurazione della interfaccia eth1, in modo che il suo indirizzo primario sia il mio IP pubblico, e poi le assegno un alias sulla mia rete privata. E` ovviamente necessario che il kernel supporti l'aliasing delle interfacce. Inoltre, dal momento che lo Zyxel quando e` configurato in questo modo non risponde alle richieste ARP, devo forzare una entry nella tabella ARP per dire al PC con Linux qual'e` il MAC address dello Zyxel. Per fare questo, imposto in {{{/etc/network/interfaces}}} questa configurazione: {{{ auto eth1 iface eth1 inet static address 213.199.31.71 gateway 192.168.254.1 netmask 255.255.255.255 pointopoint 192.168.254.1 -multicast (su sarge togliere questa riga) -broadcast (su sarge togliere questa riga) up arp -s 192.168.254.1 00:A0:C5:45:A0:E3 (questo e` il MAC address del router) auto eth1:0 iface eth1:0 inet static address 192.168.254.2 netmask 255.255.255.0 }}} Questa strana configurazione, che ammetto di avere individuato molto a naso, consente di mandare tutti i propri pacchetti fuori da eth1 con l'indirizzo di partenza 213.199.31.71 (l'ip pubblico), e di dirigerli al 192.168.254.1 (ethernet del router). Inoltre, l'alias 192.168.254.2 consentira` poi di ricevere indietro il traffico dal router, perche` e` quello l'indirizzo verso il quale dico al router di mandare i pacchetti. Si sarebbe potuto semplificare tutto se il router accettasse un routing diretto verso una interfaccia fisica anziche` un indirizzo IP, ma non lo accetta. ==== Conclusioni ==== Ora non resta che provare se tutto funziona. Ping e telnet al 192.168.245.1 (il router) dovrebbero funzionare (ovviamente solo dal pc linux e non da fuori), cosi` come dovrebbe essere possibile pingare anche qualsiasi macchina su internet. ==== Debugging ==== Se non va, provate a spegnere e riaccendere il router, che ogni tanto sembra che non prenda tutti i settaggi fino a che non lo si riavvia. Se prima di fare questa configurazione il router era usato con il NAT, e` opportuno cancellare completamente la configurazione del provider e rifarla da zero. Lato Linux, questo e` l'output dei comandi "ifconfig", "route" e "arp" in un setup funzionante. {{{ casa:~# ifconfig eth0 Link encap:Ethernet HWaddr 00:A0:C9:B0:07:F6 inet addr:10.1.42.254 Bcast:10.1.42.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:7078037 errors:0 dropped:0 overruns:0 frame:0 TX packets:8684944 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:3513869470 (3.2 GiB) TX bytes:1012338953 (965.4 MiB) Interrupt:11 Base address:0x4000 eth1 Link encap:Ethernet HWaddr 00:01:02:D1:18:10 inet addr:213.199.31.71 Bcast:213.199.31.255 Mask:255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:118459 errors:0 dropped:0 overruns:0 frame:0 TX packets:85036 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:89736006 (85.5 MiB) TX bytes:7369136 (7.0 MiB) Interrupt:11 Base address:0xcc00 eth1:0 Link encap:Ethernet HWaddr 00:01:02:D1:18:10 inet addr:192.168.254.2 Bcast:192.168.254.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:11 Base address:0xcc00 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:3924 Metric:1 RX packets:67068 errors:0 dropped:0 overruns:0 frame:0 TX packets:67068 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:25178573 (24.0 MiB) TX bytes:25178573 (24.0 MiB) }}} Qui si notano le interfacce eth1 e eth1:0 con le configurazioni dell'ip pubblico e dell' IP privato usato per comunicare con il router Zyxel. {{{ casa:~# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.254.1 * 255.255.255.255 UH 0 0 0 eth1 localnet * 255.255.255.0 U 0 0 0 eth0 192.168.254.0 * 255.255.255.0 U 0 0 0 eth1 default 192.168.254.1 0.0.0.0 UG 0 0 0 eth1 }}} Qui si nota che il routing di default e` diretto a 192.168.254.1, indirizzo IP dell'interfaccia ethernet del router. {{{ casa:~# arp Address HWtype HWaddress Flags Mask Iface lambrusco.kurgan.it ether 00:E0:18:B7:61:39 C eth0 192.168.254.1 ether 00:A0:C5:45:A0:E3 CM eth1 10.1.42.10 ether 00:08:74:3D:33:3C C eth0 }}} Qui si nota che nella tabella ARP c'e` una entry fissa (flags "CM") che lega l'indirizzo IP del router al suo MAC address. Se ancora non funziona, e` opportuno lanciare ethereal o tethereal o tcpdump sulla interfaccia WAN del pc Linux, e poi provare a pingare il router prima e qualche indirizzo su internet dopo. Pingando il router, si dovrebbe vedere il traffico in uscita che ha come indirizzo del mittente quello pubblico e come indirizzo di destinazione quello privato del router, e le relative risposte. Se invece le risposte non tornano, e` probabile che sul router il routing statico non sia impostato correttamente, e che i pacchetti di risposta stiano uscendo verso la ADSL anziche` tornare indietro. Una volta che il ping al router funziona, dovrebbe funzionare anche il ping a qualsiasi host su internet.