Bagaimana saya bisa menggunakan Linux sebagai Gateway?

16

CATATAN: Jika perangkat klien ( computer Bdalam contoh ini) ingin mendapatkan internet melalui komputer gateway, mungkin mereka masih perlu mengonfigurasi resolusi server nama. Ini tidak dijelaskan di sini (gateway tidak harus melayani internet).

Saya mencoba memahami dasar-dasar perutean jaringan.
Jadi saya bereksperimen dengan LAN saya (saya tidak perlu internet untuk saat ini, hanya komunikasi LAN).

Saya tahu masalah konfigurasi jaringan adalah hal yang agak rumit, tetapi saya hanya mencoba membuat komputer (katakanlah A) untuk bertindak sebagai gateway untuk yang lain (katakanlah B) (keduanya menjalankan Ubuntu Linux).
Saya hanya perlu B untuk dapat mencapai router, yang hanya dapat dijangkau untuk A.

Inilah masalahnya:

Router for computer A  -->  192.168.0.1
Computer A - eth0      -->  192.168.0.2
Computer A - eth1      -->  192.168.1.1

Computer B - eth0      -->  192.168.1.2

Komputer A menghubungkan denda ke router .
Komputer A dan B terhubung dengan baik (ping, SSH ... dll) di antara mereka .
Komputer B tidak dapat mencapai router untuk komputer A.

Saya berpikir bahwa menambahkan B Computer A sebagai gateway default dan mengaktifkan IP Forwarding pada A akan membuat B dapat mencapai router untuk A:

luis@ComputerB:~$ sudo route add default gw 192.168.1.1
luis@ComputerB:~$ sudo routel

target            gateway      source        proto    scope  dev   tbl
127.0.0.0         broadcast    127.0.0.1     kernel   link   lo    local
127.0.0.0 8       local        127.0.0.1     kernel   host   lo    local
127.0.0.1         local        127.0.0.1     kernel   host   lo    local
127.255.255.255   broadcast    127.0.0.1     kernel   link   lo    local
192.168.1.0       broadcast    192.168.1.2   kernel   link   eth0  local
192.168.1.2       local        192.168.1.2   kernel   host   eth0  local
192.168.1.255     broadcast    192.168.1.2   kernel   link   eth0  local
default           192.168.1.1                                eth0
169.254.0.0 16                                        link   eth0
192.168.1.0 24                 192.168.1.2   kernel   link   eth0

Dan di Komputer A (gerbang perantara):

root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward

Komputer B masih dapat melakukan ping ke komputer A, tetapi router untuk A tidak menjawab:

luis@ComputerB:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
^C

(Tidak ada respons ping)

Apakah ini prosedur yang benar untuk membuat komputer yang menjalankan Linux bertindak sebagai gateway untuk komputer lain secara sederhana?

Sopalajo de Arrierez
sumber

Jawaban:

21

Anda hampir sampai di sana. Anda hanya perlu memastikan lalu lintas kembali ke B. Saat ini Anda telah meneruskan lalu lintas dari B ke dunia luar tetapi A tidak tahu cara mendapatkan lalu lintas kembali ke B. Anda perlu A untuk menjaga keadaan tentang koneksi melewatinya. Untuk melakukan ini, Anda ingin mengaktifkan NAT . Anda sudah memiliki langkah pertama yang memungkinkan penerusan. Maka Anda perlu menambahkan beberapa aturan firewall menggunakan iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Ini mengatakan: pada tabel terjemahan alamat jaringan, setelah kami mengetahui perutean paket pada output eth0 (eksternal), ganti informasi alamat pengirim dengan milik kami sehingga paket kembali datang kepada kami. Juga, ingat bahwa kami melakukan ini (seperti tabel pencarian yang mengingat koneksi ini).

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Izinkan paket yang ingin datang dari eth1 (antarmuka internal) untuk keluar eth0 (antarmuka eksternal).

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Gunakan tabel pencarian yang kami miliki sebelumnya untuk melihat apakah paket yang tiba di antarmuka eksternal benar-benar milik koneksi yang sudah dimulai dari internal.

pengguna1794469
sumber
Penjelasan singkat, memang. Haruskah semua blok kode dieksekusi di Komputer A?
Sopalajo de Arrierez
@SopalajodeArrierez Ya ini semua dieksekusi di komputer "gateway". Sistem B tidak perlu tahu apa-apa tentang perutean selain jika ingin mencapai mesin lain, ia mengirim paket ke B (itu default GW).
user1794469
Diuji bekerja pada Ubuntu v14 pada desktop dan Ubuntu v12 pada Utilite Pro (perangkat tertanam dari CompuLabs). Terima kasih banyak telah memperluas apa yang dilakukan setiap baris. Saya telah meneliti dan menemukan banyak sekali penjelasan yang tidak bekerja. Saya harap utas Pertanyaan-Jawaban ini dapat bermanfaat bagi orang lain di masa depan.
Sopalajo de Arrierez
@ user1794469 apakah sama ketika antarmuka gateway adalah virtual, yaitu antarmuka tap? dapatkah kamu melihat-lihat di sini ?
ram
1

Agar perutean berfungsi dengan benar antara dua komputer Linux yang bertindak sebagai gateway, ada beberapa hal yang perlu dilakukan:

  • Kedua gateway harus memiliki tautan fisik satu sama lain (atau virtual jika Anda menghubungkan mesin virtual).
  • Rute harus ditambahkan ke kedua antarmuka pada router.

    route add -net 192.168.0.0/24 gw 192.168.0.1
    route add -net 192.168.1.0/24 gw 192.168.1.1
    
  • Gateway lokal harus ditentukan untuk jaringan jarak jauh di kedua gateway. Ini memungkinkan komputer di jaringan lokal untuk mengetahui ke mana harus mengirim paket untuk jaringan jarak jauh. Gateway harus menjadi alamat IP komputer yang akan mengirim paket ke jaringan jarak jauh.

  • Komputer yang ingin mengirim lalu lintas antar jaringan juga harus mengetahui gerbang lokal yang menangani lalu lintas ke dan dari jaringan jarak jauh. Ini biasanya dilakukan melalui Dynamic Host Control Protocol (DHCP), namun jika Anda berniat menggunakan gateway terpisah untuk internet, Anda perlu menentukan keduanya pada komputer yang membutuhkan akses ke Internet dan jaringan lain (mis. Gateway Internet via DHCP dan gateway jaringan lain melalui rute).
  • Penerusan IP harus aktif untuk kedua gateway.
  • IP Masquerading harus diaktifkan untuk memungkinkan NAT berfungsi di antara gateway.

    modprobe iptable_nat
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT
    

    Anda mungkin perlu menentukan sumber dan tujuan karena Anda menggunakan antarmuka yang sama untuk menyamar:

    iptables -t nat -A POSTROUTING -i eth0 -s 192.168.0.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
    

    dan gateway lainnya:

    iptables -t nat -A POSTROUTING -i eth1 -s 192.168.1.0/24 ! -d 192.168.0.0/24 -j MASQUERADE   
    

    Untuk setiap gateway, lalu lintas jaringan lokal harus diterima pada antarmuka yang sesuai seperti ini:

    iptables -A FORWARD -i eth0 -s 192.168.0.0/24 -j ACCEPT
    

    atau

    iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
    

Ada banyak tautan dan sejenisnya pertanyaan dapat dijadikan rujukan untuk menyelesaikan masalah yang Anda hadapi.

Apa yang tampaknya salah dalam kasus khusus ini adalah bahwa pengaturan rute dan gateway tidak selesai pada kedua komputer dan Terjemahan Alamat Jaringan (NAT) belum diaktifkan menggunakan iptables, memungkinkan gateway untuk membawa permintaan dari komputer di subnet lain atas nama mereka.

Melakukan hal ini juga penting ketika mengatur koneksi internet karena Anda bertanggung jawab untuk salah satu ujung koneksi (mis. Menggunakan komputer Linux sebagai gateway untuk koneksi PPPoE).

John Pettit
sumber