Load balancing & NAT-ing beberapa koneksi ISP di Linux

15

Saya memiliki dua koneksi internet dari dua ISP yang berbeda dan saya perlu menyeimbangkan lalu lintas yang berasal dari dan dari jaringan saya antara dua ISP tersebut. Saya menggunakan Debian GNU / Linux.

Pengaturan saya seperti ini -

eth0 (192.168.0.0/24) - Jaringan lokal

eth1 (192.168.1.0/24) - ISP # 1

eth2 (192.168.2.0/24) - ISP # 2

Jaringan lokal saya terhubung ke server ini melalui eth0 dan kotaknya adalah DHCP server sekaligus Gateway untuk semua mesin di LAN.

Server perlu melakukan load-balancing antara dua ISP dan juga perlu melakukan NAT-ing.

Saya telah mengikuti instruksi perutean di lartc.org tetapi saya masih membutuhkan instruksi untuk melakukan NAT-ing dengan benar.

Bantuan apa pun akan dihargai.

PS - Saya tahu tentang pFsense tapi saya harus menggunakan Linux.

Baishampayan Ghose
sumber
2
instruksi apa yang Anda butuhkan? semuanya dijelaskan di lartc.org. Apakah Anda memiliki masalah pada khususnya?
lorenzog

Jawaban:

19

Saya telah melakukan load balancing menggunakan metode lartc.org dan iptables , dan saya menemukan bahwa metode iptables lebih mudah dipahami dan diimplementasikan. Satu-satunya downside adalah bahwa Anda memerlukan versi iptables yang cukup baru untuk dapat menggunakan modul statistik

Mari kita anggap beberapa hal:

LAN: eth0: 192.168.0.1/24

ISP1: eth1: 192.168.1.1/24, gateway: 192.168.1.2/24

ISP2: eth2: 192.168.2.1/24, gateway: 192.168.2.2/24

Jadi, inilah yang akan saya lakukan dengan menggunakan metode iptables:

Tabel rute

Pertama-tama edit / etc / iproute2 / rt_tables untuk menambahkan peta antara nomor tabel rute dan nama ISP

...
10 ISP1
20 ISP2
...

Jadi tabel 10 dan 20 masing-masing untuk ISP1 dan ISP2. Saya perlu mengisi tabel ini dengan rute dari tabel utama dengan potongan kode ini (yang saya ambil dari hxxp: //linux-ip.net/html/adv-multi-internet.html)

ip route show table main | grep -Ev '^default' \
   | while read ROUTE ; do
     ip route add table ISP1 $ROUTE
done

Dan tambahkan gateway default ke ISP1 melalui gateway ISP1 itu:

ip route add default via 192.168.1.2 table ISP1

Lakukan hal yang sama untuk ISP2

Jadi sekarang saya memiliki 2 tabel rute, 1 untuk setiap ISP.

Iptables

OK sekarang saya menggunakan iptables untuk mendistribusikan paket secara merata ke setiap tabel rute. Info lebih lanjut tentang cara kerja ini dapat ditemukan di sini ( http://www.diegolima.org/wordpress/?p=36 ) dan di sini ( http://home.regit.org/?page_id=7 )

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

NAT

Nah NAT itu mudah:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
mefat
sumber
3
Jawaban bagus dengan tautan. Anda tidak perlu iptables baru untuk melakukan ini karena sebelum ada statistik yang cocok ada acak dan kesesuaian yang server peran yang sama.
SiegeX
1
Saya punya pertanyaan tentang tanda pada iptables. Pada tautan yang diposting, mereka menandai hanya paket yang cocok dengan negara baru. Mengapa Anda melakukannya secara berbeda?
Matías
Bisakah saya menggunakan satu jaringan lagi, seperti ISP3, ISP4, dll?
Vitor Mazuco
3

jawaban mefat banyak membantu saya tetapi alih-alih salinan satu dari semua aturan tabel utama ke dalam dua tabel ISP pendekatan yang lebih baik mungkin dengan menggunakan aturan prio untuk menambahkan aturan default setelah tabel utama.

Atur / etc / iproute2 / rt_tables seperti biasa:

...
10 ISP1
20 ISP2
...

Catat itu

ip rule show

Memperlihatkan aturan 0-> lokal, 32766-> utama dan 32767-> default. Lihat man ipuntuk lebih jelasnya.

Yang terpenting, proses perutean akan bekerja dari aturan prio rendah ke prio tinggi ... tetapi 32767 bukan aturan tertinggi #. Jadi jika tabel routing utama tidak memiliki rute default (tetapi mungkin berisi semua jenis rute yang berubah secara dinamis untuk vpns dll) maka jika pertandingan tidak dibuat, itu jatuh ke default (biasanya kosong) dan kemudian mencari aturan prio yang lebih tinggi.

Lihat bagian 'lempar' di sini: http://linux-ip.net/html/routing-tables.html

Jadi sekarang setup

ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2

dan untuk memastikan mereka melihat setelah tabel utama:

ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000

Menggunakan

ip rule show

lagi untuk memverifikasi bahwa aturan ini lebih tinggi daripada utama

Kemudian gunakan CONNMARK mangling seperti yang dikatakan mefat:

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

Hal yang perlu diperhatikan: kebutuhan pppd nodefaultroutejika tidak diatur di utama; ketika perangkat me-restart tabel ISP1 / ISP2 dibersihkan sehingga perlu dikembalikan menggunakan skrip.

Saya menggunakan skrip di /etc/ppp/ip-{up,down}.d/dual-routing

# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1

RULENUM=4
set_balance() {
    iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}

# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2

Ini adalah load-balancing berbasis koneksi jadi saya akan melihat menggunakan load untuk memantau dan mengganti aturan statistik: iptables -t mangle -R PREROUTING <n>dari userspace. Jadi jika ada unduhan yang berjalan lama pada satu koneksi dan koneksi lainnya dimuat dengan ringan, kita harus memilih koneksi yang dimuat dengan ringan.

lbt
sumber