Více bran při víc IP, ale jedna MAC

Více bran při víc IP, ale jedna MAC
« kdy: 18. 07. 2022, 08:12:35 »
Je možné na linuxu v roli routeru na jednom rozhraní mít více bran( ne ve smyslu výstupních v ip+route, ale "vstupních" tedy) —přidat více ip adres na rozhraní jde, ale sdílí jednu MAC a komunikující zařízení tedy můžou mít nastaveny odlišné brány(t.j. odlißné ip), ale díky arp se resolvují na stejnou MAC a router informaci, na jakou ip brány paket šel, neuvidí (jelikož ip paket se nemění kromě ttl a hashe)

Mám podezření že jde o podivný nápad(vymyšlení hranatého kolo), problém jde řešit lépe, oradite jak "po správnu"? Je nutné použít VLANy, nebo bohatě stačí segmentace přiřazenych IP a následně ip yource routing

Myšlenka:
Například když si určitý komp nakliká ve Windows jinou bránu za účelem aby provoz teéto stanice šel jinou routovací trasou (pres vpn, nebo jinym rozhranim , ale na routeru až))Měnit IP by bylo fuj, jde furt o jeden stejny komp

A:
Je možné vlinuxu síťové kartě nastavit vícero MAC? Dá se to usělat víc způsoby(vlan-s/bez) pres nejaky virtualni switch?
« Poslední změna: 18. 07. 2022, 09:40:42 od Petr Krčmář »


Re:Více bran při víc IP, ale jedna MAC
« Odpověď #1 kdy: 18. 07. 2022, 11:06:22 »
Když už si má uživatel měnit bránu, pak není žádný problém, aby si měnil i IP adresu. Routing probíhá na vrstvě IP, takže použité MAC adresy do procesu rozhodování nevstupují, jsou to jen prostředky k tomu, jak datagram dostat do patřičného routeru, tam se datagram vybalí a obálka spojové vrstvy se zahodí.

Pokud bys za každou cenu chtěl měnit _jen_ IP adresu brány, nejspíš by to šlo zařídit pomocí funkce macvlan, která na základě MAC adresy rozděluje provoz jednoho fyzického rozhraní mezi několik logických rozhraní. Pokud ovšem klienti budou používat s oběma branami stejný adresní rozsah, povede to ke konfliktu, kdy router nebude vědět, kterým logickým rozhraním má poslat provoz k tomu kterému klientovi. Taky na to je řešení v podobě network namespaces, nebo (komplikovanější) vrf.

Proti tomu mnohem jednodušší řešení jsou prostě dvě různé VLANy, resp. 2 různé essid na Wi-Fi, každá s vlastním nekolizním adresním rozsahem. Uživatel jednoduše zvolí cestu výběrem bezdrátové sítě nebo zapojením počítače do správné zásuvky.

Re:Více bran při víc IP, ale jedna MAC
« Odpověď #2 kdy: 18. 07. 2022, 13:17:15 »
Co je cílem?

Aby jeden router měl víc uplinků = víc default routů do divokého internetu, a klient aby si volbou subnetu v LAN mohl zvolit, kterým uplinkem chce ven?

Víc uplinků do divokého internetu především znamená, nějak rozpoltit "routing process" do více instancí. Dá se to několika způsoby. Byla tu zmínka o network namespaces, vrf, já bych dodal ještě policy-based routing .

A ano, macvlan + network namespaces jsou asi nejlehčí tonáž, pomocí které lze zařídit "kontejnerizaci" networking stacku, včetně přidělení dedicated MAC adresy, tak aby to ven koukalo sdíleným fyzickým L2 rozhraním.

5nik

Re:Více bran při víc IP, ale jedna MAC
« Odpověď #3 kdy: 18. 07. 2022, 15:57:36 »
Napadá mne prasárna typu:
- podvržení sekundární MAC adresy pomocí arpreply v ebtables
- označení a zpracování paketů jdoucí na tuto falešnou MAC adresu (packetmark a následně routingmark a adekvátní routovací tabulku)

Samozřejmě to předpokládá, aby byl fyzický interface součástí bridge. Omlouvám se za názvosloví, FW na linuxu jsem nestavěl již několik (>10) let. Na Mtiku bych to mohl zkusit odsimulovat. Samozřejmě je to neefektivní prasárna. Ale mohlo by to fungovat.

Re:Více bran při víc IP, ale jedna MAC
« Odpověď #4 kdy: 19. 07. 2022, 18:03:44 »
Ohledně kombinace "network namespace + macvlan", mám-li být konkrétnější, nedávno jsem potřeboval cosi otestovat, a nasimulovat větší počet klientských instancí jednoho... "programu", který se nerad spouští opakovaně na tomtéž fyzickém síťovém rozhraní. Takže jsem ho potřeboval zavřít na jeho vlastní "lehce virtuální" pískoviště. Přitom ale aby všechny ty instance jely ven do světa přes totéž fyzické rozhraní. Prostě takový generátor specifického bordelu na síti, proti testované "servisce". Velice mi pomohl článek Dana Ohnesorga tady na rootu.

Níže se pokusím přiložit výpisy dvou skriptů + malého sdíleného konfiguráku.

Soubor cfg.sh :
Kód: [Vybrat]
IPNET_BASE="192.168.4."
IPNET_SLASH="24"
IP_ADDR_BASE="20"

PHYNET=eth1
COUNT=20

Soubor start.sh :
Kód: [Vybrat]
#!/bin/bash

. cfg.sh

echo Bringing up interface $PHYNET
ip link set dev $PHYNET up

for (( idx = 0; idx<$COUNT; idx++)) do
        IP_ADDR_LAST_BYTE=$(($IP_ADDR_BASE + $idx))
        IP_ADDR="${IPNET_BASE}${IP_ADDR_LAST_BYTE}"
        CFGFILE=my_program${idx}.conf
        NAMESPACE=mycustomns$idx
        NETIF=macvlan$idx
        echo Adding $NAMESPACE $NETIF $IP_ADDR $CFGFILE
        ip link add $NETIF link $PHYNET type macvlan mode private
        ip netns add $NAMESPACE
        ip link set $NETIF netns $NAMESPACE
        ip netns exec $NAMESPACE ip addr add dev $NETIF $IP_ADDR/$IPNET_SLASH
        # "netif up" must be done *after* the netif gets assigned to a namespace
        ip netns exec $NAMESPACE ip link set $NETIF up
        # Note: it takes a moment for the interface to transition from NO-CARRIER to LOWER_UP
        #ip netns exec $NAMESPACE ip link show $NETIF
        ip netns exec $NAMESPACE ip addr show $NETIF
        # Create a per-instance config file
        cp master.conf $CFGFILE
        echo "something or another" >> $CFGFILE

        echo "Starting instance $idx of my_program in the background"
        nohup ip netns exec $NAMESPACE my_program -c $CFGFILE > nohup${idx}.out &
done

Soubor stop.sh :
Kód: [Vybrat]
#!/bin/bash

. cfg.sh

killall my_program

for (( idx = 0; idx<$COUNT; idx++)) do
        IP_ADDR_LAST_BYTE=$(($IP_ADDR_BASE + $idx))
        IP_ADDR="${IPNET_BASE}${IP_ADDR_LAST_BYTE}"
        CFGFILE=my_program${idx}.conf
        NAMESPACE=mycustomns$idx
        NETIF=macvlan$idx
        echo Removing $NAMESPACE $NETIF $IP_ADDR $CFGFILE
        ip netns exec $NAMESPACE ip addr delete dev $NETIF $IP_ADDR/$IPNET_SLASH
        ip netns exec $NAMESPACE ip link delete $NETIF
        ip netns delete $NAMESPACE
        rm $CFGFILE
        #echo  leaving nohup${idx}.out in place for your reference
        rm nohup${idx}.out
done

echo Shutting down interface $PHYNET
ip link set dev $PHYNET down

Pro jistotu nechci být konkrétní, co to bylo zač - takže ten skript je následně maličko upravený, bez finálního otestování.

Každé virtuální macvlan rozhraní dostane nějakou vygenerovanou MAC adresu. Popravdě jsem je nezkoumal, takže nevím, jak vlastně vypadají. Ani jsem je nezkoušel nastavit natvrdo. Asi bych zkusil něco jako

Kód: [Vybrat]
ip nents exec $NAMESPACE ip link set $NETIF address 02:01:b0:0b:13:55
...a následně zkontrolovat pomocí

Kód: [Vybrat]
ip nents exec $NAMESPACE ip link show $NETIF
To je jenom taková malá ochutnávka, jak zabydlet namespace - buď jednotlivě, nebo taky hromadně větším počtem instancí téhož softíku.