【问题标题】:Linux Bash: Setting iptables rules to allow both active and passive FTPLinux Bash:设置 iptables 规则以允许主动和被动 FTP
【发布时间】:2012-05-11 03:43:55
【问题描述】:

我有一台安装了 FTP 服务器的 PC。我想设置 iptables 规则以允许主动和被动 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

【问题讨论】:

    标签: linux bash ftp iptables


    【解决方案1】:

    根据您的问题,我想您有一些普通主机,其中包含一些常见的应用程序,例如 Web 浏览器、邮件客户端,可能是 telnet 和|或 ssh-client,也可能是 ftp-client,可能是一些 IM 等。并且让所有这些应用程序正常工作,您还需要允许此主机上的 FTP 服务器以主动和被动模式为将连接的客户端工作。 以下是适用于这种情况的 3 条规则。通用规则块是适用于大多数客户端主机的极简规则集。 接下来是 ftp-client 的规则块,如果您的主机上有这样的规则。 ftp-client 的规则与其他客户端的规则略有不同:始终有两个连接来启用数据传输:ftp-control(端口 21)和 ftp-data(主动模式下的端口 20 或被动模式下的随机端口)。您很可能永远不需要主动模式的客户端规则,因为被动模式是 NATed 网络的唯一选择。

    FTP服务器的规则在最后一块。

    请检查内核中是否有 ip_conntrack_ftp(可能命名为 nf_conntrack_ftp):

    > lsmod | grep conn
    

    如果您没有此内核模块,“相关”规则将不起作用 并且,最有可能的是,单独的 ftp 数据连接将不会启动,而 主 ftp 控制连接将在“PORT”命令后挂起。 在这种情况下,您仍然可以强制执行 ftp 数据连接,但代价是降低了调整后的规则提供的安全性。调整在规则之前的 cmets 中。

    专业版

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

    【讨论】:

      【解决方案2】:

      该代码仅允许传入和传出 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 之外的所有传入流量。

      【讨论】:

      • 输入应该是新的,已建立的。不是输出。
      • 感谢您的更正。固定的。我只是把它打了出来,并没有多看一眼。
      【解决方案3】:

      需要在 # Allow FTP connections @ port 21 部分中翻转 INPUT 和 OUTPUT 行的参数,否则新的(活动的)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
      

      【讨论】:

        【解决方案4】:

        请参考本站说明: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.
        

        【讨论】:

          【解决方案5】:

          我在上面的脚本中发现了一个很大的错误!

          规则打错了,应该是这样的:

          $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 换个地方!你要去一个目的地,如果你连接到一个服务器,源端口是动态的并且是客户端特定的,并且不知道但是连接已经建立了!

          恕我直言,第二行完全不明确,因为您不知道服务器端客户端将使用哪些端口来建立 ftp 连接。如果出站流量被默认阻止,最好是这样的规则:

          $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
          

          位于规则集之上。

          问候

          马库斯

          【讨论】:

            猜你喜欢
            • 2014-12-26
            • 1970-01-01
            • 2014-12-21
            • 2021-01-13
            • 1970-01-01
            • 1970-01-01
            • 2013-04-09
            • 2010-10-15
            • 2013-05-06
            相关资源
            最近更新 更多