PDA

View Full Version : Particolare configurazione per routing Iptables. Fattibile?


massi_it
28-08-2023, 22:31
Ciao a tutti,
avrei bisogno di un aiutino da parte di qualcuno...

Vi spiego:

la mia situazione è la seguente:

https://i.postimg.cc/26Sk9v5w/Mappa-rete-VPN.png

si tratta di due siti (il rosso ed il blu). Grazie all'aiuto del forum, in particolare grazia a questo 3ad (https://www.hwupgrade.it/forum/showthread.php?t=2880131), attualmente sono riuscito a far navigare il raspberry pi 4 del sito blu con l'indirizzo ip pubblico del sito rosso.

Il client openvpn è installato sul raspberry pi 4 del blu e dialoga con il server openvpn installato su di una macchina con cui gira un debian 11.

Il debian "rosso" (si dovrebbe capire dall'immagine) svolge varie funzioni tra cui quella di DHCP e di filtrare il traffico internet di tutti i dispositivi collegati alla rete tramite PiHole.

Indirizzi
Il raspberry pi 4 del sito blu ha l'indirizzo locale 192.168.4.106 ed un indirizzo della vpn di 10.8.0.2.

Il server debian del sito rosso ha l'indirizzo locale 192.168.1.104 ed un indirizzo vpn di 10.8.0.1

I due si possono pingare a vicenda usando i due indirizzi 10.8.0.X

Sul raspberry pi 4 del sito blu gira un'applicazione (home assistant) alla quale i dispositivi collegati in locale accedono digitando nel browser l'indirizzo 192.168.4.106:9000.

Sulla macchina debian "rossa" posso fare il fetch dell'header della pagina web dell'applicazione in questione usando il comando:

# curl -I 10.8.0.2:9000
HTTP/1.1 405 Method Not Allowed
Content-Type: text/plain; charset=utf-8
Allow: GET
Content-Length: 23
Date: Mon, 28 Aug 2023 21:08:42 GMT
Server: Python/3.11 aiohttp/3.8.5

ovviamente se però digito sul browser di un dispositivo "rosso" l'indirizzo 10.8.0.2:9000 quello che ottengo un errore di ERR_CONNECTION_REFUSED.

Se faccio un tentativo disperato inserendo https://mioippubblicorosso.duckdns.org:9000 l'errore è ERR_CONNECTION_TIMED_OUT

con http://mioippubblicorosso.duckdns.org:9000 invece ottengo una pagina bianca con un 0 in alto a sinistra... :mbe:

Penso che il problema sia che le impostazioni di iptables non siano quelle giuste:

queste le impostazioni del debian "rosso":

*filter
:INPUT ACCEPT [798367:260106620]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [888248:1045630139]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A INPUT -i enp3s0 -p tcp -m tcp --dport 1194 -m comment --comment openvpn-input-rule -j ACCEPT
-A INPUT -i tun0 -p udp -m udp --dport 53 -m comment --comment pihole-DNS-rule -j ACCEPT
-A FORWARD -d 10.8.0.0/24 -i enp3s0 -o tun0 -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment openvpn-forward-rule -j ACCEPT
-A FORWARD -s 10.8.0.0/24 -i tun0 -o enp3s0 -m comment --comment openvpn-forward-rule -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o hassio -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o hassio -j DOCKER
-A FORWARD -i hassio ! -o hassio -j ACCEPT
-A FORWARD -i hassio -o hassio -j ACCEPT
-A DOCKER -d 172.30.32.6/32 ! -i hassio -o hassio -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER -d 172.30.33.0/32 ! -i hassio -o hassio -p tcp -m tcp --dport 8884 -j ACCEPT
-A DOCKER -d 172.30.33.0/32 ! -i hassio -o hassio -p tcp -m tcp --dport 8883 -j ACCEPT
-A DOCKER -d 172.30.33.0/32 ! -i hassio -o hassio -p tcp -m tcp --dport 1884 -j ACCEPT
-A DOCKER -d 172.30.33.0/32 ! -i hassio -o hassio -p tcp -m tcp --dport 1883 -j ACCEPT
-A DOCKER -d 172.30.33.2/32 ! -i hassio -o hassio -p tcp -m tcp --dport 1627 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i hassio ! -o hassio -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o hassio -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT

*nat
:PREROUTING ACCEPT [89173:19654854]
:INPUT ACCEPT [81910:19147179]
:OUTPUT ACCEPT [232311:13632379]
:POSTROUTING ACCEPT [233166:13680449]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
#-A POSTROUTING -s 10.31.73.0/24 -o enp3s0 -m comment --comment openvpn-nat-rule -j MASQUERADE
-A POSTROUTING -s 10.8.0.0/24 -o enp3s0 -m comment --comment openvpn-nat-rule -j MASQUERADE
-A PREROUTING -i enp3s0 -p tcp -s mioippubblicorosso.duckdns.org --dport 9000 -j DNAT --to-destination 10.8.0.2:9000
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.30.32.0/23 ! -o hassio -j MASQUERADE
-A POSTROUTING -s 172.30.32.6/32 -d 172.30.32.6/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A POSTROUTING -s 172.30.33.0/32 -d 172.30.33.0/32 -p tcp -m tcp --dport 8884 -j MASQUERADE
-A POSTROUTING -s 172.30.33.0/32 -d 172.30.33.0/32 -p tcp -m tcp --dport 8883 -j MASQUERADE
-A POSTROUTING -s 172.30.33.0/32 -d 172.30.33.0/32 -p tcp -m tcp --dport 1884 -j MASQUERADE
-A POSTROUTING -s 172.30.33.0/32 -d 172.30.33.0/32 -p tcp -m tcp --dport 1883 -j MASQUERADE
-A POSTROUTING -s 172.30.33.2/32 -d 172.30.33.2/32 -p tcp -m tcp --dport 1627 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i hassio -j RETURN
-A DOCKER ! -i hassio -p tcp -m tcp --dport 4357 -j DNAT --to-destination 172.30.32.6:80
-A DOCKER ! -i hassio -p tcp -m tcp --dport 8884 -j DNAT --to-destination 172.30.33.0:8884
-A DOCKER ! -i hassio -p tcp -m tcp --dport 8883 -j DNAT --to-destination 172.30.33.0:8883
-A DOCKER ! -i hassio -p tcp -m tcp --dport 1884 -j DNAT --to-destination 172.30.33.0:1884
-A DOCKER ! -i hassio -p tcp -m tcp --dport 1883 -j DNAT --to-destination 172.30.33.0:1883
-A DOCKER ! -i hassio -p tcp -m tcp --dport 1627 -j DNAT --to-destination 172.30.33.2:1627
COMMIT




Queste del raspberry pi 4 "blu" dove c'è il client openvpn:

*filter
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3389 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 9000 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -i tun0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.4.106
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
-A PREROUTING -p tcp -s 10.8.0.1 --dport 9000 -j DNAT --to-destination 192.168.4.106:9000
COMMIT




Qualcuno vuol tentare di aiutarmi?
Grazie

moraa2
29-08-2023, 08:39
cambierei la politica da "rilascia" a "rifiuta". nel caso in cui tu abbia alcune app che tentano di superare alcune porte sconosciute, potresti ritrovarti in uno stato bloccato finché non riescono a raggiungere il timeout. Internet in entrata dovrebbe essere eliminato, ma lan mi piace vivere rifiutando

massi_it
29-08-2023, 09:46
ti ringrazio dei suggerimenti, ma al momento avrei bisogno di qualcosa di più specifico inerente il problema sopra indicato.

Kaya
29-08-2023, 16:21
Ho letto sommariamente (e prima domanda, perchè usi iptables puro e non ti appoggi a qualcosa di più "comodo" tipo shorewall?) ma una cosa non capisco.
Nella tua rete, chi è il gateway? il router FW o il debian? perchè se è il router è più probabile che sia un problema di mancanza di instradamento (cioè il fw non sa dove mandare i pacchetti, perchè se ho capito bene, è il debian e il rasp che hanno instaurato la vpn tra di loro)

massi_it
29-08-2023, 16:35
Ho letto sommariamente (e prima domanda, perchè usi iptables puro e non ti appoggi a qualcosa di più "comodo" tipo shorewall?) ma una cosa non capisco.
Nella tua rete, chi è il gateway? il router FW o il debian? perchè se è il router è più probabile che sia un problema di mancanza di instradamento (cioè il fw non sa dove mandare i pacchetti, perchè se ho capito bene, è il debian e il rasp che hanno instaurato la vpn tra di loro)

Non mi sono mai occupato di questioni di networking fintanto che non ne ho avuto necessità... quindi è probabile che abbia fatto qualche sciocchezza...

Il gateway, in entrambi i siti è il router. Nel sito "rosso", quallo con il debian che fa da DHCP, il router manda tutti i pacchetti al DNS del debian per fare il filtraggio tramite pihole e risolve tramite, mi pare, con opendns e cloudflare.

Da quello che ho capito il client vpn del raspberry parla direttamente con il vpn server del debian e poi fanno loro l'instradamento dei pacchetti tramite iptables.

Ma potrebbe benissimo non essere così in quanto, come dicevo, per me è tutto nuovo...

Avevo provato qualcosa di più semplice rispetto a iptables, ovver ufw, ma ho piantato su un casino e mi si bloccava tutto....

Intanto provo a vedere se ci capisco qualcosa con shorewall.

Grazie mille per l'intervento :)

Kaya
30-08-2023, 08:24
Il problema penso stiano nelle regole di routing DEI CLIENT.

Riassumo, così forse si capisce anche se ho capito la configurazione

Tu hai due reti distinte, che hai messo "in comunicazione" tramite una VPN che è instaurata tra due dispositivi (un pc e un rasp per capirsi).
I client però (praticamente gli altri pc a valle del roouter) hanno come gateway il router, il quale NON SA NULLA, del fatto che c'è una vpn attiva.
Pertanto, quando un client dice "ehi Router Fastweb, voglio andare sul pc con ip 192.168.1.104 " il router fa quello che fa per ogni richiesta e quindi inoltra il pacchetto sulla WAN, che risponde picche.

Hai due strade in questo caso.
Immettere sui client la rotta statica ROUTE ADD 192.168.1.0 MASK 255.255.255.255 GW PC_DEBIAN
oppure mettere di mezzo un firewall che supporti un vpn site to site con l'altra rete (pfsense tipo, o forse anche fritzbox)

O almeno, così è quello che ho capito possa essere il problema, ma lo dovresti capire anche con un tracert da uno dei client verso gli ip della vpn/ altra rete