• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

mehrere gleichzeitig ausgehende IPs

kruppa

Newbie
Hallo, ich möchte auf einem Server mehrere IPs nutzen. Diese sind bereits eingerichtet und ich kann auch die ausgehende IP wechseln. Allerdings kann ich immer nur eine IP zur selben Zeit benutzen. Ich würde gerne für verschiedene Programme, verschiedene IPs nutzen. Gibt es da eine Lösung für. Virtuelle Maschinen kommen dafür aber nicht in Frage.

Hoffe auf hilfreiche Tipps
 
kruppa schrieb:
...Allerdings kann ich immer nur eine IP zur selben Zeit benutzen....
Auf welchem device .. oder welchem process .. oder virtuellem device??? Deine Infos sind viel zu dürftig für eine Antwort
Warum willst du das tun? Keine Angst, ich fürchte mich vor gar nichts.
 
OP
K

kruppa

Newbie
ich poste einfach mal die gekürzte Ausgabe von ifconfig:

Code:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *.*.*.4  netmask 255.255.255.255  broadcast *.*.*.4

eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *.*.*.75  netmask 255.255.255.255  broadcast *.*.*.75
        
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *.*.*.45  netmask 255.255.255.255  broadcast *.*.*.45

eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *.*.*.90  netmask 255.255.255.255  broadcast *.*.*.90

Zugriff sollen verschiedene PHP Programme haben, die über das Terminal gestartet werden, also ohne Webserver.
 
kruppa schrieb:
ich poste einfach mal die gekürzte Ausgabe von ifconfig:

Code:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *.*.*.4  netmask 255.255.255.255  broadcast *.*.*.4

eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *.*.*.75  netmask 255.255.255.255  broadcast *.*.*.75
        
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *.*.*.45  netmask 255.255.255.255  broadcast *.*.*.45

eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *.*.*.90  netmask 255.255.255.255  broadcast *.*.*.90

Zugriff sollen verschiedene PHP Programme haben, die über das Terminal gestartet werden, also ohne Webserver.
ok, du hast eine static IP PLUS mehere IP_aliases auf einem ethernet device.
Ich gehe davon aus, dass alle IPs (natürlich unterschiedliche) einer Class angehören??
Warum ist netmask 255.255.255.255, weil nur eine alias IP? So wird aber kein routing funktionieren, auch nicht mit Aliases.
 
OP
K

kruppa

Newbie
Die IPs gehören nicht zur selben Class. Routing habe ich z.B. mit
Code:
ip route add default dev eth0 via *.*.96.1 src  *.*.19.45
ändern können.
 
kruppa schrieb:
Die IPs gehören nicht zur selben Class. Routing habe ich z.B. mit
Code:
ip route add default dev eth0 via *.*.96.1 src  *.*.19.45
ändern können.

routing hast du ändern können ... das ist ja wunderbar!
Warum gibst du dann nicht das Resultat von
Code:
# ip -d route show
preis? Geheim? Keine Lust? Oder meinst du vielleicht, dass diese Kuh gefälligst nachfragen soll.

Ich glaube, du weißt ja gar nicht was du im Grunde willst.
Hier ist Ende mit meiner Unterstützung
 

spoensche

Moderator
Teammitglied
Das kannst du mittels cgroups durchführen, in dem du den jeweiligen PHP Prozess in eine cgroup packst und der cgroup anschließend noch das jeweilige Interface zuweist.
 
OP
K

kruppa

Newbie
Der Tipp mit den cgroups hört sich sehr vielversprechen an. Danke. Ich werde es mal probieren
 
OP
K

kruppa

Newbie
Wie weise ich denn einer cgroup ein Device zu? Es sind ja nur Alias-Devices. Ich habe mal folgendes gemacht und bekomme einen Fehler:

Code:
echo "eth0:0 5" > net_prio.ifpriomap
-bash: echo: write error: No such device

Lese ich net_prio.ifpriomap aus kommt nur:

Code:
cat net_prio.ifpriomap
lo 0
eth0 0

Was kann ich tun?
 

MH1962

Member
Es gibt kein generisches Verfahren, einem bestimmten Programm eine bestimmte IP zuzuweisen.

Das Programm muss letztendlich die libc-Funktion bind() mit der gewollten IP aufrufen. Wie man das Programm dazu bringt, ist Sache des Programms.

Z.B. in postfix muss man in der main.cf die Config-Variable inet_interfaces setzen. Und so weiter, in jedem Programm anders. Es geht auch mit ausgehendem Traffic, z.B, bei ssh mit dem Command Line Switch "-b" oder bei ping mit "-I".

Will man es anders haben, braucht man tatsächlich irgendeine Art von Virtualisierung. Auch die bereits angesprochenen cgroups sind ja schon ein Virtualisierungs-Feature.
 

spoensche

Moderator
Teammitglied
MH1962 schrieb:
Auch die bereits angesprochenen cgroups sind ja schon ein Virtualisierungs-Feature.

Die Control Groups sind kein Virtualisierungs-Feature, sonden dienen dazu lokale Prozesse zu isolieren. Dafür erhält der Process einen Namespace und in diesem Namespace können diverse Limitierungen konfiguriert werden. Namespaces gibt es auch fürs Netzwerk und werden mit dem Tool ip konfiguriert.

Diese vorhanden Features für die Isolation werden von LXC, LXD etc. verwendet und erweitert, um die Container Virtualisierung zu ermöglichen.

Unterschiede zwischen Container Virtualisierung und einem Typ 1 Hypervisor sind folgende:

1. Container verwenden den aktuell gebooteten Kernel um Zugriff auf z.B. Netzwerkinterface zu erhalten.
2. D.h, der Overhead ist nahezu 0, weil keine Hardware abgebildet bzw. emuliert werden muss.
3. Container müssen nicht zwangsläufig ein vollständiges System sein. Sie können auch einfach nur eine Anwendung beinhalten. (also so eine Art Sandbox)

kruppa schrieb:
jetzt wäre es schön zu wissen ob man PHP dazu bringen kann die IP zu wählen.

Ein Blick in die PHP Doku der Socket Funktionen gibt dir Auskunft darüber, dass dies machbar ist. Dabei ist aber einiges zu beachten.
 
OP
K

kruppa

Newbie
Ich habe jetzt die Idee die Pakete mit cgroup zu markieren und dann mit iptables entsprechend der IP zuzuweisen. Leider scheint bei folgendem Code irgendein Fehler zu sein:

Code:
cd /sys/fs/cgroup/net_cls/
mkdir new_route
cd new_route
echo 0x00110011 > net_cls.classid
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11
echo 11 new_route >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table new_route
ip route add default via *.*.96.1 src *.*.19.90 table new_route

Ein Test mit
Code:
cgexec -g net_cls:new_route links wieistmeineip.de

liefert nun aber leider eine andere IP als *.*.19.90

Wo liegt jetzt mein Fehler?

Der Befehl:
Code:
ip route add default via *.*.96.1 src *.*.19.90
funktioniert und bring dann auch die IP *.*.19.90 als Ergebnis, aber dann natürlich für alle Prozesse.
 

spoensche

Moderator
Teammitglied
Einfacher ist es mit Network Namespaces.

Code:
ip netns add my_php_app
ip link set dev eth1 netns my_php_app
ip netns exec my_php_app ifconfig eth1 *.*.19.90/24 up
ip netns exec my_php_app ifconfig lo 127.0.0.1/8 up
ip netns exec my_php_app route add default via*.*.96.1
ip netns exec my_php_app sudo -u username php myapp.php
 
OP
K

kruppa

Newbie
Leider funktioniert es noch nicht. Ich musste den Code ein wenig anpassen, wegen eth1 und der netmask. Habe nun folgendes und bekomme einen Fehler

Code:
ip netns add my_php_app
ip link set dev eth0 netns my_php_app
ip netns exec my_php_app ifconfig eth0 *.*.19.90 netmask 255.255.255.255 up
ip netns exec my_php_app ifconfig lo 127.0.0.1/8 up
ip netns exec my_php_app ip route add default via *.*.96.1

RTNETLINK answers: Network is unreachable

Woran liegt das? Meine Vermutung ist das bei dem Befehl:
Code:
ip link set dev eth0 netns my_php_app
etwas nicht richtig ist. Ich verliere dann auch sofort die ssh Verbindung.
 

spoensche

Moderator
Teammitglied
Du darfst nicht die IP verwenden über die du dich mit dem Server verbindest. Du musst schon die zweite IP verwenden.
 
OP
K

kruppa

Newbie
An der Stelle hab ich ja noch gar keine IP verwendet nur das Device eth0 und ich habe kein anderes. Nur die virtuellen eth0:0 eth0:1 ...

Aber das ist ja nur ein Problem, das eigentliche war ja der Fehler: RTNETLINK answers: Network is unreachable
 
OP
K

kruppa

Newbie
Ich habe jetzt einen funktionierenden Namespace hinbekommen. Allerdings nur über die IP von eth0. Wie bekomme ich es denn über die IP von eth0:0, eth0:1, usw. hin.

Code:
ip netns del kab

ip netns add kab


ip link add veth0 type veth peer name vpeer0

ip link set vpeer0 netns kab

ip addr add 10.0.0.1/24 dev veth0
ip link set veth0 up

ip netns exec kab ip addr add 10.0.0.2/24 dev vpeer0
ip netns exec kab ip link set vpeer0 up
ip netns exec kab ip link set lo up

ip netns exec kab ip route add default via 10.0.0.1

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o veth0 -j ACCEPT
iptables -A FORWARD -o eth0 -i veth0 -j ACCEPT
 

spoensche

Moderator
Teammitglied
Ist doch gar nicht so schwer. Stat eth0:0 etc. legst du stattdessen veths an, weisst diese dem Namespace zu und gibst ihnen in dem Namespace die IP, die vorher eth0:0 etc. hatte.

Die IP-Tables Regeln fürs Forwarding sind hoffentlich nicht dein Ernst oder? (Scheunentor so weit offen, wie Windows)
 
Oben