Linux là bộ định tuyến với nhiều nhà cung cấp internet


16

Linux là bộ định tuyến: Tôi có 3 nhà cung cấp Internet, mỗi nhà cung cấp có modem riêng.

Nhà cung cấp1 , là địa chỉ cổng 192.168.1.1 Đã
kết nối với bộ định tuyến linux eth1 /192.168.1.2

Nhà cung cấp2 , địa chỉ cổng 192.168.2.1 Đã
kết nối với bộ định tuyến linux eth2 /192.168.2.2

Nhà cung cấp3 , địa chỉ cổng 192.168.3.1 Đã
kết nối với bộ định tuyến 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 |       |
                                                   +------------+       \________

Tôi muốn định tuyến các máy khách trong mạng 10.0.0.0/24 bằng IP nguồn tới các cổng khác nhau.
Giao diện cho mạng máy khách là eth0 /10.0.0.1, là cổng mặc định cho tất cả các máy khách.

Ví dụ:
10.0.0.11 nên được định tuyến đến Nhà cung cấp1 @ eth1
10.0.0.12 nên được định tuyến đến Nhà cung cấp2 @ eth2
... và cứ thế ...

Tôi nghĩ rằng tôi cần phải sử dụng ip routeiptablescho SNAT, nhưng tôi chưa tìm ra chính xác làm thế nào.
Đây là kịch bản tôi có cho đến nay.
chuyển tiếp ipv4 được kích hoạt.

#!/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

Bạn cần phải thêm vào CONN chánh, tôi nghĩ, để lưu / khôi phục nhãn hiệu để có thể áp dụng nó cho các gói 2..n (sẽ được NAT bằng cách theo dõi kết nối)
derobert

Tôi đã thêm một câu trả lời với các trích đoạn từ cấu hình chúng tôi sử dụng ở đây. Tôi sẽ cố gắng đăng ký vào cuối tuần để làm rõ bất cứ điều gì ...
derobert

Câu trả lời:


13

Đây là một thiết lập tương tự từ một trong các bộ định tuyến của chúng tôi (với một số nội dung không liên quan được cắt). Lưu ý rằng điều này cũng xử lý các kết nối đến .

Lưu ý việc sử dụng các biến thay vì số đánh dấu được mã hóa cứng. Vì vậy, dễ dàng hơn nhiều để duy trì! Chúng được lưu trữ trong một tập lệnh riêng biệt và có nguồn gốc. Tên bảng được cấu hình trong /etc/iproute2/rt_tables. Tên giao diện được đặt trong /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

Và các quy tắc:

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

Các bảng định tuyến được thiết lập /etc/network/interfaces, do đó việc gỡ xuống một giao diện làm cho nó chuyển sang sử dụng một bảng khác:

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

Lưu ý: Nếu bạn cũng đang lọc (có thể là bạn), bạn cũng sẽ cần thêm các quy tắc phù hợp FORWARDvào ACCEPTlưu lượng. Đặc biệt là đối với bất kỳ lưu lượng truy cập đến.


Cảm ơn rât nhiều! Bây giờ tôi sẽ sửa đổi điều này theo nhu cầu của mình, tải nó vào hộp và cập nhật bài viết này.
Flav

Hoạt động như một lá bùa, cảm ơn một lần nữa. Ngoại trừ thứ tự trước / tuyến mặc định thành 'comcast'. (Đối với tôi đó phải là eth2) Nhưng tôi nghĩ rằng tôi đã làm việc xung quanh nó bằng cách thêm một quy tắc chung ip rule add from 10.0.0.0/24 pref 1400 lookup eth2và tạo ra các ngoại lệ sau đó.
Flav

1
@Flav bạn cũng có thể đặt ngoại lệ của mình bằng các dấu tường lửa (trong PREROUTING). BTW: Một trong những câu hỏi được liên kết ( unix.stackexchange.com/questions/70440/ mẹo ) có thêm lời giải thích về một phần của cấu hình này. Các quy tắc ip / mặt nạ đó thực sự dành cho lưu lượng truy cập không phải NAT trong cấu hình của tôi (SNAT xảy ra trong POSTROUTING, do đó sau công cụ quy tắc ip)
derobert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.