Утилита iptables-persistent

Нужна для хранения iptables правил в файлах.
  1. Устанавливаем:
    apt-get install iptables-persistent
  2. Создаём файл с правилами файерволла для IPv4:
    nano /etc/iptables/iprules
    Содержимое файла "iprules":
    *filter
    
    // все входящие соединения запрещены
    :INPUT DROP [0:0]
    
    // все перенаправления запрещены
    :FORWARD DROP [0:0]
    
    // все исходящие соединения разрешены
    :OUTPUT ACCEPT [0:0]
    
    // локально разрешены все соединения и перенаправления
    -A INPUT -i lo -j ACCEPT
    
    // пинг и прочие icmp ответы сервера разрешены
    -A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 8 -j ACCEPT
    -A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 11 -j ACCEPT
    -A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 3 -j ACCEPT
         
    // разрешены только установленные соединения
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
         
    // некорретные/ненужные пакеты запрещены
    -A INPUT -m state --state INVALID -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
    -A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
         
    // открываем необходимые порты:
    // SSH
    -A INPUT -p tcp -m tcp --dport 12345 -j ACCEPT
    // WEB
    -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
         
    COMMIT
  3. Создаём файл с правилами файерволла для IPv6:
    nano /etc/iptables/ip6rules
    Содержимое файла "ip6rules":
    *filter
    
    :INPUT DROP [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p ipv6-icmp -j ACCEPT
    
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
    
    -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
    
    COMMIT
  4. Применяем правила:
    iptables-restore < /etc/iptables/iprules && ip6tables-restore < /etc/iptables/ip6rules
  5. Сохраняем изменения:
    service iptables-persistent save
  6. Проверяем:
    iptables -L

IPtables команды

  1. Открыть порт "1234":
    iptables -A INPUT -p tcp -m tcp --dport 1234 -j ACCEPT
  2. Открыть порт "1234" только для IP-адреса "1.2.3.4":
    iptables -A INPUT -s 1.2.3.4 -p tcp -m tcp --dport 1234 -j ACCEPT
  3. Забанить IP-адрес "1.2.3.4":
    iptables -A INPUT -s 1.2.3.4 -j DROP
  4. Удалить правило, созданное для порта "1234":
    iptables -D INPUT -p tcp -m tcp --dport 1234 -j ACCEPT
  5. Перенаправление с порта "1234" на "5678":
    iptables -t nat -A PREROUTING -p tcp --dport 1234 -j REDIRECT --to-port 5678
  6. Перенаправление с порта "1234" на удалённый сервер "1.2.3.4" на порт "5678":
    iptables -A PREROUTING -i eth0 -p tcp -m tcp --dport 1234 -j DNAT --to-destination 1.2.3.4:5678
Для IPv6 команда "ip6tables". Вместо одного IP-адреса можно подставлять IPv6 подсети.

Сохранение IPtables правил в файлы

IPv4:
iptables-save > /etc/iptables/iprules
IPv6:
ip6tables-save > /etc/iptables/ip6rules