GNU/Linux >> Znalost Linux >  >> Linux

Linux – Jak přesměrovat provoz mezi linuxovými síťovými jmennými prostory?

Podařilo se mi nastavit síťový jmenný prostor a spustit server, který naslouchá na 127.0.0.1 uvnitř jmenného prostoru:

# ip netns add vpn
# ip netns exec vpn ip link set dev lo up
# ip netns exec vpn nc -l -s 127.0.0.1 -p 80 &

# ip netns exec vpn netstat -tlpn

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      5598/nc

Poté se mohu připojit k serveru uvnitř jmenného prostoru:

# ip netns exec vpn nc 127.0.0.1 80 -zv
localhost [127.0.0.1] 80 (http) open

Nemohu se však připojit k serveru mimo jmenný prostor:

# nc 127.0.0.1 80
(UNKNOWN) [127.0.0.1] 80 (http) : Connection refused

Jak nakonfigurovat iptables nebo jmenný prostor pro předávání provozu z globálního jmenného prostoru do jmenného prostoru vpn?

Přijatá odpověď:

Za prvé:Nemyslím si, že toho můžete dosáhnout pomocí 127.0.0.0/8 a/nebo rozhraní zpětné smyčky (jako lo). Musíte použít nějaké další IP adresy a rozhraní, protože pro 127.0.0.0/8 a pro zpětnou smyčku existují specifické věci.

Pak určitě existuje více než jedna metoda, ale zde je příklad:

# ip netns add vpn
# ip link add name vethhost0 type veth peer name vethvpn0
# ip link set vethvpn0 netns vpn
# ip addr add 10.0.0.1/24 dev vethhost0
# ip netns exec vpn ip addr add 10.0.0.2/24 dev vethvpn0
# ip link set vethhost0 up
# ip netns exec vpn ip link set vethvpn0 up
# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.134 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.100 ms

První příkaz vytvoří ze vzduchu pár virtuálních ethernetových rozhraní propojených virtuálním ethernetovým kabelem. Druhý příkaz přesune jedno z těchto rozhraní do netns vpn. Považujte to za ekvivalent věcí jako socketpair(2) nebo pipe(2):proces vytvoří pár, pak se rozdělí a každý proces si ponechá pouze jeden konec páru a mohou spolu komunikovat.

Obvykle (LXC, virt-manager,…) je také zapojen most, který vše umístí do stejné LAN, když máte mnoho sítí.

Jakmile je to na místě, je to pro hostitele jako každý router.
Povolte přesměrování IP (pokud můžete, buďte přísnější:potřebujete to alespoň pro vethhost0 a hlavní rozhraní):

# echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

Přidejte nějaké pravidlo DNAT, například:

# iptables -t nat -A PREROUTING ! -s 10.0.0.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

Nyní můžete buď přidat výchozí trasu do vpn pomocí:

# ip netns exec vpn ip route add default via 10.0.0.1

Nebo místo toho přidejte pravidlo SNAT, aby bylo vše uvnitř vpn považováno za pocházející z 10.0.0.1.

# iptables -t nat -A POSTROUTING -d 10.0.0.2/24 -j SNAT --to-source 10.0.0.1

S tímto na místě můžete testovat z jakéhokoli jiného hostitele, ale ne z hostitele samotného. Chcete-li to provést, přidejte také pravidlo DNAT podobné předchozímu DNAT, ale ve OUTPUT a změněné (jinak by se změnilo i jakékoli odchozí připojení http) na vaši vlastní IP. Řekněme, že vaše IP adresa je 192.168.1.2:

# iptables -t nat -A OUTPUT -d 192.168.1.2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

Nyní to bude fungovat, i když se připojíte od hostitele k sobě pokud nepoužíváte IP adresu se zpětnou smyčkou, ale jakoukoli jinou IP adresu hostitele s pravidlem nat, jak je uvedeno výše. Řekněme, že vaše IP adresa je 192.168.1.2:

# ip netns exec vpn nc -l -s 10.0.0.2 -p 80 &
[1] 10639
# nc -vz 192.168.1.2 80
nc: myhost (192.168.1.2) 80 [http] open
#
[1]+  Done                    ip netns exec vpn nc -l -s 10.0.0.2 -p 80

Linux
  1. Jak vytvořit síťové sdílení přes Samba na Linuxu

  2. Jak provést Chroot s jmennými prostory Linuxu?

  3. Linux – Jak zrušit sdílení sítě pro aktuální proces?

  1. Linux – Jak vypsat jmenné prostory v Linuxu?

  2. Jak monitorovat a protokolovat síťový provoz v systému Linux pomocí vnStat

  3. Jak rozlišovat mezi 2 Micros na Linuxu

  1. Jak používat příkaz Linux mtr

  2. Jak monitorovat síťový provoz na Linuxu pomocí vnStat

  3. Linux:Jak měřit denní/měsíční síťový provoz?