Quy tắc UFW cho máy chủ / dns động cụ thể


1

Làm cách nào tôi có thể thiết lập UFW (Tường lửa không biến đổi) để thêm quy tắc cho các máy chủ cụ thể? Ví dụ. Tôi muốn chỉ cho phép SSH từ yourpc.no-ip.org?

Câu trả lời:


4

Tôi tìm thấy một tập lệnh rất hữu ích, tạo ra các quy tắc một cách linh hoạt cho các máy chủ cụ thể trong blog này . Kịch bản cần được chạy với cron, vì vậy nó có thể tra cứu tên máy chủ và thêm / xóa quy tắc trong trường hợp IP thay đổi.

#!/bin/bash


HOSTS_ALLOW=/etc/ufw-dynamic-hosts.allow
IPS_ALLOW=/var/tmp/ufw-dynamic-ips.allow

add_rule() {
  local proto=$1
  local port=$2
  local ip=$3
  local regex="${port}\/${proto}.*ALLOW.*IN.*${ip}"
  local rule=$(ufw status numbered | grep $regex)
  if [ -z "$rule" ]; then
      ufw allow proto ${proto} from ${ip} to any port ${port}
  else
      echo "rule already exists. nothing to do."
  fi
}

delete_rule() {
  local proto=$1
  local port=$2
  local ip=$3
  local regex="${port}\/${proto}.*ALLOW.*IN.*${ip}"
  local rule=$(ufw status numbered | grep $regex)
  if [ -n "$rule" ]; then
      ufw delete allow proto ${proto} from ${ip} to any port ${port}
  else
      echo "rule does not exist. nothing to do."
  fi
}


sed '/^[[:space:]]*$/d' ${HOSTS_ALLOW} | sed '/^[[:space:]]*#/d' | while read line
do
    proto=$(echo ${line} | cut -d: -f1)
    port=$(echo ${line} | cut -d: -f2)
    host=$(echo ${line} | cut -d: -f3)

    if [ -f ${IPS_ALLOW} ]; then
      old_ip=$(cat ${IPS_ALLOW} | grep ${host} | cut -d: -f2)
    fi

    ip=$(dig +short $host | tail -n 1)

    if [ -z ${ip} ]; then
        if [ -n "${old_ip}" ]; then
            delete_rule $proto $port $old_ip
        fi
        echo "Failed to resolve the ip address of ${host}." 1>&2
        exit 1
    fi

    if [ -n "${old_ip}" ]; then
        if [ ${ip} != ${old_ip} ]; then
            delete_rule $proto $port $old_ip
        fi
    fi
    add_rule $proto $port $ip
    if [ -f ${IPS_ALLOW} ]; then
      sed -i.bak /^${host}*/d ${IPS_ALLOW}
    fi
    echo "${host}:${ip}" >> ${IPS_ALLOW}
done

Nội dung của /etc/ufw-dynamic-hosts.allow có thể trông như thế này:

tcp:22:yourpc.no-ip.org

và một mục crontab để thực thi tập lệnh cứ sau năm phút có thể trông như thế này:

*/5 * * * * /usr/local/sbin/ufw-dynamic-host-update > /dev/null

+1 - Trong trường hợp của tôi, tôi sử dụng 'ufw status' thay vì 'ufw status được đánh số' trong dòng 12 vì một số lỗi "tên biến xấu" trong một số trường hợp. Ngoài ra trên root crontab tôi buộc phải sử dụng 'sudo sh / usr / local / sbin / ufw-Dynamic-host-update & gt; / dev / null '. Để gỡ lỗi, bạn nên làm cho nó trỏ đến một tệp như 'sudo sh / usr / local / sbin / ufw-Dynamic-host-update & gt; & gt; / etc / ufw-custom-log '.
giannis.epp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.