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 ip
untuk 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 nodefaultroute
jika 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.