2012-05-01 15 views
11

Tôi có một máy tính mà trên đó tôi đã cài đặt một máy chủ FTP. Tôi muốn thiết lập các quy tắc iptables để cho phép cả FTP hoạt động và thụ động. Tôi đã thử mã sau mà mọi người báo cáo đang hoạt động, nhưng có vẻ như chặn tất cả lưu lượng truy cập cho tôi (các trang sẽ không tải nữa ...)Linux Bash: Thiết lập các quy tắc iptables để cho phép cả FTP hoạt động và thụ động FTP

#!/bin/bash 

IPT=/sbin/iptables 
$IPT -F 
$IPT -X 
$IPT -t nat -F 
$IPT -t nat -X 
$IPT -t mangle -F 
$IPT -t mangle -X 
/sbin/modprobe ip_conntrack 
/sbin/modprobe ip_conntrack_ftp 

# Setting default filter policy 
$IPT -P INPUT DROP 
$IPT -P OUTPUT ACCEPT 

# Allow FTP connections @ port 21 
$IPT -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 

# Allow Active FTP Connections 
$IPT -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT 
$IPT -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT 

# Allow Passive FTP Connections 
$IPT -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT 
$IPT -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT 

Trả lời

5

Mã đó CHỈ cho phép kết nối FTP đến và đi. Nó không cho phép bất cứ thứ gì khác vào/ra.

$IPT -P INPUT DROP 

Thả tất cả lưu lượng truy cập đến. Vì vậy, nếu bạn bắt đầu với điều đó, bạn sẽ muốn cho phép lưu lượng truy cập vào bất kỳ dịch vụ nào khác mà bạn đang chạy mà bạn muốn cho phép.

$IPT -A INPUT -p tcp --sport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --dport 21 -m state --state ESTABLISHED -j ACCEPT 

Quy tắc này sẽ cho phép lưu lượng truy cập FTP đến.

Giải thích về tập lệnh này là gì, xóa tất cả các chuỗi IP Tables hiện có của bạn, sau đó thêm quy tắc để cho phép tất cả lưu lượng gửi đi và chặn tất cả lưu lượng truy cập đến ngoại trừ FTP.

+1

Cảng 80 cho FTP ?! – machineaddict

+0

INPUT phải MỚI, ĐƯỢC THÀNH LẬP. Không phải là OUTPUT. –

+0

Cảm ơn bạn đã sửa chữa. Đã sửa. Tôi chỉ cần gõ nó ra và không cho nó nhiều cái nhìn thứ hai. – hsanders

5

Đối số cho các đường INPUT và OUTPUT cần được lật trong phần # Cho phép kết nối FTP @ cổng 21 nếu không kết nối FTP (hoạt động) mới sẽ bị chặn.

# Allow FTP connections @ port 21 
$IPT -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 
6

Từ Câu hỏi của bạn tôi giả sử bạn có một số máy chủ tầm thường với bộ chung của các ứng dụng như trình duyệt web, mail của khách hàng, có thể telnet và | hoặc ssh-client, có thể là ftp-client quá, có thể một số IM vv Và có tất cả các ứng dụng này làm việc, Bạn muốn bổ sung cho phép một máy chủ FTP trên máy chủ này làm việc cả ở chế độ chủ động và thụ động cho các máy khách sẽ kết nối. Dưới đây là 3 quy tắc áp dụng trong trường hợp này. Chặn các quy tắc phổ biến là tập hợp các quy tắc tối giản áp dụng cho hầu hết các máy khách. Tiếp theo là khối quy tắc cho ftp-client, nếu bạn có trên máy chủ lưu trữ của bạn. Các quy tắc cho ftp-client hơi khác so với quy tắc cho các máy khách khác: luôn có hai kết nối để cho phép truyền dữ liệu: ftp-control (cổng 21) và ftp-data (cổng 20 trong chế độ Active hoặc cổng ngẫu nhiên trong chế độ Passive). Bạn có thể sẽ không bao giờ cần các quy tắc của client cho chế độ Active vì chế độ Passive là lựa chọn duy nhất cho các mạng NAT.

Quy tắc cho máy chủ FTP nằm trong khối cuối cùng.

Vui lòng kiểm tra Bạn có ip_conntrack_ftp (có thể được đặt tên nf_conntrack_ftp) trong kernel:

> lsmod | grep conn 

Nếu Bạn không có mô-đun hạt nhân này, các quy tắc của LIÊN QUAN 'sẽ không làm việc và, có lẽ hầu hết, riêng biệt Kết nối ftp-data sẽ không bắt đầu khi kết nối ftp-control chính sẽ treo ở đâu đó sau lệnh 'PORT'. Bạn vẫn có thể thực thi kết nối dữ liệu ftp trong trường hợp này, nhưng với chi phí bảo mật xuống cấp được cung cấp bởi các quy tắc được tinh chỉnh. Các tinh chỉnh nằm trong các nhận xét trước các quy tắc.

Pro

#!/bin/bash 
IPT=/sbin/iptables 

$IPT -F 
$IPT -t nat -F 
$IPT -t mangle -F 

$IPT -X 
$IPT -t nat -X 
$IPT -t mangle -X 

/sbin/modprobe ip_conntrack 
/sbin/modprobe ip_conntrack_ftp 

$IPT -P INPUT DROP 
$IPT -P FORWARD DROP 
$IPT -P OUTPUT DROP 

# Block of common rules ##################################################### 
$IPT -A OUTPUT -o lo -j ACCEPT 
$IPT -A INPUT -i lo -j ACCEPT 

$IPT -A OUTPUT -p icmp -j ACCEPT 
$IPT -A INPUT -p icmp -j ACCEPT 

# allow DNS queries and replies 
$IPT -A OUTPUT -p udp --dport 53 -j ACCEPT 
$IPT -A INPUT -p udp --sport 53 -j ACCEPT 

# allow all Your possible client applications to work 
$IPT -A OUTPUT -p tcp -m multiport --dports ssh,telnet,http,https,xmpp-client,aol,smtp,pop3,imap2,imap3 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
$IPT -A INPUT -p tcp -m multiport --sports ssh,telnet,http,https,xmpp-client,aol,smtp,pop3,imap2,imap3 -m state --state RELATED,ESTABLISHED -j ACCEPT 
# End of block of common rules ############################################## 


# If You have ftp-client too, this block of rules 
# will allow it to work with external ftp servers in both modes. 
# 
# First, allow ftp-control at client side: 
$IPT -A OUTPUT -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A INPUT -p tcp -m tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 
# 
# Then allow ftp-data Active Mode at client side: 
# Client accepts RELATED connection from server port 20 
# to client port number negotiated in ftp-control connection. 
# nf_conntrack_ftp is REQUIRED at client host 
# to pick up this client port number from payload of ftp-control packets, 
# otherwise You are forced to use 'NEW' instead of 'RELATED'. 
# And in the case of 'NEW' You allow connection to ANY port of Your host! 
$IPT -A INPUT -p tcp -m tcp --sport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp -m tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT 
# 
# Finally, allow ftp-data Passive Mode at client side: 
# Client starts RELATED connection from random own high port number 
# to server fixed high port number negotiated in ftp-control connection. 
# nf_conntrack_ftp is REQUIRED again at client host 
# to pick up this client port number from payload of ftp-control packets, 
# otherwise You are forced to use 'NEW' instead of 'RELATED' ! 
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT  

#######[ Block of rules needed for Local FTP Server ]####### 
# This block of rules allows clients to access Your FTP server at this host 
# either in Active or Passive mode. 
# You may need to enable Passive mode in FTP server config file, 
# e.g. with pasv_enable=yes in /etc/vsftpd.conf if vsftpd is Your choice. 
# 
# Ftp-control at server side: 
# (some example rules are given below just to show 
# how You can selectively restrict access to Your FTP server): 
$IPT -A INPUT -s 1.2.3.0/24 -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A INPUT -s 5.6.7.8/32 -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp -m tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 
# 
# Ftp-data Active Mode at server side: 
# Server starts RELATED connection from server port 20 
# to client port number negotiated in ftp-control connection. 
# nf_conntrack_ftp is REQUIRED to pick up this client port number 
# from payload of ftp-control packets, 
# otherwise You are forced to use 'NEW' instead of 'RELATED' ! 
$IPT -A OUTPUT -p tcp -m tcp --sport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT 
$IPT -A INPUT -p tcp -m tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT 
# 
# Ftp-data Passive Mode at server side: 
# Server accepts RELATED client connection from random client high port number 
# to own fixed high port number negotiated in ftp-control connection. 
# nf_conntrack_ftp is REQUIRED to pick up this own fixed high port number 
# from payload of ftp-control packets, 
# otherwise You are forced to use 'NEW' instead of 'RELATED'. 
# And in the case of 'NEW' You allow connection to ANY high port of Your server! 
$IPT -A INPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state RELATED,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT 
###### 
0

Tôi đã tìm thấy một sai lầm lớn trong kịch bản ở trên!

Các quy tắc được misstyped, nó phải là như thế:

$IPT -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 

$IPT -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT 
$IPT -A OUTPUT -p tcp --sport 20 -m state --state ESTABLISHED -j ACCEPT 

Dport và thay đổi Sport nơi! Bạn đang đi đến một điểm đến, nếu bạn kết nối với một máy chủ, cổng nguồn là động và clientide spefific và không được biết tuy nhiên một kết nối được thiết lập!

Imho dòng thứ hai là không có gì cả, vì bạn không biết cổng nào mà máy khách phía máy chủ sẽ sử dụng để thiết lập kết nối ftp. Tốt hơn sẽ là một quy tắc như vậy, nếu giao thông đối ngoại bị chặn bởi defalut:

$IPT -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
$IPT -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT 

Nhưng điều này chỉ cần thiết nếu các quy tắc

$IPT -P OUTPUT DROP 

là trên đầu trang của các quy tắc đề ra.

Greetings

Marcus

1

Tham khảo trang web này cho Giải thích: http://slacksite.com/other/ftp.html

FTP Client:

lsmod | grep ftp 
modprobe nf_conntrack_ftp  or modprobe ip_conntrack_ftp 
lsmod | grep ftp 
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT 
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 

FTP SERVER:

lsmod | grep ftp 
modprobe nf_conntrack_ftp  or modprobe ip_conntrack_ftp 
lsmod | grep ftp 
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT 
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 --sport 1024:-m conntrack --ctstate ESTABLISHED -j ACCEPT 
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED -j ACCEPT 

Để chuyển đổi giữa chế độ thụ động và tích cực trên các mặt hàng

ftp> passive 
Passive mode on. 
ftp> passive 
Passive mode off.