Bagaimana Anda dapat menetapkan satu IP per pengguna?

11

Saya sedang membangun sebuah gameerver Steam tanpa kepala yang menggunakan Steam in-home streaming untuk memungkinkan dua orang bermain pada saat yang sama. Bagian multiseat dari pengaturan sudah selesai dan fungsional, tetapi membuatnya berfungsi nirkabel cukup merepotkan.

Hanya satu klien Steam yang dapat mengaktifkan streaming di rumah sekaligus. Ini kemungkinan besar karena menggunakan port dan alamat IP yang sama. Bagaimana saya bisa menetapkan alamat IP masing-masing pengguna?

Streaming hanya akan dilakukan dari dalam jaringan rumah. Mesin itu sendiri sudah memiliki 3 IP pada satu antarmuka.

Reanold
sumber

Jawaban:

21

Anda dapat menetapkan konfigurasi jaringan yang berbeda untuk suatu proses menggunakan ruang nama jaringan linux . Secara teori, konfigurasi PAM * mungkin dilakukan untuk menetapkan setiap pengguna di ruang nama jaringannya sendiri yang terpisah, tetapi kemungkinan lebih mudah untuk meluncurkan aplikasi yang bersangkutan di ruang namanya sendiri.

Pengaturan umum mungkin menggambarkan membuat antarmuka jembatan Linux untuk menghubungkan ruang nama ke jaringan. Pengaturan yang sedikit lebih sederhana dapat diarsipkan menggunakan ipvlan (termasuk dalam versi kernel 3.19 dan di atas) atau perangkat macvlan (untuk nirkabel Anda tidak dapat menggunakan macvlan ). Dokumentasi kernel Linux memiliki contoh terperinci untuk mengatur ipvlan di namespace jaringan.

Berikut contoh dalam dokumentasi:

  1. Buat namespace jaringan ns0

    ip netns add ns0
    
  2. Buat ipvlan slave di eth0 (perangkat master)

    ip link add link eth0 ipvl0 type ipvlan mode l2
    
  3. Tetapkan budak ke namespace jaringan ns0

    ip link set dev ipvl0 netns ns0
    
  4. Konfigurasikan perangkat budak di namespace jaringan ns0

    ip netns exec ns0 ip link set dev ipvl0 up
    ip netns exec ns0 ip link set dev lo up
    ip netns exec ns0 ip -4 addr add 127.0.0.1 dev lo
    ip netns exec ns0 ip -4 addr add $IPADDR dev ipvl0
    ip netns exec ns0 ip -4 route add default via $ROUTER dev ipvl0
    

    Berikan alamat host dan router di $IPADDRdan $ROUTER.

  5. Jalankan aplikasi Anda di namespace jaringan menggunakan ip exec

    ip netns exec ns0 <command>
    

    Untuk menjalankan perintah sebagai pengguna yang berbeda, gunakan yang biasa su <user> -c -- <command>.


* EDIT: Dari teori ke praktek: Saya telah menulis modul PAM sederhana untuk menunjukkan bagaimana mengubah namespace jaringan per pengguna. Anda perlu mengkonfigurasi ruang nama jaringan dengan ip netnsseperti di atas dan memetakan pengguna tertentu untuk spesifik ruang nama. Setelah itu semua proses pengguna akan berada dalam namespace yang dikonfigurasikan alih-alih yang default. Kode diinangi di github . Gunakan atas risiko Anda sendiri.

sebasth
sumber
Perintah kedua Anda tidak bekerja untuk saya pada ubuntu 14.04saya hanya mendapatkan: Garbage instead of arguments "mode ...". Try "ip link help".
Sim
1
Saya telah memperbarui jawabannya dengan versi kernel, Ubuntu 14.04 sepertinya tidak menyertakan versi kernel yang cukup baru. Saya tidak bisa memikirkan solusi yang memungkinkan Anda untuk mengkonfigurasi alamat IP terpisah ketika Anda menggunakan nirkabel. Jika Anda menggunakan Ethernet, Anda bisa mengganti ipvlan dengan macvlan di perintah 3 dan ikuti sisa contoh.
sebasth
maksud Anda dalam perintah 2? Variabel $IPADDRdan $ROUTERharus disediakan oleh saya atau sudah ditetapkan?
Sim
1
Memang perintah 2 . Anda harus memberikan konfigurasi jaringan Anda sendiri.
sebasth
2
@Sim, tangkapan bagus, tidak. Mengoreksi jawabannya, namespace perlu ditentukan setelah kata kunci exec seperti di bagian lain dari contoh.
sebasth