1. Hệ điều hành Linux
2.2.12. Tunneling ,mobile IP và virtual private networks
Linux kernel cho phép sự đóng gói của các giao thức. Điều này có nghĩa là bạn có thể làm đường hầm IPX xuyên qua IP ,cho phép 1 kết nối của 2 mạng IPX đi xuyên qua 1 đường liên kết mà ở đó chỉ dùng mỗi giao thức IP .Nó cũng có thể thực thi đóng gói IP-IP ,thực sự cần thiết cho việc hỗ trợ mobile IP,multicast, và amateur radio
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router Chương 4 CÁC ỨNG DỤNG TÍCH HỢP VÀO HỆ THỐNG 1. Giới thiệu các ứng dụng 1.1. Zebra
Zebra là 1 routing daemon.Nó có thể hỗ trợ rất nhiều giao thức định tuyến chẳng hạn như RIPv1,RIPv2,OSPF,BGP…
Zebra là chương trình hoàn toàn miễn phí và rất thông dụng trên môi trường Linux
Cấu hình và sử dụng rất đơn giản ( gần giống router thật )
1.2. Tính năng Dynamic DNS : noip-duc-linux.tar
1.2.1. Giới thiệu
www.no-ip.com là trang web cung cấp nhiều giải pháp về IP và tên miền. No-ip FREE là một trong số các dịch vụ được cung cấp miễn phí cho phép người dùng không có IP cố định được nhận biết trên môi trường Internet.
Dùng tính năng Dynamic DNS Update Client được cung cấp bởi dịch vụ DDNS Server từ trang web : www.no-ip.com
Từ trang web www.no-ip.com, tạo một Account để sử dụng dịch vụ. Sau đó cài gói Dynamic DNS Update Client lên máy tính
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
Linux dùng làm Router ADSL, khai báo tài khoản cho chương trình và sử dụng.
Gói Dynamic DNS Update Client được download tại địa chỉ : www.no-ip.com/download
Qui trình xử lý
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
DNS tại www.no-ip.com với tên miền là www.routerlinux.no- ip.com
Tại thời điểm 1, Server B được dịch vụ cấp phát địa chỉ động của ISP cấp cho địa chỉ 203.162.57.111 và được ánh xạ đến tên miền đã đăng kí.
Tại thời điểm 2, Server B được cấp phát địa chỉ khác: 203.162.57.112 và được chương trình dynamic dns client thực hiện cập nhật tới Server của no-ip. Lúc này tên miền của Server B sẽ được ánh xạ tới địa chỉ mới
Client A sẽ truy vấn tên miền của Server B và được trả lại địa chỉ IP của Server B, từ đó kết nối tới Server B.
1.3. FAIR NAT
1.3.1 Giới thiệu
Đây là chương trình dành cho Linux Router.Nó cho phép thực hiện những việc tương tự như chia sẻ bandwidth ngang bằng giữa các client trong mạng nội bộ.
1.3.2 Kiến trúc Fair Nat
HTB class (for bandwidth sharing) |
\-- PRIO (for prioritizing interactive traffic) |
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
\--- Normal: SFQ \--- High-Traffic: SFQ
[ \--- P2P: SFQ (if IPP2P support is enabled only) ]
Để có thể hiểu rõ về FAIR NAT ,chúng ta cần nắm một số khái niệm sau :
1.3.1.1. Sơ lược về các loại hàng đợi không phân lớp
FIFO,First-In First-Out(pfifo và bfifo) :Thuật toán của FIFO thể hiện nến tảng cho loại hàng đợi mặc định trong Linux (pfifo_fast) .FIFO không thực thi bất cứ sự điều chỉnh hay tái sắp xếp packet nào cả.Nó chỉ đơn giản truyền các packet ngay sau khi nhận và định hàng đợi cho packet.
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
Hình 4.2 Chiến lược FIFO
Một quy tắc hàng đợi FIFO có một kích thước hữu hạn ( kích cỡ vùng đệm ) để ngăn ngừa sự quá tải trong trường hợp nó không thể giải phóng các packet ra khỏi hàng đợi nhanh như là nó nhận vào .Linux thực thi 2 lại fifo ,một hoạt động dựa trên byte ( bfifo )và một còn lại dựa trên packet ( pfifo ) .Dù vậy,các loại hàng đợi FIFO đều định nghĩa kích cỡ thông qua tham số limit .Trong đó,đơn vị của bfifo là byte còn đơn vị của pfifo là packet.
Example 6. Specifying a limit for a packet or byte FIFO
[root@leander]# cat bfifo.tcc
/*
* make a FIFO on eth0 with 10kbyte queue size * */ dev eth0 { egress { fifo (limit 10kB); } } [root@leander]#tcc < bfifo.tcc # ====================Device eth0 =============== tc qdisc add dev eth0 handle 1:0 root dsmark indices 1 default_index 0
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
[root@leander]# cat pfifo.tcc
/*
* make a FIFO on eth0 with 30 packet queue size * */ dev eth0 { egress { fifo (limit 30p ); } } [root@leander]# tcc < pfifo.tcc # =====================Device eth0 ==================
tc qdisc add dev eth0 handle 1:0 root dsmark indices 1 default_index 0
tc qdisc add dev eth0 handle 2:0 parent 1:0 pfifo limit 30
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
Hình 4.3 Qui tắc hàng đợi Linux
Pfifo_fast là quy tắc hàng đợi mặc định cho tất cả các interfaces trong Linux .Dựa trên một quy ước của hàng đợi FIFO,quy tắc hàng đợi này đề xuất một vài sự ưu tiên .Nó cung cấp một vài dải băng tần khác nhau ( các FIFO riêng biệt ) để chia lưu lượng .Vì thế ,band 1 thì luôn được làm rỗng để chờ packet trước khi band 2 được giải phóng khỏi hàng đợi
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
Hình 4.4 Chiến lược Round Robin
Example 7. Creating an SFQ
[root@leander]# cat sfq.tcc
/*
* make an SFQ on eth0 with a 10 second perturbation *
*/
dev eth0 { egress {
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router sfq( perturb 10s ); } } [root@leander]# tcc < sfq.tcc # ================== Device eth0 ===================
tc qdisc add dev eth0 handle 1:0 root dsmark indices 1 default_index 0
tc qdisc add dev eth0 handle 2:0 parent 1:0 sfq perturb 10
Là 1 trong các thuật toán fair queue .SFQ không chính xác bằng các thuật toán khác .Nhưng nó có ưu điểm là cần ít sự tính toán trong khi vẫn hoạt động tốt
Cốt lõi của SFQ là việc chia các luồng TCP session hoặc UDP stream ra thành một số lớn các hàng đợi FIFO ( như chúng ta thấy trong hình trên ) ,1 cho mỗi luồng .Sau đó ,traffic được lưu thông theo cơ cấu round robin,tạo cơ hội cho mỗi session gửi dữ liệu mỗi khi đến lượt
Điều này rõ ien là rất công bằng ,đảm bảo rằng không có luồng nào bị ngắt .Nó hoàn toàn không phân phát cho mỗi session 1 hàng đợi nào cả .Thay vào đó, nó dùng 1 thuật toán để chia traffic vào trong một số các hàng đợi hữu hạn bằng cách sử dụng thuật toán băm
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
1.4. Perturb
Thời gian để tái cấu hình hashing.Nếu thông số này không được thiết lập thì bảng băm sẽ không được tái cấu hình.10s là giá trị tốt nhất
1.5. Quantum
Số lượng byte của một luồng (stream) được cho phép giải phóng khỏi hàng đợi trước khi đến lượt một hàng đợi khác.Mặc định là 1 ( bằng giá trị MTU ).Không được thiết lập nhỏ hơn MTU
Ví dụ cấu hình
# tc qdisc add dev ppp0 root sfq perturb 10 # tc −s −d qdisc ls
qdisc sfq 800c: dev ppp0 quantum 1514b limit 128p flows 128/1024 perturb 10sec
Sent 4812 bytes 62 pkts (dropped 0, overlimits 0)
800c: là một số handle được đăng kí tự động,limit 128 ở đây nghĩa là 128 packet có thể đợi trong hàng đợi này.
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
Hình 4.5 Hàng đợi Token Bucket Filter
Đây là loại hàng đợi được xây dựng dựa trên các thẻ bài (token) và thùng chứa ( bucket ).Đơn giản, nó chỉ điều tiết lưu lượng được chuyển trong 1 interface.TBF là giải pháp rất tốt để giới hạn tốc độ các packet được đưa ra khỏi hàng đợi tại một interface cụ thể .Nó đơn giản là làm giảm lưu lượng chuyển tại một tốc độ xác định
Packet chỉ được chuyển đi nếu có đủ các thẻ bài có giá trị.Bằng không,nó sẽ bị hoãn lại.Sự làm trể packet theo cách này sẽ phát sinh một độ trễ giả vào trong vòng di chuyển của packet
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
Example 9. Creating a 256kbit/s TBF
[root@leander]# cat tbf.tcc
/*
* make a 256kbit/s TBF on eth0 *
*/
dev eth0 {
egress {
tbf( rate 256 kbps, burst 20 kB, limit 20 kB, mtu 1514 B ); } } [root@leander]# tcc < tbf.tcc # ==================== Device eth0 =================
tc qdisc add dev eth0 handle 1:0 root dsmark indices 1 default_index 0 tc qdisc add dev eth0 handle 2:0 parent 1:0 tbf burst 20480 limit 20480 mtu 1514 rate 32000bps
1.5.1.1. Hàng đợi phân lớp
Linux HTB( Hierrachical Token Bucket)
Đây là một cấu trúc hàng đợi mới trong linux .Ưu điểm của nó là có thể hạn chế được lưu lượng của các loại traffic .Thêm vào đó,nó còn có khả năng thiết lập các loại dữ liệu lưu thông bên dưới các loại khác tạo nên một loại lưu thông có cấu trúc
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
HTB sử dụng khái niệm về thẻ bài (token) và thùng chứa (bucket )
1 phần cơ bản trong HTB qdisc ( classful queuing discipline – quy tắc hàng đợi phân lớp ) là kỹ thuật vay mượn .Vay mượn ở đây có nghĩa là lớp con sẽ mượn các thẻ bài từ lớp cha của chúng khi chúng có tốc độ vượt quá mức cho phép .Lớp con sẽ luôn cố gắng thử mượn các thẻ bài cho đến khi chúng đạt đến giới hạn tối đa .Lúc đó,nó sẽ bắt đầu tạo hàng đợi packet để chuyển đi cho đến khi nhiều thẻ bài có giá trị.Bởi vì ở đây chỉ có 2 lớp có thể được tạo với HTB .Bảng và sơ đồ sau sẽ xác định các trạng thái có thể có và cách hoạt động của kỹ thuật vay mượn
Lớp Trạng thái lớp
Trạng thái bên trong của HTB
Hành động phát sinh
Leaf < rate
HTB_CAN_SEND Các lớp lá sẽ giải phóng các byte nằm trong hàng đợi đến các thẻ bài có giá trị ( không nhiều hơn burst packet)
Leaf
>rate
<ceil HTB_MAY_BORROW
Lớp lá sẽ cố gắng mượn tokens/ctokens từ lớp cha .Nếu tokens tồn tại ,chúng sẽ được mượn lúc quantum tăng lên và lớp lá sẽ giải hàng đợi tùy theo số byte cburst
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
đợi .Điều này sẽ làm packet bị trễ và làm tăng độ trễ để đạt được tốc độ mong muốn
Inner, root
< rate HTB_CAN_SEND
Lớp inner sẽ mượn token cho lớp con
Inner, Root
>rate
<ceil
HTB_MAY_BORROW
Lớp inner sẽ cố gắng mượn tokens/ctokens từ lớp cha
Inner, Root
>ceil
HTB_CANT_SEND Lớp inner không mượn token từ lớp cha và cũng chẳng trả token/ctoken cho lớp con
Bảng 4.1 Các thông số của lớp HTB
Sơ đồ miêu tả quá trình mượn các thẻ bài và cách mà theo đó các thẻ bài được trao đổi với lớp cha .Để mô hình vay mượn hoạt động ,mỗi lớp phải có một số lượng cụ thể các thẻ bài được dùng cho bản thân nó và các lớp con của nó .
Bất kì lớp con nào muốn vay mượn thẻ bài sẽ gửi yêu cầu đến lớp cha của nó
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
Hình 4.6 Lớp HTB Các tham số trong lớp HTB
Default : Là tham số tùy chọn cho mỗi đối tượng HTB qdisc ( qdisc là những quy tắc hàng đơi ví dụ : FIFO là loại hàng đợi có quy tắc vào trước ,ra trước ).Mặc định của default là 0
Rate : Dùng để thiết lập tốc độ tối thiểu để giới hạn lưu lượng trao đổi .Điều này tương đương với một tốc độ thông tin đã xác định ( CIR-committed information rate ) hoặc để đảm bảo băng thông cho một lớp lá (leaf) cho
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
trước.(tốc độ sàn ?)
Ceil : Được dùng để thiết lập tốc độ tối đa mà mình mong muốn để giới hạn lưu lượng trao đổi .Mô hình vay mượn sẽ mô tả làm thế nào để sử dụng tham số này.Có thể xem cái này giống với băng thông tối đa ( tốc độ trần ?)
Burst : Đây là kích cỡ của thùng chứa rate.HTB sẽ giải phóng một số lượng burst bytes trước khi chờ nhiều thẻ bài hơn đến
Cburst:Đây là kích cỡ của thùng chứa ceil . HTB sẽ giải phóng một số lượng cburst bytes trước khi chờ nhiều thẻ bài hơn đến
Quantum: đây là tham số chính được dùng bởi HTB để điều khiển sự vay mượn .Thường thì, quantum được tính toán bởi HTB ,chứ không phải được chỉ định bởi người dùng.Sự chỉnh sửa tham số này có thể sẽ dẫn đến những hậu quả ghê gớm làm mất cân bằng giữa sự vay mượn và sự điều chỉnh
R2q : được tính bởi user .Đây là một nhân tố giúp HTB xác định quantum tối ưu cho từng lớp cụ thể
Mtu ( maximum transfer unit ) :
PRIO ,priority scheduler
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
đây ,mỗi band là một lợp riêng biệt chứ không chỉ đơn thuần là một FIFO
Khi một packet được đưa vào trong hàng đợi PRIO,một lớp được chọn dựa vào câu lệnh filter mà bạn đã áp.Theo mặc định ,3 lớp được tạo ra.Lúc này ,chúng chỉ là những hàng đợi hoàn toàn FIFO và không có cấu trúc bên trong ,nhưng bạn có thể thay thế chúng bằng bất kì loại hàng đợi nào mà bạn có thể sử dụng được
Khi một packet cần được giải phóng khỏi hàng đợi, class:1 được ưu tiên trước.Các lớp cao hơn chỉ dùng nếu các band thấp hơn hoàn toàn không giải phóng packet
Loại hàng đợi này rất hữu dụng nếu như bạn muốn định mức độ ưu tiên cho từng loại traffic xác định mà không chỉ dùng cờ TOS mà dùng tất cả sức mạnh của tc filter.
Tham số và ý nghĩa các tham số 1.6. Bands
Số lượng các band được tạo ra .Mỗi band thật sự là một lớp 1.7. Priomap
Nếu bạn không cung cấp tc filter (không cấu hình ) để phân loại traffic thì PRIO sẽ dựa vào TC_PRIO priority để xác định làm thế nào để đưa traffic vào hàng đợi
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router Chúng ta tạo một cây root 1: prio / | \ 1:1 1:2 1:3 10: 20: 30: sfq tbf sfq band 0 1 2
Phần lớn traffic sẽ đi đến 30: , các traffic tương tác đến 20: hoặc 10: Các câu lệnh dùng để cấu hình
# tc qdisc add dev eth0 root handle 1: prio # This *instantly* creates classes 1:1, 1:2, 1:3 # tc qdisc add dev eth0 parent 1:1 handle 10: sfq
# tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000
# tc qdisc add dev eth0 parent 1:3 handle 30: sfq
Bây giờ ,kiểm tra xem các cấu hình của chúng ta vừa thiết lập ở trên bằng câu lệnh
# tc −s qdisc ls dev eth0
Và dưới đây là kết quả
qdisc sfq 30: quantum 1514b
Sent 0 bytes 0 pkts (dropped 0, overlimits 0) qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
qdisc sfq 10: quantum 1514b
Sent 132 bytes 2 pkts (dropped 0, overlimits 0)
qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 174 bytes 3 pkts (dropped 0, overlimits 0)
Như chúng ta thấy ,band 0 có vài traffic và một packet đã được gửi
Bây giờ chúng ta thực thi một số lượng lớn dữ liệu chuyển đi với 1 công cụ thiết lập đúng các cờ TOS
# scp tc ahu@10.0.0.11:./ ahu@10.0.0.11's p’ssword:
tc 100% |*****************************| 353 KB 00:00 # tc −s qdisc ls dev eth0
qdisc sfq 30: quantum 1514b
Sent 384228 bytes 274 pkts (dropped 0, overlimits 0) qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms Sent 2640 bytes 20 pkts (dropped 0, overlimits 0) qdisc sfq 10: quantum 1514b
Sent 2230 bytes 31 pkts (dropped 0, overlimits 0)
qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 389140 bytes 326 pkts (dropped 0, overlimits 0)
Xây dựng thử nghiệm PC Linux hoạt động như một ADSL Router
trong các band,đúng như dự định.Bây giờ ,để xác định các interactive traffic đi đến các band cao hơn, chúng ta tạo ra môt vài interactive traffic
# tc −s qdisc ls dev eth0 qdisc sfq 30: quantum 1514b
Sent 384228 bytes 274 pkts (dropped 0, overlimits 0) qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms Sent 2640 bytes 20 pkts (dropped 0, overlimits 0) qdisc sfq 10: quantum 1514b
Sent 14926 bytes 193 pkts (dropped 0, overlimits 0)
qdisc prio 1: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 401836 bytes 488 pkts (dropped 0, overlimits 0)