IPアドレスではなくドメイン名に基づくファイアウォールルール

IPアドレスではなくドメイン名に基づくファイアウォールルール

クラウド仮想マシンインスタンスへのアクセスを管理するために、Guacamoleリモートデスクトップゲートウェイテスト設定を実行しています。

固定IPなしでGuacamole RDGへのアクセスを特定のドメインに制限するように、奇妙なPOC要求を顧客から受け取ったときに選択肢はありませんでした。クライアントは、動的DNSなどのサービスを使用して、自分が取得した動的IPでドメインを再確認できます。

したがって、デフォルトでは、IPアドレスではなくドメイン名に基づいてGuacamole RDGサーバーにインバウンドファイアウォールルールを設定する必要があります。基本的なネットワークロジックに加えて、この要件を満たす方法はありますか?

ドメイン名に基づいてiptablesルールを設定するには、次のコマンドを試しましたが、実行時に実際にドメイン名を解決し、解決されたIPアドレスを使用してiptablesにルールを適用します。

iptables -A INPUT -p tcp --src domain.com --dport 3128 -j ACCEPT

ベストアンサー1

iptablesそれ自体はIPアドレスでのみ機能しますが、ipsetベースのルールを作成し、定期的にipsetを更新できます。

ipset create allowed hash:ip family inet     # IPv4-only
ipset create allowed6 hash:ip family inet6   # IPv6-only

デフォルトでは、すべてのIPsetは再起動後に削除されます。

ルールは次のとおりです。

iptables -A INPUT -p tcp --dport 3128  -m set --match-set allowed src -j ACCEPT
ip6tables -A INPUT -p tcp --dport 3128  -m set --match-set allowed6 src -j ACCEPT

(脚注ではFORWARDおよびOUTPUTチェーンの場合srcに置き換える必要がありますdst。)

ドメイン検索を実行し、IPset を更新するスクリプトを作成します。

#!env /bin/bash

# Domain names to look up
names=("example.com" "example.org")

ipset flush allowed
for name in ${names[@]}; do
    # Look up and add IPv4 addresses (dig may output multiple)
    ip4s=$(dig A +short ${name})
    for ip4 in ${ip4s}; do
        ipset add allowed ${ip4}
    done
    
    # Look up and add IPv6 addresses (dig may output multiple)
    ip6s=$(dig AAAA +short ${name})
    for ip6 in ${ip6s}; do
        ipset add allowed6 ${ip6}
    done
done

定期的にスクリプトを実行するには、cronjobを追加してください。たとえば、5分ごとに次のようになります。

*/5 * * * * root /path/to/myscript.sh

おすすめ記事