ỨNG DỤNG FIREWALL VÀO SDN1.1 Giới thiệu chungTường lửa Firewall là một hệ thống security, có thể dựa trên phần cứng hoặc phầnmềm, sử dụng các quy tắc để kiểm soát traffic vào, ra khỏi hệ
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
-□□&□□ -BÁO CÁO CÁ NHÂN
MẠNG THÔNG TIN
Đề tài: Mạng định nghĩa bằng phần mềm - SDN
Giảng viên hướng dẫn: Thầy Nguyễn Tiến Dũng
Nhóm sinh viên thực hiện: Nhóm 7
Trang 2Hà Nội, 12-2021
Trang 3MỤC LỤC
DANH MỤC HÌNH VẼ i
DANH MỤC BẢNG BIỂU ii
CHƯƠNG 1 ỨNG DỤNG FIREWALL VÀO SDN 3
1.1 Giới thiệu chung 3
1.2 Xây dựng Topology mạng 3
CHƯƠNG 2 ĐỊNH NGHĨA POLICY CHO FIREWALL 5
2.1 Định nghĩa bằng command 5
2.2 Định nghĩa thông qua Ryu 5
2.2.1 Chặn toàn bộ traffic từ host 1 đến host 3 5
2.2.2 Chỉ chặn truy cập TCP đến cổng 80 trên host 1 8
CHƯƠNG 3 KẾT QUẢ MÔ PHỎNG 9
3.1 Chặn toàn bộ traffic từ host 1 đến host 3 9
3.2 Chỉ chặn truy cập TCP đến cổng 80 trên host 1 11
KẾT LUẬN 14
3.3 Những kết quả làm được: 14
3.4 Định hướng tương lại: 14
TÀI LIỆU THAM KHẢO 15
Trang 4DANH MỤC HÌNH VẼ
Hình 1.1 Topology mạng 3 switch và 3 host 3
Hình 1.2 Khởi chạy mạng topology băng mininet 4
Hình 3.1 Khởi chạy Ryu với rule chặn toàn bộ traffic từ host 1 đến host 3 9
Hình 3.2 Kiểm tra kết nối các host thông qua mininet 9
Hình 3.3 Flow Table của switch s1 10
Hình 3.4 Flow Table của switch s3 10
Hình 3.5 Kiểm tra kết nối các host thông qua mininet 11
Hình 3.6 Kiểm tra traffic trên port 80 12
Hình 3.7 Kiểm tra traffic trên port 75 12
Hình 3.8 Flow Table của switch s1 13
Trang 5DANH MỤC BẢNG BIỂU
Bảng 2.1 Toàn bộ field của OFPMatch 7 Bảng 2.2 ID protocol của IP 8
Trang 6CHƯƠNG 1 ỨNG DỤNG FIREWALL VÀO SDN
1.1 Giới thiệu chung
Tường lửa (Firewall) là một hệ thống security, có thể dựa trên phần cứng hoặc phần mềm, sử dụng các quy tắc để kiểm soát traffic vào, ra khỏi hệ thống Tường lửa hoạt động như một rào chắn giữa mạng an toàn và mạng không an toàn Nó kiểm soát các truy cập đến nguồn lực của mạng thông qua một mô hình kiểm soát chủ động Nghĩa là, chỉ những traffic phù hợp với chính sách được định nghĩa trong tường lửa mới được truy cập vào mạng, mọi traffic khác đều bị từ chối
Đối với SDN thì tính năng chính của Firewall là ngăn việc gói tin đi hoặc đến 1 host Để làm được việc đó chúng ta cần sử dụng action DROP trong flow entry
1.2 Xây dựng Topology mạng
Như các phần trước, chúng ta có 3 switch và 2 host, nhưng ở phần này em xin được thiết
kế mạng có 3 switch và mỗi switch có 1 host như hình sau:
Hình 1.1 Topology mạng 3 switch và 3 host
h2 = net.addHost('h2', cls=Host, ip='172.23.22.167',
defaultRoute=None, mac='00:00:00:02:02:02')
h1 = net.addHost('h1', cls=Host, ip='172.23.22.168',
3
Trang 7defaultRoute=None, mac='00:00:00:01:01:01')
h3 = net.addHost('h3', cls=Host, ip='172.23.22.169',
defaultRoute=None, mac='00:00:00:03:03:03')
Em cấp them host 3 với địa chỉ IP = '172.23.22.169' và địa chỉ MAC là '00:00:00:03:03:03'
Ngoài ra mỗi host bây giờ em có gán thêm địa chỉ MAC tương ứng với từng host, ví dụ h1 = “'00:00:00:01:01:01'” Mục đính gán địa chỉ MAC để việc đơn giản hóa việc specific địa chỉ MAC vào các rule cho firewall Nếu không chỉ rõ địa chỉ MAC thì mininet sẽ tự tạo địa chỉ MAC một cách ngẫu nhiên
Để chạy topology ta sử dụng mininet với câu lệnh sau:
$ sudo python /topo.py
Nếu chạy thành công ta thu được ảnh sau:
Hình 1.2 Khởi chạy mạng topology băng mininet
4
Trang 8CHƯƠNG 2 ĐỊNH NGHĨA POLICY CHO FIREWALL
2.1 Định nghĩa bằng command
Ta có định add flow firewall bằng cách sử dụng Terminal
$ sudo ovs-ofctl add-flow [tên switch] [policy mà mình mong muốn] action=DROP
Ví dụ: Ta muốn chặn toàn bộ traffic đi ra từ host 1, ta thực hiện câu lệnh sau:
sudo ovs-ofctl add-flow s1 dl_type=0x0800, priority=65535, nw_src=10.0.0.1, action=DROP
Trong đó:
- priority nên được để cao hơn để tránh xung đột với flow khác có priority giá trị cao hơn làm cho flow firewall này không hoạt động
- 0x0800 là Internet Protocol version 4 (IPv4)
- nw_src là địa chỉ IP nguồn
2.2 Định nghĩa thông qua Ryu
Như ta có thể thấy, ta có thể add flow firewall một cách dễ dàng thông qua terminal Tuy nhiên việc thực hiện như trên có nhiều bất lợi như là nếu ta muốn add nhiều flow firewall thì phải nhập nhiều lần, thậm chí ta có thể cấu hình sai gây ra nhiều rắc rồi Chính vì vậy
ta sẽ định nghĩa ra 1 file python để Ryu có thể đọc file đó và cấu hình giúp chúng ta
Vì thời lượng bài tập lớn có hạn, em xin phép làm firewall cho 2 trường hợp Đó là chặn toàn bộ traffic từ host 1 đến host 3 và chỉ chặn truy cập TCP đến cổng 80 trên host 1
2.2.1 Chặn toàn bộ traffic từ host 1 đến host 3
Ta có thể nhìn đoạn code sau:
eth_src = "00:00:00:01:01:01"
eth_dst = "00:00:00:03:03:03"
eth_type = 0x0800
priority = 30000
actions = []
match = parser.OFPMatch(
5
Trang 9eth_dst=eth_dst, eth_src=eth_src, eth_type=eth_type)
self.add_flow(datapath, priority, match, actions)
Chúng ta sẽ đặt các biến eth_src và eth_dst để lữu trữ địa chỉ MAC của host 1 và địa chỉ MAC của host 3 Ở đây ta có biến actions =[] thì Ryu hiểu đây là DROP Tức là khi gặp gói tin IP có địa chỉ MAC nguồn là host 1 và MAC đích là host 3 thì ngay lập sẽ bị loại
bỏ, không cho gói tin từ host 1 đến host 3 0x0800 là IP
OFPMatch là 1 class mô tả các field cho header của IP Ở trong OpenFlow 1.3 có tổng cộng có hơn 40 tham số đầu vào, nếu đầu vào không chỉ định rõ cho 1 field thì nó sẽ
“wildcard” và sẽ match bất cứ thông tin
Và cuối cùng ta sử dụng hàm add_flow() để add flow vào flow table để sau có traffic tương tự thì Data plane tự thực hiện, không cần đưa traffic đến Ryu để kiểm tra
2.2.2 Chỉ chặn truy cập TCP đến cổng 80 trên host 1
Cũng tương tự với trường hợp kia, chúng ta cũng viết code tượng tự cho trường hợp này: actions = []
priority = 30000
mac_h1 = "00:00:00:01:01:01"
ip_h1= "172.23.22.168"
match = parser.OFPMatch(eth_dst=mac_h1,
ipv4_dst=ip_h1, eth_type=0x0800, ip_proto=6, tcp_dst=80) self.add_flow(datapath, priority, match, actions)
Để chặn được traffic TCP đến host 1 thì có 2 vùng chúng ta cần chỉ rõ trong OFPMatch Đó là ip_proto và eth_type Nếu thiếu 1 trong 2 field đó thì flow này không được add vào flow table
eth_type là 0x0800 chúng ta đều biết đó là IP còn ip_proto là protocol của IP và 6 là TCP Chúng ta có bảng protocol phổ biến của IP như sau:
Protocol Number Key Protocol
6 TCP Transmission Control Protocol
17 UDP User Datagram Protocol
6
Trang 10Bảng 2.1 ID protocol của IP
Và cuối cùng chúng ta add flow vào flow table thông qua add_flow()
7
Trang 11CHƯƠNG 3 KẾT QUẢ MÔ PHỎNG
3.1 Chặn toàn bộ traffic từ host 1 đến host 3
Để kích hoạt Ryu ta sử dụng câu lệnh sau:
$ ryu-manager ryu.app.simple_switch_stp_13 block_h1_to_h3.py
Trong đó: ryu.app.simple_switch_stp_13 là thuật toán tự add-flow trong SDN với spanning tree protocol và block_h1_to_h3.py là file rule firewall do mình tự tạo
Nếu chạy thành công ta sẽ có được thông báo như hình sau:
Hình 3.3 Khởi chạy Ryu với rule chặn toàn bộ traffic từ host 1 đến host 3
Để thử nghiệm file rule đã hoạt động chưa, ta sử dụng lệnh pingall trên mininet ta thấy
được như sau:
Hình 3.4 Kiểm tra kết nối các host thông qua mininet
8
Trang 12h1 không thể ping được h3 và ngược lại h3 cũng không thể ping được h1, nhưng h1 ping h2 và h2 cũng ping h3
Để kiểm tra kỹ hơn chúng ta thực hiện câu lệnh sau:
$ sudo ovs-ofctl dump-flows s1
Với câu lệnh trên chúng ta sẽ in toàn bộ flow table trong switch s1:
Hình 3.5 Flow Table của switch s1
Và chúng ta đã thấy rule do chúng ta đặt ra đã có trong flow table
Không chỉ tại switch s1 và tái switch s3 và switch s2, rule cũng đã được add vào flow table như ảnh sau:
Hình 3.6 Flow Table của switch s3
9
Trang 13Chính vì thế chúng ta đã thử nghiệm hành công
3.2 Chỉ chặn truy cập TCP đến cổng 80 trên host 1
Cũng tương tự với trường hợp trên ta cũng thực hiện câu lệnh tương tự
$ ryu-manager ryu.app.simple_switch_stp_13 tcp_html_h1.py Trong đó: tcp_html_h1.py là file rule firewall chặn traffic TCP đến cổng 80 trên host 1 do mình tự tạo
Đầu tiên chúng ta kiểm tra kết nối đến các host bằng lệnh pingall trên miniet, ta thu được
ảnh sau:
Hình 3.7 Kiểm tra kết nối các host thông qua mininet
Chúng ta thấy được rằng các host đều ping được đến với nhau
Để kiểm tra firewall đã hoạt động đúng theo mong muốn của mình thì chúng ta cần mở terminal trên host 1 và host còn lại Để mở terminal trên host của mininet ta sử dụng câu
lệnh xterm + tên_host Lúc này sẽ có màn hình terminal của host để mình thao tác lệnh
Để kiểm tra kết nối TCP em sử dụng chương trình netcat để kiểm tra
Ở trên host 1 ta thực hiện câu lệnh sau:
$ nc -l 80
Trong đó:
- nc là chương trình netcat
- -l là listen, mình sẽ dung chương trình này để listen tại cổng 80
Ở trên host 2 ta thực hiện câu lệnh sau:
$ nc 172.23.22.168 80
Trong đó:
- nc là chương trình netcat
- 172.23.22.168 là địa chỉ IP của host 1
10
Trang 14- 80 là port 80 của host 1
Sau khi thực hiện 2 lệnh ta gửi 1 vài bản tin TCP từ host2 sang host 1 ta thấy được rằng:
Hình 3.8 Kiểm tra traffic trên port 80
Dù phía host 2 đã gửi 4 bản tin nhưng phía host 1 không nhận được bất kì bản tin nào
Để kiểm tra thêm, chúng ta thử mở cổng khác(không phải 80) trên host 1 xem host 2 có kết nối được không?? Ví dụ chúng ta sử dụng 75
Hình 3.9 Kiểm tra traffic trên port 75
Và chúng ta có thể thấy rang host 2 gửi 5 bản tin thì host 1 đều nhận được cả Chứng tỏ mạng SDN đã chặn mọi traffic TCP đến host 1 thông qua port 80, chứ mọi port khác SDN không hề chặn
Bây giờ chúng ta xem flow table, kiểm tra rule firewall do chúng ta đặt ra đã có trong flow table của switch:
11
Trang 15Hình 3.10 Flow Table của switch s1
Chính vì vậy chúng ta đã thử nghiệm hành công
12
Trang 16KẾT LUẬN
3.3 Những kết quả làm được:
- Thực hành tổng quan về mạng SDN
- Mô hình hóa được mạng SDN thông qua Open vSwitch và chạy ứng dụng nhỏ là Firewall và firewall hoạt động thành công dựa theo yêu cầu mong muốn của mình
3.4 Định hướng tương lại:
- Vì thời lượng có hạn nên em chỉ mới làm được ứng dụng nho nhỏ của mạng SDN
đó là Firewall, ngoài ra mạng SDN có rất nhiều ứng dụng lớn
- Một trong những điểm mạnh của controller SDN cũng như Ryu đó là mình có thể giao tiếp với nó thông qua REST API Đây là một lợi thế tạo tiền đề để phát triển mạnh mẽ NFV Orchestrator (Network Function Virtualization Orchestrator)
13
Trang 17TÀI LIỆU THAM KHẢO
[1] Tài liệu tham khảo từ Future Internet Lab – Trường đại học Bách Khoa Hà Nội
14