PDA

View Full Version : Mời thảo luận : Vấn đề về FTP over firewall.



ppp
08-03-2004, 11:27 AM
Mình chưa hiểu về vấn đề này lắm , bạn nào có thể viết một bài về các vấn đề này không ?

Thanks ,

08-03-2004, 05:23 PM
FTP là 1 giao thức được xây dựng dựa trên chuẩn TCP, sử dụng 2 port : 20 (data port) và 21 (command port) hoạt động ở chế độ active hay passive.

1. Active Mode:
Sơ đồ kết nối:
SERVER.....................................CLIENT
20(data)-21(cmd)......................1026(cmd)-1027(data)
..|............|<----------(1)-------------|..............|
..|............|----------(2)------------->|..............|
..|----------------------(3)------------------------>|
..|<---------------------(4)-------------------------|

Bước 1: Ở chế độ active, FTP client dùng 1 port ngẫu nhiên 1026 (N>1024) kết nối vào port 21 của FTP server.
B2: Server gửi xác nhận ACK về cmd port của client
B3: Server khởi tạo kết nối từ port 21 của mình đến port N+1 (data port) của client
B4: , FTP client lắng nghe trên port N+1 và gửi ACK phản hồi cho server.

Ở khía cạnh firewall, để FTP server hỗ trợ chế độ active cần phải mở và cho phép các port sau:
- Port 21 phải được mở cho bất cứ nguồn gửi nào (để client khởi tạo kết nối)
- Open FTP server's port 21 to ports>1024 (server trả lời về cổng cmd của client)
- Cho kết nối từ port 20 của FTP server đến các port >1024 (server khởi tạo kết nối vào data port của client).
- Nhận kết nối hướng đến port 20 của FTP server từ các ports>1024 (client gửi ACK đến data port của server).

...
Cheers,

Saigon,Vietnam
08-03-2004, 06:11 PM
Dưới dây là note về FTP cho CIT (642-831):


FTP uses two or more TCP connections to accomplish data transfers. To start a session, the FTP client opens a TCP connection to port 21 on the FTP server. This connection is called the control connection and is used to pass commands and results between the client and the server. No data, such as file transfers or directory listings, is passed over the control connection; instead, data is transferred over a separate TCP connection created specifically to fulfill that request.

This data connection can be opened in several different ways:
• Traditional (or active)—The FTP server opens a TCP connection back to the client's port 20. This method will not work on a multiuser system because many users may make simultaneous FTP requests, and the system will not be capable of matching incoming FTP data connections to the appropriate user.
• Multiuser traditional (or active)—The FTP client instructs the FTP server to open a connection on some random port in the range 1024 through 65535. This method creates a rather large security hole because it requires system administrators to permit inbound TCP connections to all ports greater than 1023. Although firewalls that monitor FTP traffic and dynamically allow inbound connections help close this security hole, many corporate networks do not permit this type of traffic. Most command-line FTP clients default to this method of transfer and offer a passive command (or something similar) to switch to passive mode.
• Passive mode—The FTP client instructs the FTP server that it wants a passive connection, and the server replies with an IP address and port number to which the FTP client can open a TCP data connection. This method is by far the most secure because it requires no inbound TCP connections to the FTP client. Many corporate networks permit only this type of FTP transfer. Although most of the popular web browsers default to this method of FTP transfer, you shouldn't assume that they do.

Nói về implement FTP thru firewalls, như note trên dã dẫn active mode clients dòi hỏi firewalls phải mở toang cửa trên cac tcp ports!
Do dó nếu firewalls có support stateful feature, ta dùng passive mode trên clients. Làm thế firewalls sẽ nhận ra dược data connection related với initial data connection cua ftp server mà không cần mở các ports không cần thiết!


Cheers,

09-03-2004, 01:17 PM
Yeah, như anh SGVN đã nói, ở active mode, firewall thường chặn các port này.

Vì rõ ràng ở mode này client chỉ thông báo nó đang lắng nghe ở port nào và server phải kết nối ngược về client ở port đó.

Để giải quyết vấn đề server phải tạo kết nối đến client, ta dùng passive mode.

2. Passive Mode:

Sơ đồ kết nối:
SERVER.....................................CLIENT

20-2024-21(cmd)......................1026(cmd)-1027(data)
..|.....|......|<----------(1)-------------|..............|
..|.....|......|----------(2)------------->|..............|
..|.....|<-----------------(3)------------------------|
..|.....|------------------(4)----------------------->|

B1: Client kết nối vào cmd port của server và phát lệnh PASV
B2: Server trả lời và mở 1 port bất kỳ p (p>1024) và gửi lệnh PORT P thông báo lại cho client
B3: Client tạo kết nối từ cổng N+1 với port P để truyền dữ liệu
B4: Server trả lời bằng xác nhận ACKvề cho data port của client


Trên quan điểm firewall, để FTP server hỗ trợ chế độ passive cần phải mở và cho phép các port sau:

- Port 21 phải được mở cho bất cứ nguồn gửi nào (để client khởi tạo kết nối)
- Cho phép trả lời từ port 21 của server đến port bất kỳ >1024(server trả lời về cổng cmd của client)
- Nhận kết nối trên cổng P>1024 trên ftp server từ bất kỳ nguồn nào (client tạo kết nối để truyền dữ liệu đến port mà server đã chỉ ra).
- Cho phép trả lời từ port>1024 (trên server) đến port >1024 (server gửi xác nhận ACK đến cmd port của client).

Anything else involved?

ppp
09-03-2004, 02:49 PM
Cám ơn bài viết rất hay của anh support và anh SaiGon,Vietnam .

cheers,

itmansaigon
23-06-2004, 05:58 PM
Xin chào,

Đối với các loại firewall sử dụng công nghệ stateful inspection như CheckPoint, Cisco PIX, Netscreen... thì không cần phải khai báo chi tiết như vậy, chỉ cần cho một rule từ bên ngoài thấy port 21 của FTP server là xong, mọi chuyện còn lại là của chú firewall take care of, nếu firewall "nghe" được kết nối là ACTIVE thì nó sẽ tự động open port 20/TCP từ trong ra, ngược lại nếu lại "nghe" được thỏa thuận là PASSIVE thì nó cũng sẽ open các high port TCP cần thiết để ftp client từ bên ngoài kết nôi vào. Sau khi tiến trình chuyển giao data kết thúc thì cái chú stateful inspection firewall thông minh này cũng tự động close các high port TCP lại.
Như thế mới gọi là STATEFUL INSPECTION FIREWALL.

P.S. Đối với các Linux Gurus cũng có thể dùng IPTABLES để hiểu được các kết nối dạng này.

ninhhn
24-06-2004, 01:41 PM
Chào mọi người,
Gói tin của chúng ta đi sẽ có thể phải qua firewall, rồi tiếp sau là router để gửi ra ngoài. Ở đây tui thấy mọi người nói đến CheckPoint, Cisco PIX, Netscreen.... thế lỡ may bị chặn do ACL tại router thì sao, thế nên chúng ta nên cần chú ý thêm cả ACL, và khi nói đến ACL đối với các loại kết nối kiểu TCP thì từ khoá "establish" là không thể thiếu. Thôi nhé, tui dừng ở đây nếu không thì "Nói dài, nói dai -->nói dại"

myquartz
27-06-2004, 06:11 PM
Xin chào,
Đối với các loại firewall sử dụng công nghệ stateful inspection như CheckPoint, Cisco PIX, Netscreen... thì không cần phải khai báo chi tiết như vậy, chỉ cần cho một rule từ bên ngoài thấy port 21 của FTP server là xong, mọi chuyện còn lại là của chú firewall take care of, nếu firewall "nghe" được kết nối là ACTIVE thì nó sẽ tự động open port 20/TCP từ trong ra, ngược lại nếu lại "nghe" được thỏa thuận là PASSIVE thì nó cũng sẽ open các high port TCP cần thiết để ftp client từ bên ngoài kết nôi vào. Sau khi tiến trình chuyển giao data kết thúc thì cái chú stateful inspection firewall thông minh này cũng tự động close các high port TCP lại.

Xin bổ xung thêm tí: điều này chỉ đúng khi mà FTP server bên trong có địa chỉ IP public (thường nằm trong DMZ), chứ FTP Server hoạt động ở chế độ PASSIVE mà nằm sau NAT Firewall thì phức tạp hơn nhiều và đôi khi là không thể thực hiện được.

itmansaigon
27-06-2004, 07:19 PM
Hello myquartz,

Thế myquartz gặp trở ngại ở điểm nào mà không thể thực hiện được? có thể trình bày chi tiết hơn được không?

myquartz
28-06-2004, 06:09 PM
Hello myquartz,

Thế myquartz gặp trở ngại ở điểm nào mà không thể thực hiện được? có thể trình bày chi tiết hơn được không?

Ờ, nếu cần đi tới tận cùng thì ta cũng xét tiếp:

Trở ngại bởi chính giao thức FTP không cho phép làm điều đó. Có thể mô tả như thế này:
+ Tôi có 1 NAT Firewall 2 NIC, 1 là Public IP (giả sử 203.162.1.1 chẳng hạn), 2 là 1 private IP nối với LAN.
+ FTP Server đặt trong LAN và lấy địa chỉ private (giả sử là 192.168.1.1 chẳng hạn).

Bình thường, với hầu hết các giao thức khác, giả sử HTTP chỉ cần mở một Port Forwarding (hay gọi là DNAT) sao cho mọi connection tới 203.162.1.1:80 được chuyển thành 192.168.1.1:80, thế là mọi connection từ Internet tới 203.162.1.1 với dịch vụ HTTP có thể vươn tới cái server trong nội bộ đang mở cổng 80 kia được ngay.

Tôi giả sử tôi mở cổng với FTP: 203.162.1.1:21 => 192.168.1.1:21. Cứ giả sử rằng firewall rất thông minh, nó có khả năng tracking mỗi FTP session và mở thêm các cổng cần thiết và chuyển tới FTP Server.
- Trong trường hợp FTP client yêu cầu ACTIVE, có nghĩa là FTP server sẽ connect tới client theo ip/port chỉ định, điều này hoàn toàn không có vấn đề gì vì Firewall biết phải làm gì với kết nối xuất phát từ port 20 tới một port dynamic ở ngoài.
- Trong trường hợp FTP data là PASSIVE, lúc này FTP server sẽ phải mở cổng và bảo cho client ip/port để client connect tới. Vậy đó đó là IP/PORT nào? FTP Server đang listen trên NIC có IP private, nếu bảo cho client IP thì điều đó là vô nghĩa. Còn nếu như NAT Firewall đọc được thông số này khi FTP server gửi cho client, nó cũng không thể thay đổi IP đó thành public IP nó đang có bởi vì giá trị này không phải là trường trong IP header mà nằm trong phần Data của TCP packet, mà lại là dạng text, không có độ dài theo byte cố định, sẽ không thể thay đổi dễ dàng như trường địa chỉ IP 4 byte ở IP header được.
Ta cứ giả sử nếu như NAT firewall vẫn cứ thay đổi IP/port mà FTP Server gửi đi, có nghĩa là nó sẽ phải thay đổi phần data của TCP packet, điều này đồng nghĩa với việc nó sẽ phải giải quyết các vấn đề như số sequence của TCP connection có thể sẽ bị thay đổi khi qua firewall (không kể checksum, cái này đơn giản) và điều đó là cực kỳ phức tạp (tôi chưa thấy thằng firewall nào làm được).
Giải pháp thứ nữa là FTP Server ở chế độ PASSIVE sẽ không bảo cho client địa chỉ trong của nó, mà bảo client địa chỉ IP/port public cảu Firewall (ta cứ giả định rằng FTP Server biết được public IP của firewall đi), đồng thời firewall sẽ "thông minh" nhận ra yêu cầu này và tự mở port cho FTP Server. Nhưng nếu như, Firewall đang dùng port đó cho một session khác thì sao? Ở một số điều kiện cụ thể thì điều này có thể làm được, nhưng liệu đã có một FTP Server/NAT Firewall nào hỗ trợ kiểu này không nhỉ?

Do vậy, FTP gần như không thể hoạt động behind NAT Firewall được, dù cái NAT firewall đó có statefull inspection cực thông minh đi nữa. Mà chẳng phải chỉ FTP, cả H323, Oracle NET Listener cũng nằm trong dạng này.

itmansaigon
28-06-2004, 11:38 PM
Hi myquartz,

Rất vui vì có người để bàn luận sâu hơn về vấn đề này. Mình cũng đưa ra những ý kiến sau đây:

Các thiết bị như router hay firewall thì việc thay đổi lại các sequence number khi các packet đi qua nó để tăng cường khả năng bảo mật cho các hosts nằm bên trong đều thực hiện được, ngay cả việc tính toán lại checksum data đối với các stateful inspection firewall cũng đã được implemented từ lâu, việc các stateful inspection firewall có thể nhìn vào content của các packet để có thể block được các luồng data hiểm độc từ bên ngoài nhằm cố gắng để lấy shell vào các web services hay SMTP services cũng đã thực hiện được, tôi lấy ví dụ về chức năng smartdefense của CheckPoint có thể ngăn chặn được các cố gắng từ bên ngoài tác động lên port 80 với ý đồ nhắm chạy "cmd.exe" hoặc các code hiểm độc tương tự...

Trở lại vấn đề passive ftp server nằm sau NAT gateway đều thực hiện được dễ dàng đối với các firewall như sau: PIX, Netscreen, CheckPoint và ngay cả đối cái nhẹ ký hơn là Linux IPtables cũng đều OK (Trên PIX nhớ khai báo stateful cho ftp bằng fixup protocol ftp và trên IPTables nhớ load hai module ip_contrack_ftp và ip_nat_ftp lên)

Mình cũng thắc mắc là myquartz đã config trên firewall loại gì mà lại không work vậy?

myquartz
29-06-2004, 02:11 AM
Ồ! bạn itmansaigon cũng thuộc loại pro trên diễn đàn này, xin khâm phục trước.
Mình nhắc lại là mình không nói "không thể", mà là "khó" thực hiện được theo cách thông thường.
Xin lỗi là do lâu không cập nhật công nghệ, sau khi rà lại tài liệu, thấy cũng có một số điểm chưa chính xác ở bài trước, bài này xin bổ sung và sửa chữa:
- Ở cái giải pháp để mặc cho FTP Server ở chế độ passive (hoặc FTP client ở chế độ active) gửi ip/port cho phía bên kia theo đúng private ip của nó, Firewall sẽ thay đổi dữ liệu trên nó (cộng với checksum, sequence...). Firewall phải có khả năng mà Cisco gọi là ALG (Application Level Gateway) hay với Linux là các contrack như bạn đã nói. Tuy nhiên không phải cái này lúc nào cũng work (mình đọc các tài liệu của Linux, Cisco, họ đều nói rằng should work cả), nhất là khi FTP Server không listen trên port 21 chuẩn và nếu như là NAT Balancing Firewall (đa số các protocol khác không gặp trở ngại này). Và một điểm bạn nói chưa chính xác lắm: Firewall có khả năng này được coi là *hơn* mức stateful inspection bởi nó có cả khả năng của Application Level Firewall (mà PIX, Netscreen hay CheckPoint là những thứ cao cấp, Linux thì với nhân 2.4/netfilter trở lên mới có), một stateful inspection firewall đơn thuần sẽ bó tay với trường hợp này. Đặc biệt, FTP over SSL sẽ hoàn toàn không hoạt động được.
- Cái giải pháp thứ 2, FTP Server/client sẽ gửi IP/port nằm trong một số giá trị định trước, đã được thiết lập trước cho NAT firewall sẽ forward một dải các port và biết được public IP của firewall. Giải pháp này được một số FTP Server/client hỗ trợ, nhưng sẽ gặp khó khăn nếu như bạn không có static public IP.

Trên đây chỉ là những kiến thức (tay trái) mà mình xin góp vào cái chủ đề này, nhằm làm rõ những khó khăn và các điểm nhấn mạnh khi bạn nào muốn sử dụng FTP over firewall. Mạn phép đưa ra điểm chốt là nếu bạn dùng FTP Client behind firewall thì nên để chế độ PASSIVE khi bạn không có public IP, nó sẽ hoạt động với hầu hết các loại firewall. Còn với FTP Server, có lẽ nếu có public IP sẽ tốt hơn và sẽ ít gặp phiền phức, tốn kém hơn.

Xin cảm ơn bạn itmansaigon đã góp ý, theo đuổi chủ đề giúp mình update kiến thức. Còn mình thì không phải dân config firewall chuyên nghiệp, cũng bỏ làm lâu rồi và cũng chưa có dịp tiếp xúc với nhiều loại mắc tiền như trên (trừ Linux). Mình xin ngừng tiếp nối chủ đề này bởi nó đã quá đủ thông tin rồi.
Byebye.

Tài liệu tham khảo:
http://www.cisco.com/en/US/about/ac123/ac147/ac174/ac182/about_cisco_ipj_archive_article09186a00800c83ec.ht ml
http://www.netfilter.org

tirem
29-06-2004, 03:24 AM
Đồng ý với bác itman.. là có thể làm được. Làm được anh quart ạ. Nhưng em cũng xin sửa một tí

1. Nếu bản thân FTP Servercung cấp port động - Passive mode, thì trong trường hợp này, không nên dùng Hide NAT (hay còn gọi là dynamic NAT, NATP,....), vì cơ sở định tuyến không còn, nếu không, phải config thêm định tuyến, có thể sửa đổi arp.

2. Nếu dùng Static NAT, FTP server được mã hoá địa chỉ tĩnh ra ngoài, thì anyway tất cả các session đều được xử lý. Bác yên tâm chỉ cần mở 2 cổng 20 và 21 ra thôi.

3. Application Intelligence trong trường hợp này được thể hiện
- Haphazious command, sử dụng command trong các kết nối, Stateful firewall sẽ kiểm tra và loại bỏ các command không cần thiết như VRFY,...
- Dùng với CVP có thể quét virus, worm,
- Ngăn chặn FTP Bounce attack
- Data connection dùng các wellknown port, như port 80, là không được phép
- Trên đường truyền dữ liệu, bidirection traffic là không được phép