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 ,
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 ,
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,
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,
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?
Cám ơn bài viết rất hay của anh support và anh SaiGon,Vietnam .
cheers,
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.
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"
Nếu bạn nghiêm túc với bản thân,
Cuộc đời sẽ dễ dàng hơn với bạn.
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.Originally Posted by itmansaigon
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:Originally Posted by itmansaigon
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.