[FreeBSD-users-jp 96055] DNSを監視して動的にipfwのルールを追加/削除するツール.
松元@福岡です. こういうツールをご存知の方はいらっしゃいませんか. FreeBSDのFirewall(ipfw)に hostnameを記載しても,ipfwが実行 された時に引いたIPアドレス固定になるようです. http://www.jp.freebsd.org/man-jp/search.html 日本語マニュアル RELEASE 10-1-RELEASE-K ipfw --- numeric-ip | hostname ドットで区切った数字 4 つ組またはホスト名で指定した、1 つ の IPv4 アドレスが適合します。ホスト名の名前解決は、その 規則がファイアウォールのリストに追加されるときに行われま す。 --- 上記だとhostname-IPアドレスの対応が変化した時に動かなくなるので,定期的 にDNSを参照して Firewallのルールを更新してくれるツールです. 具体的にやりたい事は,外部のSMTP/IMAPサーバのIPを監視しててIPアドレスに 変動があれば更新する.(具体的にはGmail/Office365.) 例えばimapサーバ向けにportを開けるipfwルール12340-12341があるとします. imap.example.com : IPが192.0.2.1, 192.0.2.2とします. > 12340 allow tcp from LOCAL-IP to 192.0.2.1 dst-port 993 > 12341 allow tcp from LOCAL-IP to 192.0.2.2 dst-port 993 これIPが変化したら無効になります.なので,こんな感じで while(1) { sleep(1時間ぐらい); dig +short imap.example.com > ip-list.txt if(ip-list.txtの中身が変動した) { ipfwルール番号 12340-12341を削除する. ipfwルール番号 12340-12341の所に新しいルールを追加する. } } こういう事をやってくれるツールがどこかにありそうな気がするのですが. -- 松元隆二 ___ freebsd-users-jp@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/freebsd-users-jp To unsubscribe, send any mail to "freebsd-users-jp-unsubscr...@freebsd.org"
[FreeBSD-users-jp 96056] Re: DNSを監視して動的にipfwのルールを追加/削除するツール.
Ryuji MATSUMOTOwrote in <20170307.182632.2029998101879781962.matum...@pluto.ai.kyutech.ac.jp>: ma> > 12340 allow tcp from LOCAL-IP to 192.0.2.1 dst-port 993 ma> > 12341 allow tcp from LOCAL-IP to 192.0.2.2 dst-port 993 (snip) ma> while(1) ma> { ma> sleep(1時間ぐらい); ma> ma> dig +short imap.example.com > ip-list.txt ma> ma> if(ip-list.txtの中身が変動した) ma> { ma> ipfwルール番号 12340-12341を削除する. ma> ipfwルール番号 12340-12341の所に新しいルールを追加する. ma> } ma> } ma> ma> こういう事をやってくれるツールがどこかにありそうな気がするのですが. 12340 allow tcp from LOCAL-IP to table(1) dst-port 993 というようなルールを定義して、添付のようなスクリプトを cron でまわすのはいかがでしょうか。 -- Hiroki #!/bin/sh TARGET=${1:-imap.example.com} TBLNUM=1 fifo1="/tmp/ipfwtbl_dns1.$$" fifo2="/tmp/ipfwtbl_dns2.$$" rm -f $fifo1 $fifo2 mkfifo -m 0600 $fifo1 $fifo2 || exit 1 host -t A $TARGET | while read d d TYPE IPADDR; do case $TYPE in address) echo $IPADDR HOST ;; esac done | sort > $fifo1 & ipfw table $TBLNUM list | while read IPADDR d; do case $IPADDR in -*) ;; */32) echo ${IPADDR%/32} IPFW ;; esac done | sort > $fifo2 & join -v 1 -v 2 $fifo1 $fifo2 | while read IPADDR MODE; do case $MODE in HOST) # found in DNS but not found in IPFW table ipfw table $TBLNUM add $IPADDR/32 ;; IPFW) # found in IPFW table but not found in DNS ipfw table $TBLNUM delete $IPADDR/32 ;; esac done rm -f $fifo1 $fifo2 pgpvA4whcl_m_.pgp Description: PGP signature