# Problema di port forwarding tramite vpn [risolto]

## jar5

Ciao a tutti.

Allora la situazione è questa:

ho un server pubblico che è collegato ad un server interno a una LAN tramite una vpn. L'obbiettivo è di fare un port forwarding (es. la porta 80) dal server pubblico verso il server all'interno della LAN passando tramite la vpn.

I 2 server si pingano tranquillamente ma il problema è che i pacchetti di richiesta verso il server pubblico non riescono ad andare verso quello privato tramite la vpn.

Il tutto è fatto usando iptables con la seguente regola:

iptables -t nat -A PREROUTING -p tcp -i eth1 -d 217.*.*.153 --dport 80 -j DNAT --to 10.*.*.2

dove 217.*.*.153 è l'indirizzo del server pubblico e 10.*.*.2 è l'indirizzo della vpn appartenente al server privato.

Ho cercato un po' in giro ma mi pare di aver capito che la situazione sia un po' diversa rispetto a un normalissimo port forwarding verso un server all'interno di una LAN a causa della presenza della vpn (ma magari sbaglio...   :Cool:   )

Sapreste aiutarmi?Last edited by jar5 on Mon Dec 12, 2005 8:17 pm; edited 1 time in total

----------

## federico

Prova un po' a controllare com ethereal o tcpdump che direzione prendono i pacchetti di risposta http dalla tua macchina verso l'esterno.

Fede

----------

## jar5

mmm... ok provo a vedere che dice ethereal però ho visto con tcpdump che non arriva neanche la richiesta..   :Sad: 

Però non ho spiegato una cosa:

i due server sono così messi:

Server pubblico: 

      eth1 --> 217.*.*.153 -->Interfaccia rivolta verso l'esterno(Internet)

      tap0 --> 10.0.0.1 --> Interfaccia della vpn rivolta verso il server privato

Server privato:

      tap --> 10.0.0.2 --> Interfaccia della vpn rivolta verso il server pubblico (oltre ovviamente ad avere eth0 come interfaccia fisica    :Smile:   )

Come detto i ping funzionano però facendo delle prove ho notato che se sul server pubblico metto un daemon di apache in ascolto sull'indirizzo privato della vpn (10.0.0.1) e utilizzando la regola che ho postato prima(cambiando il 10.0.0.2 finale con 10.0.0.1), il server pubblico riponde correttamente mentre se reindirizzo la connessione verso il server privato (10.0.0.2), che è quello che dovrei fare, torna a non funzionare.

Vabbè intanto provo ethereal.

Grazie per la risposta   :Very Happy: 

----------

## comio

```

...

-A PREROUTING -d 192.168.55.154 -j portredir

...

-A portredir -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.100.2

-A portredir -j RETURN

```

quella di sopra è la catena che mi fa il redirect delle porte nel mio caso. dovrebbe andare bene anche a te una cosa simile.

----------

## jar5

ho provato con le tue regole sostituendo al tuo 192.168.55.154 il mio 217.*.*.153 e al tuo 192.168.100.2 il mio 10.0.0.2 però purtroppo ancora non funziona.

Mi sembra di aver capito però che tu hai una LAN vera e propria mentre nel mio caso la LAN è formata da una vpn tra 2 host con connessione diretta tra di loro (diretta nel senso che ci sono solo loro 2 sulla vpn).

Non saprei ma ci sono differenze nel redirigere pacchetti usando una LAN rispetto ad usare una vpn? Comincio a pensarlo...   :Sad: 

----------

## makoomba

fare solo DNAT non basta perchè i pacchetti che arrivano al server privato tramite vpn conservano il loro ip sorgente.

la risposta di apache utilizzerà il default gateway della macchina 10.0.0.2 (probabilmente un router/modem), "uscendo" su internet con l'indirizzo pubblico del gateway stesso.

hai due possibilità:

1 - fare anche SNAT sulla vpn (lato server pubblico) in modo che l'ip sorgente delle richieste risulti essere 10.0.0.1

2 - fare source routing sul server privato, imponendo che il traffico con ip sorgente 10.0.0.2 abbia come gateway la vpn.

c'è un 3d recente nel forum in cui ne abbiamo parlato, lì troverai maggiori dettagli.

----------

## jar5

mmm..... si capisco però al momento il problema sembra essere che neanche i pacchetti di richiesta riescano ad arrivare al server privato con quella singola regola (anche se insufficiente per far funzionare il tutto ma almeno la richiesta dovrebbe arrivare, o sbaglio?).

Se mi metto in ascolto sull'interfaccia della vpn del server privato (tap0 --> indirizzo 10.0.0.2) ad esempio con tcpdump non arriva nessun pacchetto ma proprio nessuno!   :Rolling Eyes: 

----------

## makoomba

 *jar5 wrote:*   

> Se mi metto in ascolto sull'interfaccia della vpn del server privato (tap0 --> indirizzo 10.0.0.2) ad esempio con tcpdump non arriva nessun pacchetto ma proprio nessuno!  

 

se dal server pubblico fai 

```
wget http://10.0.0.2
```

rilevi traffico con tcpdump ?

----------

## jar5

Si riesco a rilevarlo, ad esempio se dal pubblico faccio "links 10.0.0.2" la pagina viene aperta.

----------

## makoomba

l'ip forwarding è abilitato sul server pubblico ?

----------

## jar5

sul pubblico c'è questo:

```

iptables -t nat -A PREROUTING -p tcp -i eth1 -d 217.*.*.153 --dport 80 -j DNAT --to 10.*.*.2 
```

però se non sbaglio almeno con questo le richieste dovrebbero arrivare.

----------

## makoomba

posta

```
sysctl net.ipv4.ip_forward
```

sul server pubblico

----------

## jar5

si il forward è attivo   :Smile:  :

```

pc-l ~ # sysctl net.ipv4.ip_forward

net.ipv4.ip_forward = 1
```

----------

## makoomba

mmm...

hai altre regole nel firewall ?

sul pubblico, dai

```
iptables -t nat -Z
```

questa azzera i contatori relativi alle regole del firewall

prova una connessione dall'esterno verso la porta 80 del server pubblico e poi posta

```
iptables -t nat -nvL
```

----------

## jar5

No per il momento ho tolto tutte le regole per fare queste prove sul forwarding eccetto quella per il DNAT.

```

pc-l ~ # iptables -t nat -nvL

Chain PREROUTING (policy ACCEPT 4324 packets, 272K bytes)

 pkts bytes target     prot opt in     out     source               destination

    3   156 DNAT       tcp  --  eth1   *       0.0.0.0/0            217.*.*.153        tcp dpt:80 to:10.0.0.1

Chain POSTROUTING (policy ACCEPT 3641 packets, 246K bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 3641 packets, 246K bytes)

 pkts bytes target     prot opt in     out     source               destination

```

----------

## makoomba

```
156 DNAT       tcp  --  eth1   *       0.0.0.0/0            217.*.*.153        tcp dpt:80 to:10.0.0.1
```

...

dev'essere 

```
156 DNAT       tcp  --  eth1   *       0.0.0.0/0            217.*.*.153        tcp dpt:80 to:10.0.0.2
```

----------

## jar5

si scusa ho fatto delle prove ma poi l'ho ricambiato in 10.0.0.2 ma non funziona cmq, ho già provato

----------

## jar5

il problema sembra essere che i due host della vpn comunicano tranquillamente ma sembra che il server pubblico non riesca a girare i pacchetti dalla eth1 alla tap0

----------

## makoomba

ok, metti tcpdump in ascolto su eth1 del server pubblico, fai un test (dall'esterno) e posta l'output.

poi mettilo su tun0 sempre sul pubblico, rifai il test e posta anche quello

e già che ci sei, posta pure route -n

edit 

su tap0, non tun0

----------

## jar5

Allora allora:

Sul server pubblico:

```

pc-l ~ # iptables -t nat -vL

Chain PREROUTING (policy ACCEPT 7974 packets, 502K bytes)

 pkts bytes target     prot opt in     out     source               destination

    0     0 DNAT       tcp  --  eth1   any     anywhere             pc-1                tcp dpt:http to:10.0.0.2

Chain POSTROUTING (policy ACCEPT 6887 packets, 469K bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 6887 packets, 469K bytes)

 pkts bytes target     prot opt in     out     source               destination

```

```

pc-l ~ # tcpdump -i eth1 -n

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes

18:59:49.274158 IP 1.*.*.42.2474 > 217.*.*.153.80: S 1444702042:1444702042(0) win 65535 <mss 1460,nop,wscale 3,nop,nop,sackOK>

18:59:52.097825 IP 1.*.*.42.2474 > 217.*.*.153.80: S 1444702042:1444702042(0) win 65535 <mss 1460,nop,wscale 3,nop,nop,sackOK>

2 packets captured

4 packets received by filter

0 packets dropped by kernel

```

```

pc-l ~ # tcpdump -i tap0 -n

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on tap0, link-type EN10MB (Ethernet), capture size 96 bytes

19:01:33.166451 IP 1.*.*.42.2480 > 10.0.0.2.80: S 2731374723:2731374723(0) win 65535 <mss 1460,nop,wscale 3,nop,nop,sackOK>

19:01:36.005516 IP 1.*.*.42.2480 > 10.0.0.2.80: S 2731374723:2731374723(0) win 65535 <mss 1460,nop,wscale 3,nop,nop,sackOK>

19:01:42.040974 IP 1.*.*.42.2480 > 10.0.0.2.80: S 2731374723:2731374723(0) win 65535 <mss 1460,nop,wscale 3,nop,nop,sackOK>

3 packets captured

6 packets received by filter

0 packets dropped by kernel

```

```
pc-l ~ # route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

10.0.0.0        0.0.0.0         255.255.255.252 U     0      0        0 tap0

1.*.*.0         0.0.0.0         255.255.255.0   U     0      0        0 eth1

127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo

0.0.0.0         1.*.*.1         0.0.0.0         UG    0      0        0 eth1

```

1.*.*.42 corrisponde all'host esterno dal quale stò facendo le richieste di prova.

Ma cacchio ora le richieste arrivato al server privato   :Shocked:   giuro che non ho cambiato nulla   :Surprised: 

In questa situazione quindi mi bastarebbe fare quell'SNAT di cui mi parlavi prima?

----------

## makoomba

 *jar5 wrote:*   

> In questa situazione quindi mi bastarebbe fare quell'SNAT di cui mi parlavi prima?

 

sì

edit:

qui c'è il 3d di cui ti parlavo

----------

## jar5

Nella prima risposta mi hai detto:

 *Quote:*   

> 1 - fare anche SNAT sulla vpn (lato server pubblico) in modo che l'ip sorgente delle richieste risulti essere 10.0.0.1 

 

ma a questo punto le risposte del server apache sul server privato non dovrebbero viaggiare sulla vpn? e non serve un masquerade sul server pubblico?

Mi faresti un esempio di regola iptables per l'SNAT? Facciamo prima così almeno capisco al volo   :Smile: 

edit:

ok avevo postato prima che editati   :Cool: 

ora leggo, grazie

----------

## makoomba

 *jar5 wrote:*   

> Mi faresti un esempio di regola iptables per l'SNAT? Facciamo prima così almeno capisco al volo  

 

domanda: hai letto il link che ti ho postato ?

c'è scritto esattamente come devi fare.

edit.

anch'io ho postato senza leggere il tuo edit....

siamo pari  :Wink: 

----------

## jar5

Si infatti ti chiedo scusa ti ho fatto la domanda senza aver visto il tuo edit   :Embarassed: 

In effetti ora con quella regola funziona tutto alla grande!

Ti dovrebbero fare un statua   :Very Happy: 

Grazie a tutti quelli che sono intervenuti in mio soccorso  :Laughing: 

Ciao e grazie

----------

## makoomba

 :Wink: 

----------

## comio

 *jar5 wrote:*   

> il problema sembra essere che i due host della vpn comunicano tranquillamente ma sembra che il server pubblico non riesca a girare i pacchetti dalla eth1 alla tap0

 hai abilitato l'ip forwarding?

ciao

----------

## jar5

per il momento sembra che ho risolto grazie al link che mi ha passato makoomba   :Smile: 

Grazie comunque per l'interessamento/aiuto   :Very Happy: 

----------

