Chuyện của sys

DevOps Blog

[HA] – Sử dụng Anycast, OSPF, Quagga để load balancing cho hệ thống – P2 August 2, 2017

Tiếp tục ở phần 1, sau đây tôi sẽ hướng dẫn chi tiết cài đặt, cũng như cấu hình Anycast, OSPF, và Quagga để load balancing cho hệ thống. Chúng ta cùng xem lại mô hình:

Các máy chủ GW1 và GW2 đều chạy HDH Centos 7.2, dùng nginx làm Reverse proxy để load balancing cho các Web Server ở Backend. Phần cấu hình Reverse proxy và ở dưới Backend, tôi không đề cập trong bài viết này.

  1. Cấu hình địa chỉ IP anycast + allow iptables trên GW1 và GW2
  • Config Anycast IP

Ta gán địa chỉ Anycast IPv4 cho card mạng, địa chỉ anycast có thể trùng subnet hoặc khác subnet với interface khác của server. Anycast thường được cấu hình trên interface loopbacks.
#ifconfig lo:2 172.30.27.219 netmask 255.255.255.255 up
#ifconfig
Cách cấu hình trên sẽ bị mất khi restart lại network, nếu muốn không bị mất, hãy vào /etc/sysconfig/network-script để tạo file cấu hình cho card lo:2.

  • Cấu hình iptables

#iptables -A INPUT -p 89 -j ACCEPT

  • Allow forward ip

#echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
#sysctl -p

  • Tắt Selinux
  1. Compile Quagga + OSPF trên GW1 và GW2
  • Khai báo services

#vi /etc/services

zebrasrv       2600/tcp        # zebra service
zebra           2601/tcp        # zebra vty
ospfd           2604/tcp        # OSPFd vty
ospfapi        2607/tcp        # ospfapi
isisd            2608/tcp        # ISISd vty
pimd           2611/tcp         # PIMd vty
nhrpd         2612/tcp         # nhrpd vty

 

  • Compile quagga

Mặc định nếu dùng yum để install quagga, chúng ta sẽ có quagga version 0.99. Vì để cài đặt version mới nhất, nên tôi compile.
Update và cài đặt các gói cần thiết:
#yum update
#yum groupinstall “Development Tools”
#yum install c-ares-devel.x86_64
#useradd -s /sbin/nologin quagga
#mkdir /usr/local/quagga
#chown -R quagga:quagga /usr/local/quagga
#mkdir /usr/local/quaggaconf
#chown -R quagga:quagga /usr/local/quaggaconf
#chmod 755 -R /usr/local/quagga
#chmod 755 -R /usr/local/quaggaconf/
#chmod 755 -R /usr/local/quaggaconf
#mkdir /var/run/quagga
#chmod -R 755 /var/run/quagga
#chown -R quagga:quagga /var/run/quagga
#mkdir /var/log/quagga
#chmod 755 -R /var/log/quagga
#chown quagga:quagga -R /var/log/quagga
Download source:
#wget http://download.savannah.gnu.org/releases/quagga/quagga-1.2.1.tar.gz
#tar -xvzf quagga-1.2.1.tar.gz
#cd quagga-1.2.1
#./configure –prefix=/usr/local/quagga –sysconfdir=/usr/local/quaggaconf –localstatedir=/var/run/quagga –disable-ripd –disable-ripngd –disable-ospf6d
#make
#make install
Giải thích các giá trị ở trên:
–prefix=/usr/local/quagga: Thư mục cài đặt quagga
–sysconfdir=/usr/local/quaggaconf: Thư mục chứa các file cấu hình của các daemon zebra, ospfd, ripd…
–localstatedir=/var/run/quagga: Thư mục chứa file pid
Cấu hình zebra và ospfd như sau:
Do chỉ sử dụng routing ospf, nên ta chỉ cần cấu hình zebra và ospfd, không quan tâm tới các daemon khác của quagga.
Tại GW1

  • Config Zebra

Khai báo các card mạng trong zebra.conf
#vi //usr/local/quaggaconf/zebra.conf
 

hostname GW1
log file /var/log/quagga/zebra.log
log stdout
log record-priority
!
interface eno16777984
ip address 172.30.27.47/32
!
interface lo
!
interface lo:2
ip address 172.30.27.219/32
!
ip forwarding
!
line vty
!

  • Config ospfd

Ospfd chỉ ra các trường của giao thức ospf. Ospfd cần phải lấy các thông tin trên zebra, vì vậy zebra phải chạy trước khi khởi động ospfd. Ngoài ra, nếu zebra khởi động lại, ospfd cũng phải vậy.
#vi /usr/local/quaggaconf/ospfd.conf

hostname GW1
log file /var/log/quagga/ospfd.log
!
interface eno16777984
ip ospf hello-interval 1
ip ospf dead-interval 5
!
router ospf
ospf router-id 172.30.27.47
redistribute connected
network 172.30.27.0/24 area 172.30.27.0
!

Ở trên là các trường cơ bản để có thể routing ospf, các bạn có thể tìm hiểu thêm về giao thức ospf để cấu hình tuỳ theo nhu cầu của hệ thống, có thể thêm các tham số mã hoá MD5, cấu hình authentication, access-list…
Tạo systemd service file cho zebra và ospfd :
#vim /usr/lib/systemd/system/zebra.service

[Unit]
Description=GNU Zebra routing manager
Wants=network.target
Before=network.target
After=network-pre.target
ConditionPathExists=/usr/local/quaggaconf/zebra.conf

[Service]
PIDFile=/var/run/quagga/zebra.pid
Type=forking
ExecStart=/usr/local/quagga/sbin/zebra -d -A 127.0.0.1 -f /usr/local/quaggaconf/zebra.conf
Restart=on-abort

[Install]
WantedBy=multi-user.target

#vim /usr/lib/systemd/system/ospfd.service

[Unit]
Description=OSPF routing daemon
BindsTo=zebra.service
Wants=network.target
After=zebra.service network-pre.target
Before=network.target
ConditionPathExists=/usr/local/quaggaconf/ospfd.conf

[Service]
Type=forking
PIDFile=/var/run/quagga/ospfd.pid
ExecStart=/usr/local/quagga/sbin/ospfd -d -A 127.0.0.1 -f /usr/local/quaggaconf/ospfd.conf
Restart=on-abort

[Install]
WantedBy=multi-user.target

Start zebra và ospfd
#systemctl daemon-reload
#systemctl enable zebra
#systemctl enable ospfd
#service zebra start
#service ospfd start

Thực hiện tương tự như vậy đối với GW2: 
#vi /usr/local/quaggaconf/zebra.conf

hostname GW2
log file /var/log/quagga/zebra.log
log stdout
log record-priority
!
interface eno16777984
ip address 172.30.27.42/32
!
interface lo
!
interface lo:2
ip address 172.30.27.219/32
!
ip forwarding
!
line vty
!

#vi /usr/local/quaggaconf/ospfd.conf

hostname GW2
log file /var/log/quagga/ospfd.log
!
interface eno16777984
ip ospf hello-interval 1
ip ospf dead-interval 5
!
router ospf
ospf router-id 172.30.27.47
redistribute connected
network 172.30.27.0/24 area 172.30.27.0
!

Tạo file systemd và start zebra, ospfd…

  1. Cấu hình Router

router ospf 1
router-id 172.30.27.10
ip ospf hello-interval 1
ip ospf dead-interval 5
network 172.30.27.0 0.0.0.255 area 172.30.27.0

 
Sau đó vào GW1 và GW2 kiểm tra kết quả:
#/usr/local/quagga/bin/vtysh
#show ip ospf database
#show ip ospf neighbor

Các thông tin về ospf database và ospf neighbor đều hiện trên cả GW1 và GW2
Bây giờ, nếu có request gửi đến địa chỉ 172.30.27.219 hoặc một DNS name nào đó được trỏ tới IP trên, thì Router sẽ dựa trên ospf để tìm Server nào gần nhất, sau đó sẽ forward request đến đó.
Chú ý: Các giá trị hello-interval và dead-interval trên cả GW1, GW2 và Router phải bằng nhau. hello-interval là thời gian Server gửi gói tin hello OSPF cho Router và dead-interval là thời gian cập nhật lại bảng định tuyến của Router. Nếu không thấy bất kì gói hello nào được gửi tới nó trong thời gian dead trên, Router sẽ remove Server đó ra khỏi bảng định tuyên. Ngoài ra, các giá trị mtu của card mạng trên các thiết bị phải bằng nhau.
Nếu không thấy quá trình ospf thành công, có thể xem log file tại /var/log/quagga để biết rõ thêm hoặc comment bên dưới, tôi sẽ hỗ trợ các bạn.
Tôi tạm dừng phần 2 ở đây, trong phần tiếp theo, sẽ hướng dẫn các bạn monitor các daemon của quagga, cũng như control được quá trình quảng bá OSPF của quagga. Nếu các services (nginx…)  ở GW bị lỗi mà quagga vẫn quảng bá ospf lên cho router, request vẫn được đẩy xuống GW thì không hợp lý chút nào đúng không? 😀
 
 

  • tquang says:

    Xin chào, cho mình hỏi, bên mình chỉ có 2 file cấu hình zebra.conf và ripd.conf, cạc loopback cũng không cùng lớp mạng với cạc lan. Vậy có cần cấu hình thêm cái router hay không?

  • tquang says:

    SERVER 01:
    eth0: 172.16.0.2 /24
    lo:1: 192.168.1.2 /24
    lo:2: 192.168.2.3 / 24
    SERVER 02:
    eth0: 172.16.0.3 /24
    lo:1: 192.168.1.2 /24
    lo:2: 192.168.2.3 / 24

    • Tuan Hung says:

      Không cần nhé. Bạn cứ cấu hình như bt, router để khai báo card mạng sẽ quảng bá ospf thôi là được. Có gì post file log và cấu hình lên đây mình sẽ support.

Leave a Reply to tquang Cancel reply

Your email address will not be published. Required fields are marked *