[FreeBSD-users-jp 96055] DNSを監視して動的にipfwのルールを追加/削除するツール.

2017-03-07 スレッド表示 Ryuji MATSUMOTO
松元@福岡です.

こういうツールをご存知の方はいらっしゃいませんか.

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のルールを追加/削除するツール.

2017-03-07 スレッド表示 Hiroki Sato
Ryuji MATSUMOTO  wrote
  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