iptables にnetbios名前解決用のポートを追加する

■前回のfirewall.shではDNSを無効にしていますので、
 WindowsクライアントからSambaの共有フォルダにアクセス時に名前解決が行えません。
 勿論、IP指定であれば、cifsポートは開いているのでアクセス可能です。

 ※システムメールの箇所はログに追記するように変えればもう少しすっきりすると思います。

 開放するポートについてはこちら。
http://www.atmarkit.co.jp/fwin2k/win2ktips/088directhostedsmb/088directhostedsmb.html

■/etc/servicesからの確認。

# grep netbios /etc/services
netbios-ns 137/tcp # NETBIOS Name Service
netbios-ns 137/udp
netbios-dgm 138/tcp # NETBIOS Datagram Service
netbios-dgm 138/udp
netbios-ssn 139/tcp # NETBIOS session service
netbios-ssn 139/udp

■netbiosポートを追加する。

# vim fw_samba_add.sh
# before save configuration
THISDATE=`env LANG=C date '+%Y/%m/%d %H:%M:%S'`
cat /etc/iptables-save | mail -s "iptables report ${THISDATE}" root

iptables -A INPUT -p udp --dport 137:138 -j ACCEPT
iptables -A INPUT -p tcp --dport 139 -j ACCEPT

# after save configuration
iptables-save -c > /etc/iptables-save
THISDATE=`env LANG=C date '+%Y/%m/%d %H:%M:%S'`
cat /etc/iptables-save | mail -s "iptables report ${THISDATE}" root

# chmod 500 fw_samba_add.sh
# ./fw_samba_add.sh

■リセット方法は2つ。

★「-D」オプションで削除する。

iptables -D INPUT -p udp --dport 137:138 -j ACCEPT
iptables -D INPUT -p tcp --dport 139 -j ACCEPT

★./firewall.shを実行し、全体をリセット。

■iptablesの設定の確認方法

 「-n」オプションでポート番号を表示するよう指定します。
 初めは出力はありません。

# iptables -L -n | grep "13[789]"

■ブロックログの確認。
 私の環境では137138のログしかありませんが、139のセッションサービスも必要です。

 参考URL
 http://www.atmarkit.co.jp/fwin2k/network/baswinlan005/baswinlan005_01.html

# grep "IPTABLES" /var/log/kern.log | grep --color "13[789]" | awk -F\: '{print $5}' | sort | uniq | grep 172.
IN=vmnet1 OUT= MAC= SRC=172.16.5.1 DST=172.16.5.255 LEN=242 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=138 DPT=138 LEN=222

■iptablesにルールを追加する

# ./fw_samba_add.sh

■ルール追加の確認

# iptables -L -n | grep "13[789]"
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpts:137:138
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:139

■Samba接続確認。

正常にアクセス出来、ブロックログはありません。
「/etc/services」から見た、TCP/137、TCP/138、UDP/139 については拒否のままです。

■nmapによるTCPのポートスキャン
 ※iptablesのルール削除後も結果は変わりません。

# nmap -sT localhost 2>&1 | grep "^13[789]"
139/tcp open|filtered netbios-ssn

■nmapによるUDPのポートスキャン
 ※iptablesのルール削除後も結果は変わりません。

# nmap -sU localhost 2>&1 | grep "^13[789]"
137/udp open|filtered netbios-ns
138/udp open|filtered netbios-dgm

■netbiosを拒否中には、debian側のマウントでもブロックされます。

# mount //localhost/user-home /media/smb/
mount error 13 = Permission denied
Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)

■netbiosを拒否中にも、IP指定であれば、debian側のマウントでもブロックされません。

# mount //127.0.0.1/labunix /media/smb/

■信頼済みのlocalhostだけを許可します。

# iptables -A INPUT -i eth0 -s localhost -p udp --dport 137:138 -j ACCEPT
# iptables -A INPUT -i eth0 -s localhost -p tcp --dport 139 -j ACCEPT

# iptables -L -n | grep 13[789]
ACCEPT udp -- 127.0.0.1 0.0.0.0/0 udp dpts:137:138
ACCEPT tcp -- 127.0.0.1 0.0.0.0/0 tcp dpt:139

■hostsにあるホスト名のIPだけを許可します。

# iptables -A INPUT -i eth0 -s `hostname -s` -p udp --dport 137:138 -j ACCEPT
# iptables -A INPUT -i eth0 -s `hostname -s` -p tcp --dport 139 -j ACCEPT

■vmwareを導入している環境では「127.0.1.1」もあるかも知れません。

# net lookup `hostname -s`
127.0.1.1

# iptables -A INPUT -i eth0 -s $(net lookup `hostname -s`) -p udp --dport 137:138 -j ACCEPT
# iptables -A INPUT -i eth0 -s $(net lookup `hostname -s`) -p tcp --dport 139 -j ACCEPT

■vmnet1(ホストオンリー)のローカルネットワークだけを許可します。

# iptables -A INPUT -i vmnet1 -s 172.16.5.0/24 -p udp --dport 137:138 -j ACCEPT
# iptables -A INPUT -i vmnet1 -s 172.16.5.0/24 -p tcp --dport 139 -j ACCEPT

■スクリプトなので、変数も使えます。
/etc/iptables-saveから変数を解決後の設定を確認する場合は一度保存します。

# iptables-save -c > /etc/iptables-save

■./firewall.shですべてリセット、ベースルールに戻します。

いきなり複雑なルールを追加するよりも、ベースルールに追加する方法する方が、
各種の間違えや、テストの為の設定が行えて便利です。
上位ネットワークでは無いので、ベースルールは緩いです。
また、緊急時用にリセットする目的であれば、システムメールよりもlogに出力した方が早いです。
それぞれ、各自で調整して下さい。