Linux sebagai router dengan banyak penyedia internet

16

Linux sebagai router: Saya memiliki 3 penyedia Internet, masing-masing dengan modem sendiri.

Provider1 , yang merupakan alamat gateway 192.168.1.1
Terhubung ke router linux eth1 /192.168.1.2

Provider2 , alamat gateway 192.168.2.1
Terhubung ke router linux eth2 /192.168.2.2

Provider3 , alamat gateway 192.168.3.1
Terhubung ke router linux eth3 /192.168.3.2

                                                                           ________
                                                   +------------+         /
                                                   |            |        |
                            +----------------------+ Provider 1 +--------|
        __                  |192.168.1.2           |192.168.1.1 |       /
    ___/  \_         +------+-------+              +------------+      |
  _/        \__      |    eth1      |              +------------+      /
 /             \ eth0|              |192.168.2.2   |            |      |
|Client network -----+  ROUTER  eth2|--------------+ Provider 2 +------|     Internet
 \10.0.0.0/24 __/    |              |              |192.168.2.1 |      |
   \__     __/       |    eth3      |              +------------+      \
      \___/          +------+-------+              +------------+       |
                            |192.168.3.2           |            |       \
                            +----------------------+ Provider 3 +-------|
                                                   |192.168.3.1 |       |
                                                   +------------+       \________

Saya ingin merutekan klien di jaringan 10.0.0.0/24 dengan IP sumber ke gateway yang berbeda.
Antarmuka ke jaringan klien adalah eth0 /10.0.0.1, yang merupakan gateway default untuk semua klien.

Misalnya:
10.0.0.11 harus dialihkan ke Provider1 @ eth1
10.0.0.12 harus dialihkan ke Provider2 @ eth2
... dan seterusnya ...

Saya pikir saya perlu menggunakan ip routedan iptablesuntuk SNAT, tapi saya belum tahu persis bagaimana caranya.
Ini skrip yang saya miliki sejauh ini.
penerusan ipv4 diaktifkan.

#!/bin/bash
# flush tables
ip route flush table connection1
ip route flush table connection2
ip route flush table connection3

# add the default gateways for each table
ip route add table connection1 default via 192.168.1.1
ip route add table connection2 default via 192.168.2.1
ip route add table connection3 default via 192.168.3.1

# add some IP addresses for marking
iptables -t mangle -A PREROUTING -s 10.0.0.11 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 10.0.0.12 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s 10.0.0.13 -j MARK --set-mark 3

# add the source nat rules for each outgoing interface
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.2
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.2.2
iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 192.168.3.2

# link routing tables to connections (?)
ip rule add fwmark 1 table connection1
ip rule add fwmark 2 table connection2
ip rule add fwmark 3 table connection3

#default route for anything not configured above should be eth2
Flav
sumber
Anda perlu menambahkan CONNMARK, saya pikir, untuk menyimpan / mengembalikan tanda sehingga dapat diterapkan ke paket 2..n (yang akan di-NATED dengan pelacakan koneksi)
derobert
Saya telah menambahkan jawaban dengan kutipan dari konfigurasi yang kami gunakan di sini. Saya akan mencoba untuk check-in selama akhir pekan untuk mengklarifikasi apa pun ...
derobert

Jawaban:

13

Berikut ini adalah pengaturan serupa dari salah satu router kami (dengan beberapa hal yang tidak relevan terpotong). Perhatikan bahwa ini juga menangani koneksi yang masuk .

Catat penggunaan variabel, bukan angka mark yang dikodekan. Jauh lebih mudah untuk dirawat! Mereka disimpan dalam naskah yang terpisah, dan bersumber di. Nama tabel dikonfigurasi di /etc/iproute2/rt_tables. Nama antarmuka diatur /etc/udev/rules.d/70-persistent-net.rules.

##### fwmark ######
iptables -t mangle -F
iptables -t mangle -X

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN # if already set, we're done
iptables -t mangle -A PREROUTING -i wan      -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A PREROUTING -i comcast  -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A PREROUTING -i vz-dsl   -j MARK --set-mark $MARK_VZDSL

iptables -t mangle -A POSTROUTING -o wan     -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A POSTROUTING -o comcast -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A POSTROUTING -o vz-dsl  -j MARK --set-mark $MARK_VZDSL
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

##### NAT ######
iptables -t nat -F
iptables -t nat -X
for local in «list of internal IP/netmask combos»; do
    iptables -t nat -A POSTROUTING -s $local -o wan     -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o comcast -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o vz-dsl  -j SNAT --to-source «IP»
done

# this is an example of what the incoming traffic rules look like
for extip in «list of external IPs»; do
    iptables -t nat -A PREROUTING   -p tcp -d $extip --dport «port» -j DNAT --to-destination «internal-IP»:443
done

Dan aturannya:

ip rule flush
ip rule add from all               pref 1000  lookup main 
ip rule add from A.B.C.D/29        pref 1500  lookup comcast # these IPs are the external ranges (we have multiple IPs on each connection)
ip rule add from E.F.G.H/29        pref 1501  lookup cavtel
ip rule add from I.J.K.L/31        pref 1502  lookup vzdsl
ip rule add from M.N.O.P/31        pref 1502  lookup vzdsl # yes, you can have multiple ranges
ip rule add fwmark $MARK_COMCAST   pref 2000  lookup comcast
ip rule add fwmark $MARK_CAVTEL    pref 2001  lookup cavtel
ip rule add fwmark $MARK_VZDSL     pref 2002  lookup vzdsl
ip rule add                        pref 2500  lookup comcast # the pref order here determines the default—we default to Comcast.
ip rule add                        pref 2501  lookup cavtel
ip rule add                        pref 2502  lookup vzdsl
ip rule add                        pref 32767 lookup default

Tabel perutean diatur /etc/network/interfaces, sehingga menghapus antarmuka membuatnya beralih menggunakan yang lain:

iface comcast inet static
        address A.B.C.Q
        netmask 255.255.255.248
        up ip route add table comcast default via A.B.C.R dev comcast
        down ip route flush table comcast

Catatan: Jika Anda juga melakukan pemfilteran (yang kemungkinan besar adalah Anda), Anda juga perlu menambahkan aturan yang sesuai FORWARDke ACCEPTlalu lintas. Khusus untuk setiap traffic yang masuk.

derobert
sumber
Terima kasih banyak! Saya sekarang akan memodifikasi ini untuk kebutuhan saya, memuatnya di kotak dan memperbarui posting ini.
Flav
Bekerja seperti pesona, terima kasih lagi. Kecuali untuk pre order / rute default ke 'comcast'. (Bagi saya itu seharusnya et2) Tapi saya pikir saya mengatasinya dengan menambahkan aturan umum ip rule add from 10.0.0.0/24 pref 1400 lookup eth2dan membuat pengecualian setelahnya.
Flav
1
@Flav Anda juga dapat mengatur pengecualian Anda dengan tanda firewall (di PREROUTING). BTW: Salah satu pertanyaan terkait ( unix.stackexchange.com/questions/70440/… ) memiliki penjelasan lebih lanjut tentang bagian dari konfigurasi ini. Aturan-aturan ip / mask sebenarnya untuk lalu lintas non-NAT'd di config saya (SNAT terjadi di POSTROUTING, maka setelah hal-hal aturan ip)
derobert