web-dev-qa-db-ja.com

Linux Bash:アクティブFTPとパッシブFTPの両方を許可するようにiptablesルールを設定する

FTPサーバーがインストールされているPCを持っています。アクティブFTPとパッシブFTPの両方を許可するようにiptablesルールを設定したいと思います。人々が機能していると報告する次のコードを試しましたが、すべてのトラフィックがブロックされているようです(ページがロードされなくなるなど)

#!/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
11
user573382

そのコードは、着信および発信FTP接続のみを許可します。それ以外の入出力は許可されません。

 $IPT -P INPUT DROP

すべての着信トラフィックをドロップします。したがって、それから始める場合は、実行している他のサービスへのトラフィックを有効にして、許可したいものにする必要があります。

 $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

このルールは、着信FTPトラフィックを許可します。

このスクリプトが何であるか/何をするかについての説明は、既存のすべてのIPテーブルチェーンを削除し、次にすべての発信トラフィックを許可し、FTPを除くすべての着信トラフィックをブロックするルールを追加することです。

5
hsanders

あなたの質問から、ウェブブラウザ、メールクライアント、telnetやssh-client、ftp-client、IMなどの一般的なアプリのセットを備えた簡単なホストがあると思います。これらのアプリは機能しています。このホストのFTPサーバーが、接続するクライアントのアクティブモードとパッシブモードの両方で機能することを許可する必要があります。この場合に適用できるルールの3つのブロックを次に示します。共通ルールのブロックは、ほとんどのクライアントホストに適用できる最小限のルールセットです。次は、ホストにftp-clientがある場合の、ftp-clientのルールのブロックです。 ftp-clientのルールは、他のクライアントのルールとは少し異なります。データ転送を有効にするには、ftp-control(ポート21)とftp-data(アクティブモードのポート20またはパッシブモードのランダムポート)の2つの接続が常にあります。パッシブモードはNATネットワークの単一の選択肢であるため、アクティブモードのクライアントルールはおそらく必要ありません。

FTPサーバーのルールは最後のブロックにあります。

カーネルにip_conntrack_ftp(nf_conntrack_ftpという名前の場合があります)があることを確認してください。

> lsmod | grep conn

このカーネルモジュールがない場合、「RELATED」ルールは機能せず、おそらく、プライマリftp-control接続が「PORT」コマンドの後にハングする間、個別のftp-data接続は開始されません。この場合でもftp-data接続を強制できますが、微調整されたルールによって提供されるセキュリティを低下させることになります。微調整は、ルールに先行するコメントにあります。

プロ

#!/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 
######
6
ab1965

INPUT行とOUTPUT行の引数は、#FTP接続を許可@ポート21セクションで反転する必要があります。そうしないと、新しい(アクティブな)FTP接続がブロックされます。

# 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
5
micah94

説明については、このサイトを参照してください: http://slacksite.com/other/ftp.html

FTPクライアント:

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サーバー:

 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 

クライアント側でパッシブモードとアクティブモードを切り替えるには

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

上記のスクリプトに大きな間違いを見つけました!

ルールの入力ミス。次のようになります。

$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とSportは場所を変えます!宛先に移動します。サーバーに接続すると、送信元ポートは動的でクライアント側に固有であり、接続が確立されているかどうかはわかりません。

2行目は不明確です。サーバー側クライアントがftp接続を確立するために使用するポートがわからないためです。アウトバウンドトラフィックが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

しかし、これはルールが

$IPT -P OUTPUT DROP

ルールセットの上にあります。

ご挨拶

マーカス

0
Marcus