OpenVPN egyedi felhasználói szabállyal

Fórumok

Adott egy teljesen jól működő OpenVPN szerver Leap 15.5-ön. (IP: 10.66.4.3)
Alapból a hozzá csatlakozó felhasználók (ez csak én vagyok jelenleg) látják a teljes hálózatot.
Ehhez engedélyeztem az ip továbbítást és az openvpn szerver konfig vonatkozó része így néz ki:

server 10.8.5.0 255.255.255.0
ifconfig-pool-persist /var/run/openvpn/ipp.txt
push "route 10.66.4.0 255.255.255.0"

Felvettem egy tűzfal szabályt:

ipv4 -t nat -A POSTROUTING -s 10.8.5.0/24 -o eth0 -j MASQUERADE

Mint írtam, a vpn így teljesen jól működik.

Viszont felmerült az igény, hogy külső felhasználók hozzáférjenek a belső hálózaton futó samba fájlszerveren (IP: 10.66.4.5) megosztott mappákhoz.
Ezt én úgy gondoltam megoldani, hogy beállítok egyedi felhasználói hozzáférést az OpenVPN szerveren és onnan csak a samba irányába engedem tovább az adott felhasználókat.
Ehhez felvettem az opnvpn szerver konfigba egy új virtuális IP tartományt és megadtam a felhasználói konfig fájlok helyét:

route 10.8.55.0 255.255.255.0
client-config-dir ccd

A ccd mappában létrehoztam egy konfig fájlt a felhasználónak az alábbi tartalommal:

ifconfig-push 10.8.55.1 10.8.55.2
iroute 10.8.55.0 255.255.255.0

Majd hozzáadtam egy tűzfalszabályt:

ipv4 filter FORWARD 0 -i tun0 -s 10.8.55.0/24 -d 10.66.4.5 -j ACCEPT

A felhasználó és az openvpn szerver között hibátlanul létrejön a kapcsolat, a felhasználó gépe megkapja a 10.8.55.1 ip címet.
Ennek ellenére a felhasználó nem éri el a fájlszervert (10.66.4.5)

A tűzfal logban nem látszik, hogy a tun0 csatolón megjelenne eldobott forgalom.

Íme a szerver routing táblája:

# ip -4 route show
default via 10.66.4.254 dev eth0
10.8.5.0/24 via 10.8.5.2 dev tun0
10.8.5.2 dev tun0 proto kernel scope link src 10.8.5.1
10.8.55.0/24 via 10.8.5.2 dev tun0
10.66.4.0/24 dev eth0 proto kernel scope link src 10.66.4.3

Vajon mit szúrtam el vagy néztem be?
Minden ötletet szívesen fogadok.

Köszi:

 

Szerk.:

A hálózatban lévő eszközök:

10.66.4.254 - Router

10.66.4.3 - VPN szerver - Virtuális alháló: 10.8.5.0/24 és 10.8.55.0/24

10.66.4.5 - Fájlszerver

Az eredeti leírás, ami alapján az egészet elkezdtem/összeraktam.

Hozzászólások

Szerkesztve: 2024. 02. 09., p – 07:44

És a cél szerver is tudja, hogy ez az új tartomány merre van?

Ha nem, akkor csak úgy fog menni, ha a VPN szerver a default GW-je. - (vagy felveszel rajta egy static route bejegyzést)

(vagy MASQ-olod, ahogy  a működő tartománmyt is...)

Esetleg a szerveren lokális tűzfal?

Nem kell beállítani a célszerveren default route-nak a VPN szervert. Két opció is van:

1, A cél szerveren fel kell venni a felhasználóknak kiosztott tartományhoz route-ként a VPN szerver IP címét

2, A hálózati routeren is meg lehet csinálni ugyanezt. Véleményem szerint ez lenne célszerűbb, hiszen így később ha mást is el kell érniük, akkor nem kell minden szerveren egyesével külön managelni a route-okat.

Ezzel annyi bajod lesz, hogy nem fogod tudni felhasználóhoz kötni a kapcsolatokat, mert minden VPN felhasználó tevékenysége a VPN szerver IP címével fog látszani a Samba (és összes többi) szerveren...

Sokkal jobb megoldás lenne az előbb javasolt módszer, hogy a hálózat router-én fel kellene venni egy statikus útvonalat, hogy a VPN kliens tartományok átjárója a VPN szerver címe, és akkor megoldódik az elérés is, és a VPN kliensek kapcsolatainak azonosíthatósága is.

Ezzel annyi bajod lesz, hogy nem fogod tudni felhasználóhoz kötni a kapcsolatokat, mert minden VPN felhasználó tevékenysége a VPN szerver IP címével fog látszani a Samba (és összes többi) szerveren...

Köszi, ez nem elhanyagolandó tényező.

Sokkal jobb megoldás lenne az előbb javasolt módszer, hogy a hálózat router-én fel kellene venni egy statikus útvonalat, hogy a VPN kliens tartományok átjárója a VPN szerver címe,

Tudsz adni valami támpontot, hogy miként is kellene ezt?

Hát ez egyszerű:

/ip route add comment="OpenVPN egyik subnet" distance=1 dst-address=10.8.5.0/24 gateway=10.66.4.3
/ip route add comment="OpenVPN másik subnet" distance=1 dst-address=10.8.55.0/24 gateway=10.66.4.3

Ezzel eléred, hogy a 10.66.4.0/24 hálózatban aki a 10.8.5.0/24 és 10.8.55.0/24 címeket próbálja elérni, az a default gw-n keresztül simán eléri az egyes gépek route táblájának módosítása nélkül.

Kipróbáltam. Nem működik.

Szerintem alapvetően azért, mert routeren nem jelenik meg 10.8.55.0/24 tartományból érkező forgalom.

Csakhogy tiszta legyen (számomra is).

A routeren NAT került beállításra, ami szerint a 1194-es porton érkező kéréseket a 10.66.4.3 címre irányítja. A VPN kliens így közvetlenül kapcsolódik a VPN szerverhez a tun0 csatolón keresztül és ott kap egy (a VPN szerver által generált) virtuális IP címet a 10.8.55.0/24 tartományból. Evvel annyit értünk el, hogy a kliens látja a szervert. Ahhoz, hogy a VPN szerverhez kapcsolódva a kliens hozzáférjen a belső hálózathoz, a szerveren futó tűzfalon kell kiengednünk a tun0 csatolón keresztül.

Ezért gondolom a VPN szerveren kell megfelelő tűzfal szabályokat beállítani.

Ha jól értem, akkor a router mögött van egy, a hálózat tekintetében kutya közönséges gép és ez terminálja a VPN forgalmat. Ezen a ponton a VPN kliens a fogadó gépet látja - az óhaj viszont az lenne, hogy lásson mindent is, amit a fogadó gép lát.

Ha ez valóban alapban egy szimpla mezei host, akkor default nincs bekapcsolva a forwarding. Egy cat /proc/sys/net/ipv4/ip_forward informatív a témában, ha a kimenet 0, akkor nincs bekapcsolva.

Át kel gondolni a csomagok útvonalát is. Az "oda" iránnyal nem lesz gond, mert a kliens --> fogadó --> célgép irány működni fog. A probléma az, hogy a célgép --> VPN kliens irány esetén mivel a célgépnek tippje nincs, merre keresse a VPN klienst, a választ a default gw.-nek küldi el, aki viszont ezzel szintén nem fog tudni mit csinálni. Tehát a megoldási lehetőségek:

  • a legrondább, de minimális erőfeszítést igénylő megoldás, hogy a VPN fogadó gépen állítasz egy NAT szabályt, olyasmit, hogy iptables -t nat -A POSTROUTING -i tun0 -o eth0 -j MASQUERADE - ebben az esetben minden, a tunelből jövő forgalom úgy megy tovább a hálón, mintha a VPN szervertől jönne a csomag. Ekkor a célgép nem a VPN kliens felé akarja a csomagot visszaküldeni, hanem a VPN fogadó felé, aki viszont ismert subnetben van. Ennek a megoldásnak viszont hátránya, (ahogy azt már írták mások is), hogy a VPN mögötti összes kliens forgalma minden célgépen úgy jelenik meg, mintha a VPN fogadó akart volna kommunikálni.
  • az elegáns megoldás, hogy minden érintett géppel tudatod, hogy a VPN klienesek által használatos subnet merre érhető el. Mivel több célsubnet is van, ezért ez jó eséllyel a routeren is igényel beállítást, hogy a másik subnetből a VPN felé tartó forgalom a VPN server felé küldendő tovább. Ez ugyan korrekt megoldás, viszont nem egyszerű.
  • átgondolod a helyzetet és a VPN fogadót a routerre teszed. Ekkor mindenhol mindenkinek minden route irány jó lesz - viszont ennek ára, hogy a VPN fogadót át kell helyezned. Itt gyanítom  egyéb okok fognak a háttérben állni, amiért ez esetleg nem/nehezen oldható meg.

Ha jól értem, akkor a router mögött van egy, a hálózat tekintetében kutya közönséges gép és ez terminálja a VPN forgalmat.

Jól érted.

az óhaj viszont az lenne, hogy lásson mindent is, amit a fogadó gép lát.

Ez megoldott és működik.

Az óhaj az lenne, hogy a VPN szerver által létrehozott alhálóból (10.8.55.0) IP címet kapó kliensek számára csak és kizárólag egyetlen célgép legyen a belső hálózaton.

Ehhez elsődlegesen a VPN fogadó gépen kell egy tűzfal szabály, ami kiengedi a tunelből a forgalmat a megadott irányba. A leírás szerint ezt az alábbi szabállal érhetem el:

iptables -A FORWARD -i tun0 -s 10.8.55.0/24 -d 10.66.4.5 -j ACCEPT

Ám hiába, esetünkben a 10.8.55.1 IP címmel rendelkező kliens egyáltalán nem lát semmit a belső hálóból.

Az alábbi nat szabály lehetővé teszi, hogy a kliens csak a célszervert érje el és az ott engedélyezett műveleteket elvégezze.

ipv4 -t nat -A POSTROUTING -s 10.8.55.0/24 -d 10.66.4.5 -o eth0 -j MASQUERADE

Az eredeti problémám itt meg is oldódott, ám erre volt az a jogos felvetés, hogy

VPN mögötti összes kliens forgalma minden célgépen úgy jelenik meg, mintha a VPN fogadó akart volna kommunikálni.

Nyilvánvaló van az a helyzet, amikor ennek nincs jelentősége. Ám amikor szeretném tudni, hogy pontosan melyik kliens kotorászott a célgépen, akkor azt miként lehet megoldani?

Úgy gondolom, hogy elsődlegesen a VPN szerveren futó tűzfalon kell megfelelően kiengedni a subnet forgalmat és másodlagosan kell a hálózati beállításokkal foglalkozni.

Ahhoz, hogy a VPN fogadón ne kelljen maszkolni a kimenő forgalmat és a VPN kliensei mégis tudjanak kapcsolódni a belső hálózat bármely gépéhez, ahhoz szükséges az, hogy tudják: merre érhető el az a gép, amely a VPN-en keresztül forgalmaz.

Más szavakkal: egy kapcsolat akkor lesz működő képes, ha nem csak az A host tudja, hogy merre kell küldeni a csomagot, ha a B hostot el akarja érni, hanem a B hostnak is tudnia kell, hogy merre kell küldenie a (válasz)csomagot ahhoz, hogy az az A host felé induljon. Amikor te kialakítasz egy VPN fogadót és a működéséhez létre hozol egy új subnetet, akkor megváltoztatod az eredeti hálózat topológiáját! Innen kezdve megjelenik egy új router, amelyen keresztül a VPN subnet(és így a VPN-ben lévő gépek) elérhetőek lesznek. De ha a hálózat nem rendelkezik azzal az infóval, hogy van egy új router, amelyen egy új subnet elérhető, akkor az oda szánt csomagokat rossz irányba, a default gw felé fogja route-olni. Na most ezen a ponton minimum, hogy a hálózati routeren be kell állítani, hogy a VPN szerveren keresztül elérhető a VPN subnet.

... no, milyen jó, hogy visszaolvastam a te hozzászólásodat is meg az enyémet is. Mert amit ugyan leírtam, az igaz - de általánosan, neked meg egyetlen host kell csak. Ezen a ponton amit írtam, az igaz - viszont ebben a speciális esetben van más megoldás is, ami neked jó lehet... :-)

Szóval: a VPN szerverre húzz fel két IP címet is a helyi hálózatból, a nat tábla POSTROUTING  láncán viszont ne MASQUERADE targetet használj, hanem SNAT --to-source $MASIKIP ahol a MASIKIP a VPN szerverre felhúzott másik IP cím. Ekkor minden VPN forgalom a belső hálón valós IP-vel jelenik meg, de már nem a VPN fogadó IP-je lesz, hanem az extra IP a hálózatból.

Nna, itt meg tartok tőle, túlságosan leegyszerűsítettem a feladatot: ez akkor jó, ha a  VPN-ből csak egy kliens jön. De az viszont továbbra is igaz, hogy egyetlen gép elérése a cél. Az megoldható, hogy a cél gépen egy extra route-ot felvegyél? Tehát a 10.66.4.5 gépen mondj valami olyasmit, hogy route add -net 10.8.55.0 netmask 255.255.255.0 gw $VPNSERVER_HELYI_IP - ekkor a 10.66.4.5 tudni fogja, hog ya VPN-beli IP címeket a VPN fogadó felé kell visszaküldeni.
No igen. Viszont ha a 10.66.4.5 nem abban a subnetben van,ahol a VPN szerver, akkor ez nem fog menni - akkor ő mindenkép a számára def.gw router felé fogj a válasz csomagot indítani és ekkor a routeren kell ezt a sort felvenni, hogy a router küldje el jó helyre a csomagot. De ebben az esetben nem csak a 10.66.4.5 válasza fog jó irányba menni, hanem az adott subnet összes gépének forgalma. Hogy ez probléma-e, azt te tudod - ha igen, akkor a megfelelő iptables szabállyla a többiek elérése tiltható.