==== 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.