Cân bằng tải & NAT-ing nhiều kết nối ISP trên Linux


15

Tôi có hai kết nối internet từ hai ISP khác nhau và tôi cần cân bằng lưu lượng truy cập bắt nguồn từ và từ mạng của mình giữa hai ISP. Tôi đang sử dụng Debian GNU / Linux.

Thiết lập của tôi là như thế này -

eth0 (192.168.0.0/24) - Mạng cục bộ

eth1 (192.168.1.0/24) - ISP # 1

eth2 (192.168.2.0/24) - ISP # 2

Mạng cục bộ của tôi được kết nối với máy chủ này thông qua eth0 và hộp là máy chủ DHCP kiêm Cổng cho tất cả các máy trong mạng LAN.

Máy chủ cần thực hiện cân bằng tải giữa hai ISP và cũng cần thực hiện NAT.

Tôi đã làm theo các hướng dẫn định tuyến trên lartc.org nhưng tôi vẫn cần hướng dẫn để thực hiện NAT đúng cách.

Bất kỳ trợ giúp sẽ được đánh giá cao.

PS - Tôi biết về pFsense nhưng tôi cần sử dụng Linux.


2
bạn cần loại hướng dẫn nào? tất cả mọi thứ được giải thích trên lartc.org. Bạn có bất kỳ vấn đề cụ thể?
lorenzog

Câu trả lời:


19

Tôi đã thực hiện cân bằng tải bằng cả hai phương thức lartc.org và iptables và tôi thấy rằng phương pháp iptables dễ hiểu và dễ thực hiện hơn. Nhược điểm duy nhất là bạn cần một phiên bản iptables khá gần đây để có thể sử dụng mô-đun thống kê

Hãy giả sử một vài điều:

LAN: eth0: 192.168.0.1/24

ISP1: eth1: 192.168.1.1/24, cổng: 192.168.1.2/24

ISP2: eth2: 192.168.2.1/24, cổng: 192.168.2.2/24

Vì vậy, đây là cách tôi sẽ làm bằng cách sử dụng phương pháp iptables:

Bảng lộ trình

Đầu tiên chỉnh sửa / etc / iproute2 / rt_tables để thêm bản đồ giữa số bảng tuyến và tên ISP

...
10 ISP1
20 ISP2
...

Vì vậy, bảng 10 và 20 lần lượt dành cho ISP1 và ISP2. Tôi cần điền vào các bảng này các tuyến đường từ bảng chính với đoạn mã này (mà tôi đã lấy từ hxxp: //linux-ip.net/html/adv-multi-iNET.html)

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

Và thêm cổng mặc định vào ISP1 thông qua cổng của ISP1 đó:

ip route add default via 192.168.1.2 table ISP1

Làm tương tự cho ISP2

Vì vậy, bây giờ tôi có 2 bảng lộ trình, 1 cho mỗi ISP.

Iptables

Bây giờ tôi sử dụng iptables để phân phối đều các gói cho mỗi bảng tuyến. Thông tin thêm về cách thức hoạt động của công việc này có thể được tìm thấy ở đây ( http://www.diegolima.org/wordpress/?p=36 ) và tại đây ( 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

Vâng NAT rất dễ:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

3
Câu trả lời tốt với các liên kết. Bạn không nhất thiết cần một iptables mới để làm điều này như trước khi có thống kê khớp với các trận đấu ngẫu nhiênthứ n mà máy chủ có cùng vai trò.
Cuộc bao vây

1
Tôi có một câu hỏi liên quan đến các dấu hiệu trên iptables. Trên liên kết được đăng, họ chỉ đánh dấu các gói phù hợp với trạng thái mới. Tại sao bạn làm nó khác nhau?
Matías

Tôi có thể sử dụng thêm một mạng, như ISP3, ISP4, v.v. không?
Vitor Mazuco 7/12/2015

3

Câu trả lời của mefat đã giúp tôi rất nhiều nhưng thay vì một bản sao của tất cả các quy tắc bảng chính vào hai bảng ISP, cách tiếp cận tốt hơn có thể là sử dụng nguyên tắc quy tắc để thêm quy tắc mặc định sau bảng chính.

Thiết lập / etc / iproute2 / rt_tables như bình thường:

...
10 ISP1
20 ISP2
...

Lưu ý rằng

ip rule show

Hiển thị quy tắc 0-> cục bộ, 32766-> chính và 32767-> mặc định. Xem man ipđể biết thêm chi tiết.

Điều quan trọng là quá trình định tuyến sẽ hoạt động từ quy tắc ưu tiên thấp đến quy tắc cao cấp ... nhưng 32767 không phải là quy tắc cao nhất #. Vì vậy, nếu bảng định tuyến chính không có tuyến mặc định (nhưng có thể chứa tất cả các loại tuyến thay đổi động cho vpns, v.v.) thì nếu một trận đấu không được thực hiện, nó sẽ rơi vào mặc định (thường trống) và sau đó tìm quy tắc cao hơn.

Xem phần 'ném' tại đây: http://linux-ip.net/html/routing-tables.html

Vì vậy, bây giờ thiết lập

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

và để chắc chắn rằng họ đã nhìn vào bảng chính:

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

Sử dụng

ip rule show

một lần nữa để xác minh rằng các quy tắc này là cao hơn so với chính

Sau đó, sử dụng CONNORE xáo trộn như mefat nói:

# 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

Những điều cần lưu ý: pppd cần nodefaultroutenếu không nó sẽ thiết lập chính; khi một thiết bị khởi động lại, các bảng ISP1 / ISP2 được làm sạch, do đó cần phải khôi phục bằng tập lệnh.

Tôi sử dụng tập lệnh trong /etc/ppp/ip- nbup,down Bolog.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

Đây là cân bằng tải dựa trên kết nối, vì vậy tôi sẽ xem xét sử dụng tải để theo dõi và thay thế quy tắc thống kê: iptables -t mangle -R PREROUTING <n>từ không gian người dùng. Vì vậy, nếu có tải xuống lâu dài trên một kết nối và kết nối khác được tải nhẹ, chúng ta nên ưu tiên kết nối được tải nhẹ.

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.