UFW: Позвольте трафик только от домена с динамическим IP-адресом

Поля сортировки AFAIK не имеют никакого интерактивного способа указать полевое число, необходимо дать его как аргумент C-u. Например, для 3-го поля: C-u 3 M-x sort-fields

33
10.07.2018, 10:08
4 ответа

Я не полагаю, что это возможно с ufw. ufw просто frontend к iptables который также испытывает недостаток в этой функции, таким образом, один подход должен был бы создать crontab запись, которая будет периодически выполнять и проверять, изменился ли IP-адрес. Если это будет иметь затем, то это обновит его.

Вы могли бы испытать желание сделать это:

$ iptables -A INPUT -p tcp --src mydomain.dyndns.org --dport 22 -j ACCEPT

Но это разрешит имя хоста к IP и использованию, что для правила, поэтому если IP более поздние изменения это правило станет недопустимым.

Альтернативная идея

Вы могли создать сценарий как так, названный, iptables_update.bash.

#!/bin/bash
#allow a dyndns name

HOSTNAME=HOST_NAME_HERE
LOGFILE=LOGFILE_NAME_HERE

Current_IP=$(host $HOSTNAME | cut -f4 -d' ')

if [ $LOGFILE = "" ] ; then
  iptables -I INPUT -i eth1 -s $Current_IP -j ACCEPT
  echo $Current_IP > $LOGFILE
else

  Old_IP=$(cat $LOGFILE)

  if [ "$Current_IP" = "$Old_IP" ] ; then
    echo IP address has not changed
  else
    iptables -D INPUT -i eth1 -s $Old_IP -j ACCEPT
    iptables -I INPUT -i eth1 -s $Current_IP -j ACCEPT
    /etc/init.d/iptables save
    echo $Current_IP > $LOGFILE
    echo iptables have been updated
  fi
fi

источник: Используя IPTables с Динамическими именами хостов IP как dyndns.org

С этим сценарием, сохраненным, Вы могли создать crontab запись как так в файле /etc/crontab:

*/5 * * * * root /etc/iptables_update.bash > /dev/null 2>&1

Эта запись затем запускала бы скрипт каждые 5 минут, проверяя, чтобы видеть, изменился ли IP-адрес, присвоенный имени хоста. Раз так затем это создаст новое правило, позволяющее его при удалении старого правила для старого IP-адреса.

48
27.01.2020, 19:37
  • 1
    Как глупый, что я не думал о разрешении имени хоста периодически. Я изменил Ваш сценарий (добавленный вход, и т.д.), и он работает как очарование.Спасибо! –  Carles Sala 21.09.2013, 17:42
  • 2
    @CarlesSala - довольный это решило Вашу проблему. В дополнение к принятию Вас может также upvote 8-). –  slm♦ 21.09.2013, 17:48
  • 3
    : на Debian 7 я должен был изменить строку Current_IP=$(host $HOSTNAME | cut -f4 -d' ') кому: Current_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ') –  Krystian 06.01.2016, 15:47
  • 4
    , я смогу видеть это при использовании ufw подробного состояния? Я имею в виду, правила? –  Freedo 07.04.2017, 12:02
  • 5
    @Freedo, не уверенный, попробуйте его и посмотрите то, что происходит. –  slm♦ 07.04.2017, 14:16

Я знаю, что это старая версия, но я наткнулся на нее и в конце концов остановился на этом решении, которое кажется даже лучше, потому что файл журнала не нужен, и очень легко добавлять дополнительные хосты по мере необходимости. Работает как шарм!

Источник: http://rdstash.blogspot.ch/2013/09/allow-host-with-dynamic-ip-through.html

#!/bin/bash

DYNHOST=$1
DYNHOST=${DYNHOST:0:28}
DYNIP=$(host $DYNHOST | grep -iE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" |cut -f4 -d' '|head -n 1)

# Exit if invalid IP address is returned
case $DYNIP in
0.0.0.0 )
exit 1 ;;
255.255.255.255 )
exit 1 ;;
esac

# Exit if IP address not in proper format
if ! [[ $DYNIP =~ (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) ]]; then
exit 1
fi

# If chain for remote doesn't exist, create it
if ! /sbin/iptables -L $DYNHOST -n >/dev/null 2>&1 ; then
/sbin/iptables -N $DYNHOST >/dev/null 2>&1
fi

# Check IP address to see if the chain matches first; skip rest of script if update is not needed
if ! /sbin/iptables -n -L $DYNHOST | grep -iE " $DYNIP " >/dev/null 2>&1 ; then


# Flush old rules, and add new
/sbin/iptables -F $DYNHOST >/dev/null 2>&1
/sbin/iptables -I $DYNHOST -s $DYNIP -j ACCEPT

# Add chain to INPUT filter if it doesn't exist
if ! /sbin/iptables -C INPUT -t filter -j $DYNHOST >/dev/null 2>&1 ; then
/sbin/iptables -t filter -I INPUT -j $DYNHOST
fi

fi
8
27.01.2020, 19:37

Основываясь на предыдущих ответах, я обновил следующий сценарий как bash, который работает на Debian Jessie

#!/bin/bash
HOSTNAME=dynamichost.domain.com
LOGFILE=$HOME/ufw.log
Current_IP=$(host $HOSTNAME | head -n1 | cut -f4 -d ' ')

if [ ! -f $LOGFILE ]; then
    /usr/sbin/ufw allow from $Current_IP to any port 22 proto tcp
    echo $Current_IP > $LOGFILE
else

    Old_IP=$(cat $LOGFILE)
    if [ "$Current_IP" = "$Old_IP" ] ; then
        echo IP address has not changed
    else
        /usr/sbin/ufw delete allow from $Old_IP to any port 22 proto tcp
        /usr/sbin/ufw allow from $Current_IP to any port 22 proto tcp
        echo $Current_IP > $LOGFILE
        echo iptables have been updated
    fi
fi
5
27.01.2020, 19:37

Вот версия на Python, которая может добавлять или удалять правила ipv4 и ipv6, если имя хоста разрешается в несколько конечных точек (ufw ). Обратите внимание, что мой сценарий немного отличался, поскольку я начал с профиля «Разрешить все».

На основе версии Тима Кеннеди и Маттиаса Петтерссона

#!/usr/bin/env python

# Only allow a particular HOSTNAME to access the given port...

# from https://unix.stackexchange.com/a/534117/66983
# and https://unix.stackexchange.com/a/91711/66983
# If the ufw table is empty you might need to execute the script twice (as inserting on top will not work properly)
# crontab -e and add '*/5 * * * * root /path/to/update_ufw.py > /dev/null 2>&1'
HOSTNAME="<hostname>"
PORT=<port>

import os
import subprocess

if os.geteuid() != 0:
    print("This script must be run as root")
    exit(1)

def run(cmd):
    process = subprocess.Popen(['bash', '-c', cmd],
                     stdout=subprocess.PIPE)
    stdout, stderr = process.communicate()
    return stdout.decode('utf-8')

new_ip_output = run("getent ahosts \"{}\" | awk '{{ print $1 }}'".format(HOSTNAME))
new_ips=set(new_ip_output.split())
old_ip_output = run("/usr/sbin/ufw status | grep {} | head -n1 | tr -s ' ' | cut -f3 -d ' '".format(HOSTNAME))
old_ips=set(old_ip_output.split())


if old_ips == new_ips:
    print ("All IPs still OK.")
else:
    # add new IPs
    for new_ip in new_ips:
        if new_ip not in old_ips:
            out = run("/usr/sbin/ufw insert 1 allow from {} to any port {} comment {}".format(new_ip, PORT, HOSTNAME))
            print(out)
    
    # remove old IPs
    for old_ip in old_ips:
         if old_ip not in new_ips:
            out = run("/usr/sbin/ufw delete allow from {} to any port {}".format(old_ip, PORT))
            print(out)
    
    # add deny rule
    out = run("/usr/sbin/ufw deny {}".format(PORT))
    print(out)

1
06.09.2020, 19:10

Теги

Похожие вопросы