Linux Bash: Setting iptables rules to allow both active and passive FTP

后端 未结 5 955
广开言路
广开言路 2021-02-04 10:57

I have a PC on which I have a FTP server installed. I want to set the iptables rules to allow both active and passive FTP. I\'ve tried the following code that people report is w

相关标签:
5条回答
  • 2021-02-04 11:23

    The arguments for the INPUT and OUTPUT lines need to be flipped in the # Allow FTP connections @ port 21 section otherwise new (active) FTP connections will be blocked.

    # 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
    
    0 讨论(0)
  • 2021-02-04 11:29

    Refer this site for Explanation: 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 
    

    To toggle between passive and active mode on the client side

     ftp> passive
     Passive mode on.
     ftp> passive
     Passive mode off.
    
    0 讨论(0)
  • 2021-02-04 11:32

    That code ONLY allows incoming and outgoing FTP connections. It doesn't allow anything else in/out.

     $IPT -P INPUT DROP
    

    Drops all incoming traffic. So if you start with that, you'll want to enable traffic into any other services you have running that you'd like to allow in. .

     $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
    

    This rule would allow incoming FTP traffic.

    An explanation of what this script is/does is it deletes all of your existing IP Tables chains, then it adds rules to allow all outgoing traffic and block all incoming traffic except for FTP.

    0 讨论(0)
  • 2021-02-04 11:34

    From Your question I suppose you have some trivial host with common set of apps such as web-browser, mail client, may be telnet and|or ssh-client, may be ftp-client too, may be some IM etc. And having all these apps working, You want additionally allow an FTP server on this host to work both in active and passive modes for clients which will connect. Here are 3 blocks of rules applicable in this case. Block of common rules is the minimalistic set of rules applicable for most client hosts. Next is block of rules for ftp-client, if You have such on Your host. The rules for ftp-client are slightly different from rules for others clients: there are always two connections to enable data transfer: ftp-control (port 21) and ftp-data (port 20 in Active mode or random port in Passive mode). You most probably will never need client rules for Active mode because Passive mode is single choice for NATed networks.

    The rules for FTP server are in the last block.

    Please check You have ip_conntrack_ftp ( may be named nf_conntrack_ftp ) in the kernel:

    > lsmod | grep conn
    

    If You do not have this kernel module, the 'RELATED' rules will not work and, most probably, separate ftp-data connection will not start while primary ftp-control connection will hang somewhere after 'PORT' command. You still can enforce ftp-data connection in this case, but at the spent of degrading security provided by the tweaked rules. The tweaks are in comments preceeding the rules.

    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 讨论(0)
  • 2021-02-04 11:37

    I have found a big mistake in the above script!

    The rules are misstyped, it should be like that:

    $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 and Sport change places! You are going to a destination, if you connect to a server, the sourceport is dynamic and clientside spefific and is not known nevertheless a connection is established!

    Imho the second line is ambigious at all, cause you don't know which ports a server-side client is going to use to establish a ftp-connection. Better would be a rule like this, if outbound traffic is blocked by 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
    

    But this is only needed if the rule

    $IPT -P OUTPUT DROP
    

    is on top of the rule-set.

    Greetings

    Marcus

    0 讨论(0)
提交回复
热议问题