Cách cấu hình bộ lọc gói (PF) trên FreeBSD 12.1
Tường lửa được cho là một trong những tuyến phòng thủ quan trọng nhất chống lại các cuộc tấn công mạng. Khả năng cấu hình firewall từ đầu là một kỹ năng trao quyền cho phép administrator kiểm soát mạng của họ.Bộ lọc gói (PF) là một ứng dụng firewall nổi tiếng được duy trì ngược dòng bởi dự án OpenBSD theo hướng bảo mật. Nó được thể hiện một cách chính xác hơn như một công cụ lọc gói tin, do đó có tên gọi, và nó được biết đến với cú pháp đơn giản, thân thiện với user và các tính năng mở rộng. PF là một firewall trạng thái theo mặc định, lưu trữ thông tin về các kết nối trong một bảng trạng thái có thể được truy cập cho mục đích phân tích. PF là một phần của hệ thống cơ sở FreeBSD và được hỗ trợ bởi một cộng đồng các nhà phát triển mạnh mẽ. Mặc dù có sự khác biệt giữa các version FreeBSD và OpenBSD của PF liên quan đến kiến trúc kernel , nhưng nhìn chung cú pháp của chúng tương tự nhau. Tùy thuộc vào độ phức tạp của chúng, các bộ luật chung có thể được sửa đổi để hoạt động trên cả hai bản phân phối mà không tốn nhiều công sức.
Trong hướng dẫn này, bạn sẽ xây dựng firewall từ đầu trên server FreeBSD 12.1 với PF. Bạn sẽ thiết kế một bộ luật cơ sở được dùng làm mẫu cho các dự án trong tương lai. Bạn cũng sẽ khám phá một số tính năng nâng cao của PF như vệ sinh gói, ngăn chặn bạo lực, giám sát và ghi log và các công cụ của bên thứ ba khác.
Yêu cầu
Trước khi bắt đầu hướng dẫn này, bạn cần những thứ sau:
- Server 1G FreeBSD 12.1 ( ZFS hoặc UFS ). Bạn có thể sử dụng hướng dẫn Cách bắt đầu với FreeBSD của ta để cài đặt server của bạn theo cấu hình bạn muốn .
- FreeBSD không có firewall được bật theo mặc định — tùy chỉnh là một dấu hiệu nổi bật của đặc tính FreeBSD. Do đó, khi bạn chạy server của bạn lần đầu tiên, bạn cần bảo vệ tạm thời trong khi PF đang được cấu hình. Nếu đang sử dụng DigitalOcean, bạn có thể bật firewall cloud của bạn ngay lập tức sau khi khởi động server . Tham khảo Khởi động nhanh firewall của DigitalOcean để biết hướng dẫn về cách cấu hình firewall cloud . Nếu bạn đang sử dụng một nhà cung cấp cloud khác, hãy xác định lộ trình nhanh nhất để bảo vệ ngay lập tức trước khi bạn bắt đầu. Cho dù bạn chọn phương pháp nào, firewall tạm thời của bạn phải chỉ cho phép lưu lượng SSH đến và có thể cho phép tất cả các loại lưu lượng đi.
Bước 1 - Xây dựng bộ luật sơ bộ của bạn
Bạn sẽ bắt đầu hướng dẫn này bằng cách soạn thảo bộ luật sơ bộ cung cấp khả năng bảo vệ cơ bản và quyền truy cập vào các dịch vụ quan trọng từ internet. Đến đây, bạn có một server FreeBSD 12.1 đang chạy với firewall cloud đang hoạt động.
Có hai cách tiếp cận để xây dựng firewall : từ chối mặc định và cho phép mặc định . Phương pháp từ chối mặc định chặn tất cả lưu lượng truy cập và chỉ cho phép những gì được chỉ định trong luật . Phương pháp cấp phép mặc định hoàn toàn ngược lại: nó vượt qua tất cả lưu lượng truy cập và chỉ chặn những gì được chỉ định trong luật . Bạn sẽ sử dụng phương pháp từ chối mặc định.
Bộ luật PF được viết trong file cấu hình có tên /etc/pf.conf
, cũng là vị trí mặc định của nó. Có thể lưu trữ file này ở một nơi khác miễn là nó được chỉ định trong file cấu hình /etc/rc.conf
. Trong hướng dẫn này, bạn sẽ sử dụng vị trí mặc định.
Đăng nhập vào server của bạn bằng user không phải root của bạn:
- ssh freebsd@your_server_ip
Tiếp theo, tạo file /etc/pf.conf
của bạn:
- sudo vi /etc/pf.conf
Lưu ý: Nếu bạn muốn xem bộ luật cơ sở hoàn chỉnh tại bất kỳ điểm nào trong hướng dẫn, bạn có thể tham khảo các ví dụ trong Bước 4 hoặc Bước 8 .
PF lọc các gói theo ba hành động cốt lõi: block
, pass
và match
. Khi kết hợp với các tùy chọn khác, chúng tạo thành luật . Một hành động được thực hiện khi một gói đáp ứng các tiêu chí được chỉ định trong một luật . Như bạn có thể mong đợi, pass
và block
luật này sẽ pass
và block
giao thông. Luật so match
thực hiện một hành động trên một gói khi nó tìm thấy một tiêu chí phù hợp, nhưng không vượt qua hoặc chặn nó. Ví dụ: bạn có thể thực hiện dịch địa chỉ mạng (NAT) trên một gói tin phù hợp mà không cần chuyển hoặc chặn gói tin đó và nó sẽ ở đó cho đến khi bạn yêu cầu nó thực hiện điều gì đó theo luật khác, chẳng hạn như định tuyến nó đến một máy hoặc cổng khác.
Tiếp theo, thêm luật đầu tiên vào file /etc/pf.conf
của bạn:
block all
Luật này chặn tất cả các hình thức giao thông theo mọi hướng. Vì nó không chỉ định hướng, nó mặc định là cả in
và out
. Luật này là hợp lệ đối với một máy trạm local cần được cách ly với thế giới, nhưng phần lớn là không thực tế và sẽ không hoạt động trên một server từ xa vì nó không cho phép lưu lượng SSH. Trên thực tế, nếu bạn bật PF, bạn sẽ tự khóa mình khỏi server .
Sửa đổi file /etc/pf.conf
của bạn để cho phép lưu lượng truy cập SSH với dòng được đánh dấu sau:
block all pass in proto tcp to port 22
Lưu ý: Ngoài ra, bạn có thể sử dụng tên của giao thức:
block all pass in proto tcp to port ssh
Vì mục đích nhất quán, ta sẽ sử dụng số cổng, trừ khi có lý do chính đáng để không sử dụng. Có một danh sách chi tiết các giao thức và số cổng tương ứng của chúng trong file /etc/services
mà bạn được khuyến khích xem.
PF xử lý các luật một cách tuần tự từ trên xuống dưới, do đó, bộ luật hiện tại của bạn ban đầu chặn tất cả lưu lượng truy cập, nhưng sau đó sẽ chuyển nó nếu các tiêu chí trên dòng tiếp theo được khớp, trong trường hợp này là lưu lượng SSH.
Đến đây bạn có thể SSH vào server của bạn , nhưng bạn vẫn đang chặn tất cả các hình thức lưu lượng ra ngoài. Đây là vấn đề vì bạn không thể truy cập các dịch vụ quan trọng từ internet để cài đặt các gói, cập nhật cài đặt thời gian của bạn, v.v.
Để giải quyết vấn đề này, hãy thêm luật được đánh dấu sau vào cuối file /etc/pf.conf
của bạn:
block all pass in proto tcp to port { 22 } pass out proto { tcp udp } to port { 22 53 80 123 443 }
Bộ luật của bạn hiện cho phép lưu lượng SSH , DNS ,HTTP , NTP và HTTPS ra bên ngoài, cũng như chặn tất cả lưu lượng vào (ngoại trừ SSH). Bạn đặt số cổng và giao thức bên trong dấu ngoặc nhọn, tạo thành danh sách theo cú pháp PF, cho phép bạn thêm nhiều số cổng hơn nếu cần. Bạn cũng thêm luật chuyển đi cho giao thức UDP trên các cổng 53
và 123
vì DNS và NTP thường chuyển đổi giữa cả hai giao thức TCP và UDP. Bạn gần như đã hoàn thành bộ luật sơ bộ và chỉ cần thêm một vài luật để đạt được chức năng cơ bản.
Hoàn thành bộ luật sơ bộ với các luật được đánh dấu:
set skip on lo0 block all pass in proto tcp to port { 22 } pass out proto { tcp udp } to port { 22 53 80 123 443 } pass out inet proto icmp icmp-type { echoreq }
Lưu và thoát khỏi file .
Bạn tạo luật set skip
cho loopback devide vì thiết bị này không cần lọc lưu lượng truy cập và có thể đưa server của bạn thu thập thông tin. Bạn thêm luật pass out inet
cho giao thức ICMP , cho phép bạn sử dụng trình ping (8) để khắc phục sự cố. Tùy chọn inet
đại diện cho họ địa chỉ IPv4 .
ICMP là một giao thức nhắn tin đa mục đích được sử dụng bởi các thiết bị mạng cho nhiều loại hình giao tiếp khác nhau. Ví dụ: tiện ích ping sử dụng một loại thông báo được gọi là yêu cầu phản hồi mà bạn đã thêm vào danh sách icmp_type
của bạn . Để đề phòng, bạn chỉ cho phép các loại thông báo mà bạn cần để ngăn các thiết bị không mong muốn liên hệ với server của bạn. Khi nhu cầu của bạn tăng lên, bạn có thể thêm nhiều loại tin nhắn vào danh sách của bạn .
Đến đây bạn có một bộ luật hoạt động cung cấp chức năng cơ bản cho hầu hết các máy. Trong phần tiếp theo, hãy xác nhận mọi thứ đang hoạt động chính xác bằng cách bật PF và kiểm tra bộ luật sơ bộ của bạn.
Bước 2 - Kiểm tra bộ luật sơ bộ của bạn
Trong bước này, bạn sẽ kiểm tra bộ luật sơ bộ của bạn và thực hiện chuyển đổi từ firewall cloud sang firewall PF, cho phép PF tiếp quản hoàn toàn. Bạn sẽ kích hoạt bộ luật của bạn với tiện ích pfctl
, là công cụ dòng lệnh tích hợp của PF và là phương pháp chính để giao tiếp với PF.
Bộ luật PF không hơn gì các file văn bản, nghĩa là không có quy trình phức tạp nào liên quan đến việc tải các bộ luật mới. Bạn có thể tải một bộ luật mới và bộ luật cũ đã biến mất. Hiếm khi, nếu có, nhu cầu đưa ra một bộ luật hiện có.
FreeBSD sử dụng một web các tập lệnh shell được gọi là hệ thống rc
để quản lý cách các dịch vụ được khởi động tại thời điểm khởi động; ta chỉ định các dịch vụ đó trong các file cấu hình rc
khác nhau. Đối với các dịch vụ global như PF, bạn sử dụng file /etc/rc.conf
. Vì các file rc
rất quan trọng đối với sự tồn tại của hệ thống FreeBSD, chúng không nên được chỉnh sửa trực tiếp. Thay vào đó, FreeBSD cung cấp một tiện ích dòng lệnh được gọi là sysrc
được thiết kế để giúp bạn chỉnh sửa các file này một cách an toàn.
Hãy bật PF bằng tiện ích dòng lệnh sysrc
:
- sudo sysrc pf_enable="YES"
- sudo sysrc pflog_enable="YES"
Xác minh những thay đổi này bằng cách in nội dung của file /etc/rc.conf
của bạn:
- sudo cat /etc/rc.conf
Bạn sẽ thấy kết quả sau:
Outputpf_enable="YES" pflog_enable="YES"
Bạn cũng kích hoạt dịch vụ pflog
, do đó, kích hoạt daemon pflogd
để đăng nhập PF. (Bạn sẽ làm việc với việc đăng nhập ở bước sau.
Bạn chỉ định hai dịch vụ global trong file /etc/rc.conf
của bạn , nhưng chúng sẽ không chạy cho đến khi bạn khởi động lại server hoặc khởi động chúng theo cách thủ công. Khởi động lại server để bạn cũng có thể kiểm tra quyền truy cập SSH của bạn .
Khởi động PF bằng cách khởi động lại server :
- sudo reboot
Kết nối sẽ bị ngắt. Hãy cho nó một vài phút để cập nhật.
Bây giờ SSH trở lại server :
- ssh freebsd@your_server_ip
Mặc dù bạn đã khởi tạo các dịch vụ PF của bạn , nhưng bạn vẫn chưa thực sự tải bộ luật /etc/pf.conf
của bạn , nghĩa là firewall của bạn chưa hoạt động.
Tải bộ luật bằng pfctl
:
- sudo pfctl -f /etc/pf.conf
Nếu không có lỗi hoặc thông báo, điều đó nghĩa là bộ luật của bạn không có lỗi và firewall đang hoạt động.
Bây giờ PF đang chạy, bạn có thể tách server của bạn khỏi firewall cloud . Điều này có thể được thực hiện tại control panel trong account DigitalOcean của bạn bằng cách xóa Server khỏi cổng firewall cloud của bạn. Nếu bạn đang sử dụng một nhà cung cấp dịch vụ cloud khác, hãy đảm bảo mọi thứ bạn đang sử dụng để bảo vệ tạm thời đều bị vô hiệu hóa. Chạy hai firewall khác nhau trên một server gần như chắc chắn sẽ gây ra sự cố.
Để có biện pháp tốt, hãy khởi động lại server của bạn :
- sudo reboot
Sau một vài phút, SSH trở lại server của bạn:
- ssh freebsd@your_server_ip
PF hiện là firewall hoạt động của bạn. Bạn có thể đảm bảo nó đang chạy bằng cách truy cập một số dữ liệu bằng tiện ích pfctl.
Hãy xem một số thống kê và bộ đếm với pfctl -si
:
- sudo pfctl -si
Bạn vượt qua cờ -si
, đại diện cho thông tin hiển thị . Đây là một trong nhiều tổ hợp tham số bộ lọc mà bạn có thể sử dụng với pfctl để phân tích dữ liệu về hoạt động firewall của bạn .
Bạn sẽ thấy dữ liệu dạng bảng sau (các giá trị sẽ khác nhau giữa các máy):
OutputStatus: Enabled for 0 days 00:01:53 Debug: Urgent State Table Total Rate current entries 5 searches 144 1.3/s inserts 11 0.1/s removals 6 0.1/s Counters match 23 0.2/s bad-offset 0 0.0/s fragment 0 0.0/s short 0 0.0/s normalize 0 0.0/s memory 0 0.0/s bad-timestamp 0 0.0/s congestion 0 0.0/s ip-option 0 0.0/s proto-cksum 0 0.0/s state-insert 0 0.0/s state-limit 0 0.0/s src-limit 0 0.0/s synproxy 0 0.0/s map-failed 0 0.0/s
Vì bạn vừa kích hoạt bộ luật của bạn , bạn sẽ không thấy nhiều thông tin. Tuy nhiên, kết quả này cho thấy rằng PF đã ghi lại 23 luật phù hợp, nghĩa là các tiêu chí của bộ luật của bạn đã được khớp 23 lần. Đầu ra cũng xác nhận firewall của bạn đang hoạt động.
Bộ luật của bạn cũng cho phép lưu lượng truy cập ra ngoài truy cập vào một số dịch vụ quan trọng từ internet, bao gồm cả tiện ích ping.
Hãy kiểm tra kết nối internet và dịch vụ DNS với ping chống lại google.com
:
- ping -c 3 google.com
Vì bạn đã chạy cờ đếm -c 3
, bạn sẽ thấy ba phản hồi kết nối thành công:
OutputPING google.com (172.217.0.46): 56 data bytes 64 bytes from 172.217.0.46: icmp_seq=0 ttl=56 time=2.088 ms 64 bytes from 172.217.0.46: icmp_seq=1 ttl=56 time=1.469 ms 64 bytes from 172.217.0.46: icmp_seq=2 ttl=56 time=1.466 ms --- google.com ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 1.466/1.674/2.088/0.293 ms
Đảm bảo rằng bạn có thể truy cập repository pkgs bằng lệnh sau:
- sudo pkg upgrade
Nếu có bất kỳ gói nào cần nâng cấp, hãy tiếp tục và nâng cấp chúng.
Nếu cả hai dịch vụ này đều hoạt động, điều đó nghĩa là firewall của bạn đang hoạt động và bây giờ bạn có thể tiếp tục. Mặc dù bộ luật sơ bộ của bạn cung cấp tính năng bảo vệ và chức năng, nó vẫn là bộ luật cơ bản và có thể sử dụng một số cải tiến. Trong các phần còn lại, bạn sẽ hoàn thành bộ luật cơ sở của bạn và sử dụng một số tính năng nâng cao của PF.
Bước 3 - Hoàn thành Bộ luật cơ bản của bạn
Trong bước này, bạn sẽ xây dựng bộ luật sơ bộ để hoàn thành bộ luật cơ sở của bạn . Bạn sẽ tổ chức lại một số luật của bạn và làm việc với các khái niệm nâng cao hơn.
Kết hợp Macro và Bảng
Trong bộ luật sơ bộ, bạn đã cố gắng mã hóa tất cả các tham số của bạn vào mỗi luật , tức là số cổng tạo nên danh sách. Điều này có thể trở nên không thể quản lý được trong tương lai, tùy thuộc vào bản chất mạng của bạn. Đối với mục đích tổ chức, PF bao gồm macro , danh sách và bảng . Bạn đã bao gồm danh sách trực tiếp trong luật của bạn , nhưng bạn cũng có thể tách chúng khỏi luật của bạn và gán chúng cho một biến bằng macro.
Mở file của bạn để chuyển một số thông số của bạn thành macro:
- sudo vi /etc/pf.conf
Bây giờ, hãy thêm nội dung sau vào phần trên cùng của bộ luật :
vtnet0 = "vtnet0" icmp_types = "{ echoreq }" . . .
Sửa đổi các luật SSH và ICMP trước đây của bạn với các biến mới của bạn:
. . . pass in on $vtnet0 proto tcp to port { 22 } . . . pass inet proto icmp icmp-type $icmp_types . . .
Các luật SSH và ICMP trước đây của bạn hiện sử dụng macro. Các tên biến được biểu thị bằng cú pháp ký hiệu đô la của PF. Bạn chỉ định giao diện vtnet0
của bạn cho một biến có cùng tên giống như một hình thức, điều này cung cấp cho bạn tùy chọn đổi tên nó trong tương lai nếu cần. Các tên biến phổ biến khác cho giao diện công khai bao gồm $pub_if
hoặc $ext_if
.
Tiếp theo, bạn sẽ triển khai một bảng , tương tự như macro , nhưng được thiết kế để chứa các group địa chỉ IP. Hãy tạo một bảng cho các địa chỉ IP không thể định tuyến, thường đóng role trong các cuộc tấn công từ chối dịch vụ (DOS). Bạn có thể sử dụng các địa chỉ IP được chỉ định trong RFC6890 , xác định các đăng ký địa chỉ IP cho mục đích đặc biệt. Server của bạn không nên gửi hoặc nhận các gói đến hoặc từ các địa chỉ này qua giao diện công khai.
Tạo bảng này bằng cách thêm nội dung sau ngay dưới macro icmp_types
:
. . . table <rfc6890> { 0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 169.254.0.0/16 \ 172.16.0.0/12 192.0.0.0/24 192.0.0.0/29 192.0.2.0/24 192.88.99.0/24 \ 192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 \ 240.0.0.0/4 255.255.255.255/32 } . . .
Bây giờ, hãy thêm các luật của bạn cho bảng <rfc6890>
bên dưới luật set skip on lo0
:
. . . set skip on lo0 block in quick on egress from <rfc6890> block return out quick on egress to <rfc6890> . . .
Ở đây bạn giới thiệu tùy chọn return
, bổ sung cho luật block out
của bạn. Thao tác này sẽ thả các gói và cũng gửi một thông báo RST đến server đã cố gắng thực hiện các kết nối đó, rất hữu ích cho việc phân tích hoạt động của server . Sau đó, bạn thêm từ khóa egress
, từ khóa này sẽ tự động tìm (các) tuyến đường mặc định trên bất kỳ (các) giao diện nhất định nào. Đây thường là một phương pháp tìm đường mặc định rõ ràng hơn, đặc biệt là với các mạng phức tạp. Từ khóa quick
thực thi các luật ngay lập tức mà không cần xem xét phần còn lại của bộ luật . Ví dụ: nếu một gói có địa chỉ IP không hợp lý cố gắng kết nối với server , bạn muốn ngắt kết nối ngay lập tức và không có lý do gì để chạy gói đó qua phần còn lại của bộ luật .
Bảo vệ các cổng SSH của bạn
Vì cổng SSH của bạn được mở cho công chúng nên nó có thể bị khai thác. Một trong những dấu hiệu cảnh báo rõ ràng hơn về kẻ tấn công là số lượng lớn các nỗ lực đăng nhập. Ví dụ: nếu cùng một địa chỉ IP cố gắng đăng nhập vào server của bạn mười lần trong một giây, bạn có thể cho rằng điều đó không được thực hiện bằng bàn tay con người mà bằng phần mềm máy tính đang cố gắng bẻ khóa password đăng nhập của bạn. Những kiểu khai thác có hệ thống này thường được gọi là tấn công vũ phu và thường thành công nếu server có password yếu.
Cảnh báo: Ta thực sự khuyên bạn nên sử dụng xác thực public key trên tất cả các server . Tham khảo hướng dẫn của DigitalOcean về xác thực dựa trên khóa .
PF có các tính năng tích hợp để xử lý bạo lực và các cuộc tấn công tương tự khác. Với PF, bạn có thể giới hạn số lần thử kết nối đồng thời được cho phép bởi một server duy nhất. Nếu server vượt quá các giới hạn đó, kết nối sẽ bị ngắt và chúng sẽ bị cấm khỏi server . Để thực hiện điều này, bạn sẽ sử dụng cơ chế quá tải của PF, cơ chế này duy trì một bảng các địa chỉ IP bị cấm.
Sửa đổi luật SSH trước đó của bạn để giới hạn số lượng kết nối đồng thời từ một server duy nhất như sau:
. . . pass in on $vtnet0 proto tcp to port { 22 } \ keep state (max-src-conn 15, max-src-conn-rate 3/1, \ overload <bruteforce> flush global) . . .
Bạn thêm tùy chọn keep state
cho phép bạn xác định tiêu chí trạng thái cho bảng quá tải. Bạn chuyển tham số max-src-conn
để chỉ định số lượng kết nối đồng thời được phép từ một server mỗi giây và tham số max-src-conn-rate
để chỉ định số lượng kết nối mới được phép từ một server mỗi giây. Bạn chỉ định 15
kết nối cho max-src-conn
và 3
kết nối cho max-src-conn-rate
. Nếu server vượt quá các giới hạn này, cơ chế overload
sẽ thêm IP nguồn vào bảng <bruteforce>
, bảng này sẽ cấm chúng khỏi server . Cuối cùng, tùy chọn flush global
ngay lập tức ngắt kết nối.
Bạn đã xác định một bảng quá tải trong luật SSH của bạn , nhưng chưa khai báo bảng đó trong bộ luật của bạn .
Thêm bảng <bruteforce>
bên dưới macro icmp_types
:
. . . icmp_types = "{ echoreq }" table <bruteforce> persist . . .
Từ khóa persist
cho phép một bảng trống tồn tại trong bộ luật . Nếu không có nó, PF sẽ phàn nàn rằng không có địa chỉ IP nào trong bảng.
Các biện pháp này đảm bảo cổng SSH của bạn được bảo vệ bởi một cơ chế bảo mật mạnh mẽ. PF cho phép bạn cấu hình các giải pháp nhanh chóng để bảo vệ khỏi các hình thức khai thác tai hại. Trong các phần tiếp theo, bạn sẽ thực hiện các bước để dọn dẹp các gói khi chúng đến server của bạn.
Vệ sinh lưu lượng truy cập của bạn
Lưu ý: Các phần sau đây mô tả các nguyên tắc cơ bản cơ bản của bộ giao thức TCP / IP. Nếu bạn có kế hoạch xây dựng các ứng dụng web hoặc mạng, bạn nên nắm vững những khái niệm này. Hãy xem hướng dẫn Giới thiệu về Thuật ngữ Mạng, Giao diện và Giao thức của DigitalOcean.
Do sự phức tạp của bộ giao thức TCP / IP và sự tồn tại của các tác nhân độc hại, các gói tin thường đến với sự khác biệt và mơ hồ như các đoạn IP chồng chéo, địa chỉ IP giả, v.v. Bạn bắt buộc phải làm sạch lưu lượng truy cập của bạn trước khi nó vào hệ thống. Thuật ngữ kỹ thuật cho quá trình này là bình thường hóa .
Khi dữ liệu di chuyển qua internet, nó thường được chia thành các đoạn nhỏ hơn tại nguồn của nó để chứa các thông số truyền của server đích, nơi nó được tập hợp lại thành các gói hoàn chỉnh. Thật không may, kẻ xâm nhập có thể chiếm đoạt quá trình này theo một số cách vượt ra ngoài phạm vi của hướng dẫn này. Tuy nhiên, với PF, bạn có thể quản lý phân mảnh bằng một luật . PF bao gồm một từ khóa scrub
để chuẩn hóa các gói.
Thêm từ khóa scrub
ngay trước luật block all
của bạn:
. . . set skip on lo0 scrub in all fragment reassemble max-mss 1440 block all . . .
Luật này áp dụng lọc cho tất cả lưu lượng truy cập đến. Bạn bao gồm tùy chọn fragment reassemble
để ngăn các phân mảnh xâm nhập vào hệ thống. Thay vào đó, chúng được lưu vào bộ nhớ đệm cho đến khi chúng được tập hợp lại thành các gói hoàn chỉnh, nghĩa là các luật lọc của bạn sẽ chỉ phải cạnh tranh với các gói thống nhất. Bạn cũng bao gồm tùy chọn max-mss 1440
, đại diện cho kích thước phân đoạn tối đa của các gói TCP được tập hợp lại, còn gọi là tải trọng . Bạn chỉ định giá trị 1440 byte, điều này tạo ra sự cân bằng giữa kích thước và hiệu suất, để lại nhiều chỗ cho các tiêu đề.
Một khía cạnh quan trọng khác của phân mảnh là một thuật ngữ được gọi là đơn vị truyền tối đa (MTU). Giao thức TCP / IP cho phép các thiết bị thương lượng kích thước gói để tạo kết nối. Server đích sử dụng các thông báo ICMP để thông báo IP nguồn của MTU của nó, một quá trình được gọi là phát hiện đường dẫn MTU . Loại thông báo ICMP cụ thể là không thể truy cập đích . Bạn sẽ cho phép MTU con đường khám phá bằng cách thêm unreach
loại thông điệp tới bạn icmp_types
danh sách.
Bạn sẽ sử dụng MTU mặc định của server là 1500 byte, có thể được xác định bằng lệnh ifconfig
:
- ifconfig
Bạn sẽ thấy kết quả sau bao gồm MTU hiện tại của bạn:
Outputvtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6> . . .
Cập nhật danh sách icmp_types
để bao gồm loại thông báo không thể truy cập đích :
vtnet0 = "vtnet0" icmp_types = "{ echoreq unreach}" . . .
Đến đây bạn đã có các policy để xử lý sự phân mảnh, các gói đi vào hệ thống của bạn sẽ đồng nhất và nhất quán. Điều này là mong muốn vì có rất nhiều thiết bị trao đổi dữ liệu qua internet.
Đến đây bạn sẽ làm việc để ngăn chặn một mối quan tâm bảo mật khác được gọi là giả mạo IP . Những kẻ tấn công thường thay đổi IP nguồn của chúng để làm cho nó xuất hiện như thể chúng cư trú trên một nút tin cậy trong một tổ chức. PF bao gồm một chỉ thị antispoofing để xử lý IP nguồn giả mạo. Khi được áp dụng cho (các) giao diện cụ thể, tính năng chống trùng lặp sẽ chặn tất cả lưu lượng truy cập từ mạng của giao diện đó (trừ khi nó bắt nguồn từ giao diện đó). Ví dụ: nếu bạn áp dụng tính năng chống gửi thư cho (các) giao diện ở 5.5.5.1/24
, tất cả lưu lượng truy cập từ mạng 5.5.5.0/24
không thể giao tiếp với hệ thống trừ khi nó bắt nguồn từ (các) giao diện đó.
Thêm nội dung được đánh dấu sau để áp dụng tính năng chống giả mạo cho giao diện vtnet0
của bạn:
. . . set skip on lo0 scrub in antispoof quick for $vtnet0 block all . . .
Lưu và thoát khỏi file .
Luật chống loại bỏ này nói rằng tất cả lưu lượng truy cập từ (các) mạng của vtnet0
chỉ có thể đi qua giao diện vtnet0
, hoặc nó sẽ bị loại bỏ ngay lập tức với từ khóa quick
. Các tác nhân xấu sẽ không thể ẩn trong mạng của vtnet0
và giao tiếp với các node khác.
Để chứng minh luật chống bỏ thư của bạn, bạn sẽ in bộ luật của bạn ra màn hình ở dạng chi tiết. Các luật trong PF thường được viết ở dạng rút gọn, nhưng chúng cũng có thể được viết ở dạng dài. Nói chung là không thực tế khi viết các luật theo cách này, nhưng đối với mục đích thử nghiệm, nó có thể hữu ích.
In nội dung của /etc/pf.conf
bằng pfctl
với lệnh sau:
- sudo pfctl -nvf /etc/pf.conf
Lệnh pfctl
này lấy các cờ -nvf
để in bộ luật và kiểm tra nó mà không thực sự tải bất cứ thứ gì, còn gọi là chạy khô . Đến đây bạn sẽ thấy toàn bộ nội dung của /etc/pf.conf
ở dạng chi tiết.
Bạn sẽ thấy một cái gì đó tương tự như kết quả sau trong phần chống phân tách:
Output. . . block drop in quick on ! vtnet0 inet from your_server_ip/20 to any block drop in quick on ! vtnet0 inet from network_address/16 to any block drop in quick inet from your_server_ip to any block drop in quick inet from network_address to any block drop in quick on vtnet0 inet6 from your_IPv6_address to any . . .
Luật chống gửi thư của bạn đã phát hiện ra rằng nó là một phần của mạng your_server_ip /20
. Nó cũng phát hiện ra rằng (đối với ví dụ của hướng dẫn này) server là một phần của mạng network_address /16
và có thêm một địa chỉ IPv6. Antispoofing chặn tất cả các mạng này giao tiếp với hệ thống, trừ khi lưu lượng của chúng đi qua giao diện vtnet0
.
Luật chống vi rút của bạn là phần bổ sung cuối cùng cho bộ luật cơ sở của bạn. Trong bước tiếp theo, bạn sẽ bắt đầu những thay đổi này và thực hiện một số thử nghiệm.
Bước 4 - Kiểm tra bộ luật cơ sở của bạn
Trong bước này, bạn sẽ xem xét và kiểm tra bộ luật cơ sở của bạn đảm bảo rằng mọi thứ hoạt động bình thường. Tốt nhất là tránh thực hiện quá nhiều luật cùng một lúc mà không thử nghiệm chúng. Phương pháp hay nhất là bắt đầu với các yếu tố cần thiết, mở rộng dần dần và backup công việc trong khi áp dụng các thay đổi cấu hình.
Đây là bộ luật cơ sở hoàn chỉnh của bạn:
vtnet0 = "vtnet0" icmp_types = "{ echoreq unreach }" table <bruteforce> persist table <rfc6890> { 0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 169.254.0.0/16 \ 172.16.0.0/12 192.0.0.0/24 192.0.0.0/29 192.0.2.0/24 192.88.99.0/24 \ 192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 \ 240.0.0.0/4 255.255.255.255/32 } set skip on lo0 scrub in all fragment reassemble max-mss 1440 antispoof quick for $vtnet0 block in quick on $vtnet0 from <rfc6890> block return out quick on egress to <rfc6890> block all pass in on $vtnet0 proto tcp to port { 22 } \ keep state (max-src-conn 15, max-src-conn-rate 3/1, \ overload <bruteforce> flush global) pass out proto { tcp udp } to port { 22 53 80 123 443 } pass inet proto icmp icmp-type $icmp_types
Đảm bảo rằng file /etc/pf.conf
của bạn giống với bộ luật cơ sở hoàn chỉnh ở đây trước khi tiếp tục. Sau đó lưu và thoát khỏi file .
Bộ luật cơ sở hoàn chỉnh của bạn cung cấp cho bạn:
- Tập hợp các macro có thể xác định các dịch vụ và thiết bị chính.
- Các policy vệ sinh mạng để giải quyết tình trạng phân mảnh gói và địa chỉ IP phi logic.
- Một cấu trúc lọc từ chối mặc định chặn mọi thứ và chỉ cho phép những gì bạn chỉ định.
- Truy cập SSH đến với giới hạn về số lượng kết nối đồng thời có thể được thực hiện bởi một server .
- Chính sách lưu lượng đi cho phép bạn truy cập vào một số dịch vụ quan trọng từ internet.
- Các policy ICMP cung cấp quyền truy cập vào tiện ích ping và khám phá đường dẫn MTU.
Chạy lệnh pfctl
sau để chạy nhanh:
- sudo pfctl -nf /etc/pf.conf
Bạn chuyển các cờ -nf
ra lệnh cho pfctl
chạy bộ luật mà không cần tải nó, điều này sẽ tạo ra lỗi nếu có gì sai.
Bây giờ, không có lỗi nào gặp phải, hãy tải bộ luật :
- sudo pfctl -f /etc/pf.conf
Nếu không có lỗi, điều đó nghĩa là bộ luật cơ sở của bạn đang hoạt động và hoạt động bình thường. Như trước đó trong hướng dẫn, bạn sẽ thực hiện một vài thử nghiệm trên bộ luật của bạn .
Kiểm tra đầu tiên cho kết nối internet và dịch vụ DNS:
- ping -c 3 google.com
Bạn sẽ thấy kết quả sau:
OutputPING google.com (172.217.0.46): 56 data bytes 64 bytes from 172.217.0.46: icmp_seq=0 ttl=56 time=2.088 ms 64 bytes from 172.217.0.46: icmp_seq=1 ttl=56 time=1.469 ms 64 bytes from 172.217.0.46: icmp_seq=2 ttl=56 time=1.466 ms --- google.com ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 1.466/1.674/2.088/0.293 ms
Sau đó, hãy kiểm tra xem bạn có đến được repository pkgs
:
- sudo pkg upgrade
, hãy nâng cấp các gói nếu cần.
Cuối cùng, khởi động lại server của bạn:
- sudo reboot
Cho server của bạn một vài phút để khởi động lại. Bạn đã hoàn thành và triển khai bộ luật cơ sở của bạn , đây là một bước quan trọng về tiến trình của bạn. Đến đây bạn đã sẵn sàng khám phá một số tính năng nâng cao của PF. Trong bước tiếp theo, bạn sẽ tiếp tục ngăn chặn các cuộc tấn công vũ phu.
Bước 5 - Quản lý Bảng quá tải của bạn
Theo thời gian, bảng quá tải <bruteforce>
sẽ chứa đầy các địa chỉ IP độc hại và cần được xóa định kỳ. Không có khả năng kẻ tấn công sẽ tiếp tục sử dụng cùng một địa chỉ IP, vì vậy việc lưu trữ chúng trong bảng quá tải trong thời gian dài là điều phản trực giác.
Bạn sẽ sử dụng pfctl
để xóa thủ công các địa chỉ IP đã được lưu trữ trong bảng quá tải trong 48 giờ trở lên bằng lệnh sau:
- sudo pfctl -t bruteforce -T expire 172800
Bạn sẽ thấy kết quả tương tự như:
Output0/0 addresses expired.
Bạn chuyển cờ -t bruteforce
, viết tắt của table bruteforce và cờ -T
, cho phép bạn chạy một số lệnh tích hợp sẵn. Trong trường hợp này, bạn chạy lệnh expire
để xóa tất cả các mục nhập khỏi -t bruteforce
với giá trị thời gian được biểu thị bằng giây. Vì bạn đang làm việc trên một server mới, nên có thể chưa có địa chỉ IP nào trong bảng quá tải.
Luật này hoạt động để sửa lỗi nhanh chóng, nhưng một giải pháp mạnh mẽ hơn sẽ là tự động hóa quy trình với cron , bộ lập lịch công việc của FreeBSD. Thay vào đó, hãy tạo một tập lệnh shell chạy chuỗi lệnh này.
Tạo file script shell trong folder /usr/local/bin
:
- sudo vi /usr/local/bin/clear_overload.sh
Thêm nội dung sau vào shell script:
#!/bin/sh pfctl -t bruteforce -T expire 172800
Làm cho file thực thi được bằng lệnh sau:
- sudo chmod 755 /usr/local/bin/clear_overload.sh
Tiếp theo, bạn sẽ tạo một công việc cron . Đây là những công việc sẽ chạy lặp đi lặp lại theo thời gian mà bạn chỉ định. Chúng thường được sử dụng để backup hoặc bất kỳ quá trình nào cần chạy vào cùng một thời điểm mỗi ngày. Bạn tạo công việc cron bằng các file crontab . Vui lòng tham khảo trang người đàn ông để tìm hiểu thêm về cron (8) và crontab (5) .
Tạo file crontab của user root bằng lệnh sau:
- sudo crontab -e
Bây giờ thêm các nội dung sau vào file crontab:
# minute hour mday month wday command * 0 * * * /usr/local/bin/clear_overload.sh
Lưu và thoát khỏi file .
Lưu ý: Vui lòng căn chỉnh mọi giá trị cho mục nhập bảng tương ứng của nó để dễ đọc nếu mọi thứ không căn chỉnh đúng khi bạn thêm nội dung.
Công việc cron này chạy tập lệnh clear_overload.sh
hàng ngày vào lúc nửa đêm, xóa các địa chỉ IP cũ 48 giờ khỏi bảng quá tải <bruteforce>
. Tiếp theo, bạn sẽ thêm các neo vào bộ luật của bạn .
Bước 6 - Giới thiệu Neo cho Bộ luật của bạn
Trong bước này, bạn sẽ giới thiệu các neo , được sử dụng để tìm nguồn cung cấp các luật vào bộ luật chính, theo cách thủ công hoặc từ file văn bản bên ngoài. Các neo có thể chứa các đoạn mã luật , bảng và thậm chí cả các neo khác, được gọi là neo lồng nhau . Hãy chứng minh cách hoạt động của neo bằng cách thêm một bảng vào file bên ngoài và tìm nguồn cung cấp nó vào bộ luật cơ sở của bạn. Bảng của bạn sẽ bao gồm một group server nội bộ mà bạn muốn ngăn kết nối với thế giới bên ngoài.
Tạo file có tên /etc/blocked-hosts-anchor
:
- sudo vi /etc/blocked-hosts-anchor
Thêm các nội dung sau vào file :
table <blocked-hosts> { 192.168.47.1 192.168.47.2 192.168.47.3 } block return out quick on egress from <blocked-hosts>
Lưu và thoát khỏi file .
Các luật này khai báo và xác định bảng <blocked-hosts>
, sau đó ngăn mọi địa chỉ IP trong bảng <blocked-hosts>
truy cập dịch vụ từ thế giới bên ngoài. Bạn sử dụng từ khóa egress
như một phương pháp ưa thích để tìm đường mặc định, hoặc lối ra, đến internet.
Bạn vẫn cần khai báo anchor trong file /etc/pf.conf
của bạn :
- sudo vi /etc/pf.conf
Bây giờ hãy thêm các luật neo sau vào sau luật block all
:
. . . block all anchor blocked_hosts load anchor blocked_hosts from "/etc/blocked-hosts-anchor" . . .
Lưu và thoát khỏi file .
Các luật này khai báo các blocked_hosts
và tải các luật neo vào bộ luật chính của bạn từ file /etc/blocked-hosts-anchor
.
Bây giờ hãy bắt đầu những thay đổi này bằng cách reload bộ luật của bạn bằng pfctl
:
- sudo pfctl -f /etc/pf.conf
Nếu không có lỗi, điều đó nghĩa là không có lỗi trong bộ luật của bạn và các thay đổi đang hoạt động.
Sử dụng pfctl
để xác minh pfctl
neo của bạn đang chạy:
- sudo pfctl -s Anchors
Cờ -s Anchors
là viết tắt của "show anchor". Bạn sẽ thấy kết quả sau:
Outputblocked_hosts
Tiện ích pfctl
cũng có thể phân tích cú pháp các luật cụ thể của pfctl
neo của bạn bằng các cờ -a
và -s
:
- sudo pfctl -a blocked_hosts -s rules
Bạn sẽ thấy kết quả sau:
Outputblock return out quick on egress from <blocked-hosts> to any
Một tính năng khác của neo là chúng cho phép bạn thêm các luật theo yêu cầu mà không cần phải reload bộ luật . Điều này có thể hữu ích cho việc kiểm tra, sửa chữa nhanh, các trường hợp khẩn cấp, v.v. Ví dụ: nếu một server nội bộ đang hoạt động đặc biệt và bạn muốn chặn nó tạo các kết nối ra bên ngoài, bạn có thể có một mỏ neo cho phép bạn can thiệp nhanh chóng từ dòng lệnh.
Hãy mở /etc/pf.conf
và thêm một neo khác:
- sudo vi /etc/pf.conf
Bạn sẽ đặt tên cho anchor rogue_hosts
và đặt nó vào luật block all
:
. . . block all anchor rogue_hosts . . .
Lưu và thoát khỏi file .
Để bắt đầu những thay đổi này, hãy reload bộ luật bằng pfctl
:
- sudo pfctl -f /etc/pf.conf
, hãy sử dụng pfctl
để xác minh neo đang chạy:
- sudo pfctl -s Anchors
Điều này sẽ tạo ra kết quả sau:
Outputblocked_hosts rogue_hosts
Bây giờ neo đang chạy, bạn có thể thêm các luật vào nó bất cứ lúc nào. Kiểm tra điều này bằng cách thêm luật sau:
- sudo sh -c 'echo "block return out quick on egress from 192.168.47.4" | pfctl -a rogue_hosts -f -'
Lệnh này gọi lệnh echo
và nội dung chuỗi của nó, sau đó được đưa vào tiện ích pfctl
với |
biểu tượng, nơi nó được xử lý thành luật neo. Bạn mở một phiên shell khác bằng lệnh sh -c
. Điều này là do bạn cài đặt một đường ống giữa hai quy trình, nhưng cần các quyền sudo
để tồn tại trong toàn bộ chuỗi lệnh. Có nhiều cách để giải quyết vấn đề này; ở đây bạn mở một quy trình shell bổ sung với các quyền sudo sh -c
bằng cách sử dụng sudo sh -c
.
Bây giờ, hãy sử dụng lại pfctl
để xác minh các luật này đang hoạt động:
- sudo pfctl -a rogue_hosts -s rules
Điều này sẽ tạo ra kết quả sau:
Outputblock return out quick on egress inet from 192.168.47.4 to any
Việc sử dụng mỏ neo hoàn toàn mang tính tình huống và thường mang tính chủ quan. Giống như bất kỳ tính năng nào khác, có ưu và nhược điểm khi sử dụng neo. Một số ứng dụng như giao diện danh sách đen có neo theo thiết kế. Tiếp theo, bạn sẽ tập trung vào việc ghi log bằng PF, đây là một khía cạnh quan trọng của bảo mật mạng. Tường lửa của bạn không hữu ích nếu bạn không thể thấy nó đang làm gì.
Bước 7 - Ghi log hoạt động firewall của bạn
Trong bước này, bạn sẽ làm việc với ghi log PF, được quản lý bởi một giao diện giả có tên pflog
. Ghi log được bật tại thời điểm khởi động bằng cách thêm pflog_enabled=YES
vào file /etc/rc.conf
mà bạn đã thực hiện ở Bước 2. Điều này cho phép trình pflogd hiển thị giao diện có tên pflog0
và ghi log ở định dạng binary vào file có tên /var/log/pflog
. Nhật ký có thể được phân tích cú pháp trong thời gian thực từ giao diện hoặc đọc từ file /var/log/pflog
bằng tiện ích tcpdump (8) .
Trước tiên, hãy truy cập một số log từ file /var/log/pflog
:
- sudo tcpdump -ner /var/log/pflog
Bạn chuyển các cờ -ner
định dạng kết quả để dễ đọc và cũng chỉ định một file để đọc từ đó, trong trường hợp của bạn là /var/log/pflog
.
Bạn sẽ thấy kết quả sau:
Outputreading from file /var/log/pflog, link-type PFLOG (OpenBSD pflog file)
Trong các giai đoạn đầu này có thể không có bất kỳ dữ liệu nào trong file /var/log/pflog
. Trong một khoảng thời gian ngắn, file log sẽ bắt đầu phát triển.
Bạn cũng có thể xem log trong thời gian thực từ giao diện pflog0
bằng cách sử dụng lệnh sau:
- sudo tcpdump -nei pflog0
Bạn chuyển các cờ -nei
, cũng định dạng kết quả để có thể đọc được, nhưng lần này chỉ định một giao diện, trong trường hợp của bạn là pflog0
.
Bạn sẽ thấy kết quả sau:
Outputtcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pflog0, link-type PFLOG (OpenBSD pflog file), capture size 262144 bytes
Đến đây bạn sẽ thấy các kết nối trong thời gian thực. Nếu có thể, hãy ping server của bạn từ một máy từ xa và bạn sẽ thấy các kết nối đang diễn ra. Server sẽ vẫn ở trạng thái này cho đến khi bạn thoát ra khỏi nó.
Để thoát khỏi trạng thái này và quay lại dòng lệnh, nhấn CTRL + Z
Có rất nhiều thông tin trên internet về tcpdump (8) , bao gồm cả trang web chính thức.
Truy cập file log bằng pftop
Tiện ích pftop
là một công cụ để xem nhanh hoạt động của firewall trong thời gian thực. Tên của nó bị ảnh hưởng bởi tiện ích top
Unix nổi tiếng.
Để sử dụng nó, bạn cần cài đặt gói pftop
:
- sudo pkg install pftop
Bây giờ chạy binary pftop
:
- sudo pftop
Điều này sẽ tạo ra kết quả sau (các IP của bạn sẽ khác nhau):
OutputPR DIR SRC DEST STATE AGE EXP PKTS BYTES tcp In 251.155.237.90:27537 157.225.173.58:22 ESTABLISHED:ESTABLISHED 00:12:35 23:59:55 1890 265K tcp In 222.186.42.15:25884 157.225.173.58:22 TIME_WAIT:TIME_WAIT 00:01:25 00:00:06 22 3801 udp Out 157.245.171.59:4699 67.203.62.5:53 MULTIPLE:SINGLE 00:00:14 00:00:16 2 227
Tạo giao diện log bổ sung
Giống như bất kỳ giao diện nào khác, nhiều giao diện log có thể được tạo và đặt tên bằng file /etc/hostname
. Bạn có thể thấy điều này hữu ích cho các mục đích tổ chức, chẳng hạn như nếu bạn muốn ghi log một số loại hoạt động riêng biệt.
Tạo giao diện ghi log bổ sung có tên pflog1
:
- sudo vi /etc/hostname.pflog1
Thêm nội dung sau vào file /etc/hostname.pflog1
:
up
Bây giờ hãy bật thiết bị tại thời điểm khởi động trong file /etc/rc.conf
của bạn:
- sudo sysrc pflog1_enable="YES"
Đến đây bạn có thể theo dõi và ghi log hoạt động firewall của bạn . Điều này cho phép bạn xem ai đang tạo kết nối với server của bạn và các loại kết nối đang được thực hiện.
Trong suốt hướng dẫn này, bạn đã kết hợp một số khái niệm nâng cao vào bộ luật PF của bạn . Bạn chỉ cần triển khai các tính năng nâng cao khi cần. Điều đó nói rằng, trong bước tiếp theo, bạn sẽ quay trở lại bộ luật cơ sở.
Bước 8 - Hoàn nguyên về Bộ luật cơ bản của bạn
Trong phần cuối cùng này, bạn sẽ hoàn nguyên về bộ luật cơ sở của bạn . Đây là một bước nhanh chóng sẽ đưa bạn trở lại trạng thái tối giản của chức năng.
Mở bộ luật cơ sở bằng lệnh sau:
- sudo vi /etc/pf.conf
Xóa bộ luật hiện tại trong file của bạn và thay thế nó bằng bộ luật cơ sở sau:
vtnet0 = "vtnet0" icmp_types = "{ echoreq unreach }" table <bruteforce> persist table <rfc6890> { 0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 169.254.0.0/16 \ 172.16.0.0/12 192.0.0.0/24 192.0.0.0/29 192.0.2.0/24 192.88.99.0/24 \ 192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 \ 240.0.0.0/4 255.255.255.255/32 } set skip on lo0 scrub in all fragment reassemble max-mss 1440 antispoof quick for $vtnet0 block in quick on $vtnet0 from <rfc6890> block return out quick on egress to <rfc6890> block all pass in on $vtnet0 proto tcp to port { 22 } \ keep state (max-src-conn 15, max-src-conn-rate 3/1, \ overload <bruteforce> flush global) pass out proto { tcp udp } to port { 22 53 80 123 443 } pass inet proto icmp icmp-type $icmp_types
Lưu và thoát khỏi file .
Reload bộ luật :
- sudo pfctl -f /etc/pf.conf
Nếu không có lỗi nào từ lệnh, thì không có lỗi nào trong bộ luật của bạn và firewall của bạn đang hoạt động bình thường.
Bạn cũng cần tắt giao diện pflog1
mà bạn đã tạo. Vì bạn có thể không biết mình có cần nó hay không, bạn có thể tắt pflog1
bằng tiện ích sysrc
:
- sudo sysrc pflog1_enable="NO"
Bây giờ, hãy xóa file /etc/hostname.pflog1
khỏi folder /etc
:
- sudo rm /etc/hostname.pflog1
Trước khi đăng xuất, hãy khởi động lại server đảm bảo rằng tất cả các thay đổi đều hoạt động và liên tục:
- sudo reboot
Chờ một vài phút trước khi đăng nhập vào server của bạn.
Theo tùy chọn, nếu bạn muốn triển khai PF với web server , sau đây là bộ luật cho trường hợp này. Bộ luật này là điểm khởi đầu đủ cho hầu hết các ứng dụng web.
vtnet0 = "vtnet0" icmp_types = "{ echoreq unreach }" table <bruteforce> persist table <webcrawlers> persist table <rfc6890> { 0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 169.254.0.0/16 \ 172.16.0.0/12 192.0.0.0/24 192.0.0.0/29 192.0.2.0/24 192.88.99.0/24 \ 192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 \ 240.0.0.0/4 255.255.255.255/32 } set skip on lo0 scrub in all fragment reassemble max-mss 1440 antispoof quick for $vtnet0 block in quick on $vtnet0 from <rfc6890> block return out quick on egress to <rfc6890> block all pass in on $vtnet0 proto tcp to port { 22 } \ keep state (max-src-conn 15, max-src-conn-rate 3/1, \ overload <bruteforce> flush global) pass in on $vtnet0 proto tcp to port { 80 443 } \ keep state (max-src-conn 45, max-src-conn-rate 9/1, \ overload <webcrawlers> flush global) pass out proto { tcp udp } to port { 22 53 80 123 443 } pass inet proto icmp icmp-type $icmp_types
Điều này tạo ra một bảng quá tải có tên <webcrawlers>
, có policy quá tải tự do hơn so với cổng SSH của bạn dựa trên các giá trị của max-src-conn 45
và max-src-conn-rate
. Điều này là do không phải tất cả quá tải đều do các tác nhân xấu. Chúng cũng có thể bắt nguồn từ các netbots không độc hại, vì vậy bạn tránh các biện pháp bảo mật quá mức trên các cổng 80
và 443
. Nếu bạn quyết định triển khai bộ luật web server , bạn cần thêm bảng <webcrawlers>
vào /etc/pf.conf
và xóa IP khỏi bảng theo định kỳ. Tham khảo Bước 5 để biết điều này.
Kết luận
Trong hướng dẫn này, bạn đã cấu hình PF trên FreeBSD 12.1. Đến đây bạn có một bộ luật cơ bản có thể dùng làm điểm khởi đầu cho tất cả các dự án FreeBSD của bạn. Để biết thêm thông tin về PF, hãy xem các trang pf.conf (5) .
Truy cập trang chủ đề FreeBSD của ta để biết thêm các hướng dẫn và Q&A.
Các tin liên quan