Chuyển tiếp FTP với IPTables


9

Tôi đang cố gắng chuyển tiếp một máy chủ FTP có IPTables. FTP-Server đang chạy trên hộp Windows 2008 (Cerberus).

Hình ảnh

Chi tiết Hộp Win:

  • IP: 192.168.220.51
  • Cổng FTP: 21
  • Cổng PASV: 11000-13000

Máy chủ FTP hoạt động tốt trong mạng LAN.

Bộ định tuyến đang hoạt động tốt cho các máy khách khác (Phục vụ NAT, DHCP, Tường lửa, ...). Tôi cần chuyển tiếp dịch vụ FTP ra thế giới bên ngoài, nhưng tôi không thể sử dụng các cổng 20-21 (đã được sử dụng).

Tôi đã thử điều này, nhưng nó không hoạt động:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Cấu hình IPTables hiện tại:

[root@router ~]# service iptables status
Table: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           
2    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  127.0.0.1            0.0.0.0/0           
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
10   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
11   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 
12   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
13   ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
14   DROP       udp  --  0.0.0.0/0            0.0.0.0/0           
15   DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời :-).

Bounty-Edit : Tôi chưa thể tìm ra điều này, bất kỳ trợ giúp sẽ được đánh giá rất cao.

EDIT2

Bây giờ tôi có thể telnet vào máy chủ FTP của mình, sau khi chạy các lệnh:

modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Tôi đang bắt đầu đến đó ... Tôi nghĩ rằng tôi chỉ cần làm cho các Cổng PASV của tôi hoạt động ngay bây giờ ...

EDIT3: Thông tin thêm

[root@router ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 3251 packets, 154K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  540 48534 ACCEPT     all  --  *      *       127.0.0.1            0.0.0.0/0           
4270K 5625M ACCEPT     all  --  *      *       192.168.220.0/24     0.0.0.0/0           
    0     0 DROP       all  --  eth1   *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
   65  8487 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
    8   404 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
63870   81M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
  974  224K DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           
  638 34956 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT 3578K packets, 3355M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 2275K packets, 703M bytes)
 pkts bytes target     prot opt in     out     source               destination  



[root@router ~]# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 33954 packets, 2595K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2121 to:192.168.220.51:21 

Chain POSTROUTING (policy ACCEPT 5925 packets, 699K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      eth1    0.0.0.0/0            0.0.0.0/0           
27170 1785K MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 5777 packets, 457K bytes)
 pkts bytes target     prot opt in     out     source               destination  

Giải pháp

Đây là cách tôi đã làm nó, có thể không đẹp lắm, nhưng nó hoạt động.

[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 11000:13000 -j DNAT --to 192.168.220.51:11000-13000
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 11000:13000 -j ACCEPT

Một số lưu ý thêm: Máy chủ FTP đang nghe trên bot 21 và 2121 và phạm vi PASV được đặt từ 11000 đến 13000


Các mô-đun hạt nhân ftp conntrack & nat đã được tải chưa? Đầu ra của là lsmod | grep -i ftpgì?
Steven Thứ Hai

Trống rỗng, tôi không tải bất kỳ mô-đun hạt nhân bổ sung. Tôi có cần một ít không?
Bart De Vos

1
@TiZon: Vâng. Iptables cần các mô đun conntrack để theo dõi số cổng và địa chỉ mà FTP sử dụng trong các lệnh PASV và PORT. Ngoài ra, khi bạn đang thực hiện NAT, các mô-đun NAT là cần thiết để viết lại số cổng và địa chỉ cổng để giao thức FTP có thể hoạt động chính xác.
Steven Thứ Hai

2
+1 để giải thích tốt và đầy đủ.
Gopoi

3
@TiZon: như Steven Monai đã đề cập, để FTP hoạt động chính xác sau cổng NAT, bạn sẽ cần ip_conntrack_ftpip_nat_ftpcác mô-đun hạt nhân được tải. FTP là một giao thức thú vị phải xử lý đằng sau cổng tường lửa / NAT. Bạn có thể thấy dễ dàng hơn khi chỉ sử dụng sftp (SSH FTP) chỉ sử dụng cổng 22 và được mã hóa (an toàn hơn rất nhiều). FileZilla là một ứng dụng FTP miễn phí tuyệt vời hỗ trợ SFTP.
Sean C.

Câu trả lời:


7

Để có được hỗ trợ thụ động hoạt động, bạn sẽ cần chuyển tiếp các cổng thụ động đến máy chủ ftp nội bộ có cùng số cổng .

Giải pháp dễ dàng: chuyển tiếp tất cả chúng mọi lúc

InternetIP: 11000-13000 -> 192.168.220.51:11000-13000

Giải pháp khó hơn:

Bạn sẽ cần một số tác nhân theo dõi kết nối có mục đích đặc biệt để đọc giao thức FTP và thực hiện các ánh xạ NAT đúng lúc. Có vẻ như ip_conntrack_ftp có thể làm điều này.


Tôi đã làm nó như thế này. Tôi vĩnh viễn chuyển tiếp tất cả các cổng. Nó có thể không phải là giải pháp tốt nhất, nhưng nó hoạt động. Bài viết đầu tiên được chỉnh sửa với howto.
Bart De Vos


0
iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
modprobe nf_conntrack_ftp 
modprobe nf_nat_ftp

nên là đủ


Không nên 2121thay thế số cổng bằng 21? Làm thế nào để các mô-đun ftp nhận ra một kết nối là điều khiển ftp? Nó sẽ được áp dụng cho mọi kết nối bằng cổng 21 trước hay sau NAT?
kasperd

Một số lời giải thích sẽ rất hay, vì vậy chúng tôi biết rằng bạn không chỉ là người chuyên chở câu trả lời
Tom O'Connor

Bạn chọn cổng nguồn nào để chuyển tiếp cổng đích. Nó có thể là bất kỳ phù hợp cho bạn. Nó sẽ được áp dụng cho mọi kết nối tới cổng mà bạn chỉ định, trong trường hợp 2121 của chúng tôi, trong bảng "PREROUTING". Làm thế nào mô-đun ftp netfilter hoạt động, bạn có thể đọc ở đây en.wikipedia.org/wiki/Netfilter#Connection_tracking_helpers
Yalok Iy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.