19 February 2010

(Ubuntu) iptablesフロントエンド ufw, gufw を使う

iptablesのフロントエンドufwと、GUIインターフェースgufwの使い方メモ。

■ 検証環境:Ubuntu 9.10

ufwの起動は、initデーモンよりイベントに応じて呼び出されるUpstartの設定ファイル /etc/init/ufw.conf によって起動される。

/etc/init/ufw.conf
start on net-device-added INTERFACE=lo stop on runlevel [!023456] console output pre-start exec /lib/ufw/ufw-init start quiet post-stop exec /lib/ufw/ufw-init stop

Upstartから制御の移ったufwは、次のファイルでiptablesラッパーを開始するか判断しているようです。

/etc/ufw/ufw.conf
# set to yes to start on boot ENABLED=yes # set to one of 'off', 'low', 'medium', 'high' LOGLEVEL=low /etc/ufw/ufw.conf (END)

ここで、ENABLED=yesとなっている場合は、ufwがラッパーとして動作し始める。次のファイルを読み込んでiptablesを設定する。

/etc/default/ufw
IPV6=no DEFAULT_INPUT_POLICY="DROP" DEFAULT_OUTPUT_POLICY="ACCEPT" DEFAULT_FORWARD_POLICY="DROP" DEFAULT_APPLICATION_POLICY="SKIP" MANAGE_BUILTINS=no IPT_SYSCTL=/etc/ufw/sysctl.conf IPT_MODULES="nf_conntrack_ftp nf_nat_ftp nf_conntrack_irc nf_nat_irc"
/etc/ufw/before.rules
# Don't delete these required lines, otherwise there will be errors *filter :ufw-before-input - [0:0] :ufw-before-output - [0:0] :ufw-before-forward - [0:0] :ufw-not-local - [0:0] # End required lines # allow all on loopback -A ufw-before-input -i lo -j ACCEPT -A ufw-before-output -o lo -j ACCEPT # quickly process packets for which we already have a connection -A ufw-before-input -m state --state RELATED,ESTABLISHED -j ACCEPT -A ufw-before-output -m state --state RELATED,ESTABLISHED -j ACCEPT # drop INVALID packets (logs these in loglevel medium and higher) -A ufw-before-input -m state --state INVALID -j ufw-logging-deny -A ufw-before-input -m state --state INVALID -j DROP # ok icmp codes -A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT -A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT -A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT -A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT # allow dhcp client to work -A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT # # ufw-not-local # -A ufw-before-input -j ufw-not-local # if LOCAL, RETURN -A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN # if MULTICAST, RETURN -A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN # if BROADCAST, RETURN -A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN # all other non-local packets are dropped -A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny -A ufw-not-local -j DROP # allow MULTICAST, be sure the MULTICAST line above is uncommented -A ufw-before-input -s 224.0.0.0/4 -j ACCEPT -A ufw-before-input -d 224.0.0.0/4 -j ACCEPT # don't delete the 'COMMIT' line or these rules won't be processed COMMIT
/etc/ufw/after.rules
# Don't delete these required lines, otherwise there will be errors *filter :ufw-after-input - [0:0] :ufw-after-output - [0:0] :ufw-after-forward - [0:0] # End required lines # don't log noisy services by default -A ufw-after-input -p udp --dport 137 -j RETURN -A ufw-after-input -p udp --dport 138 -j RETURN -A ufw-after-input -p tcp --dport 139 -j RETURN -A ufw-after-input -p tcp --dport 445 -j RETURN -A ufw-after-input -p udp --dport 67 -j RETURN -A ufw-after-input -p udp --dport 68 -j RETURN # don't log noisy broadcast -A ufw-after-input -m addrtype --dst-type BROADCAST -j RETURN # don't delete the 'COMMIT' line or these rules won't be processed COMMIT
/lib/ufw/user.rules
*filter :ufw-user-input - [0:0] :ufw-user-output - [0:0] :ufw-user-forward - [0:0] :ufw-user-limit - [0:0] :ufw-user-limit-accept - [0:0] ### RULES ### ~ ここに、ユーザが追加したルールが書き込まれる ~ ### END RULES ### -A ufw-user-limit -m limit --limit 3/minute -j LOG --log-prefix "[UFW LIMIT BLOCK] " -A ufw-user-limit -j REJECT -A ufw-user-limit-accept -j ACCEPT COMMIT

ufwをコマンドラインより設定する例

 ~ 192.168.1.0/24 から、SNMP(port 161)へのアクセスを許可する ~ # ufw allow from 192.168.1.0/24 to any port 161  ~ 一つ上で設定したルールを削除する ~ # ufw delete allow from 192.168.1.0/24 to any port 161  ~ 192.168.1.10の1051/tcpポートから、127.0.0.1の1052/tcpポートへのアクセスを許可する ~ # ufw allow proto tcp from 192.168.1.10 port 1051 to 127.0.0.1 port 1052

gufwをインストールすれば、/lib/ufw/user.rulesをGUI上より設定できる。

20100219-ufw-dlg.png

例えば、これらの設定が適用されたiptablesのルールは、次のようになっている。(前述のルールの緑色の部分はコメントアウトして適用している)

# iptables-save # Generated by iptables-save v1.4.4 on Sat Feb 20 16:19:02 2010 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :ufw-after-forward - [0:0] :ufw-after-input - [0:0] :ufw-after-logging-forward - [0:0] :ufw-after-logging-input - [0:0] :ufw-after-logging-output - [0:0] :ufw-after-output - [0:0] :ufw-before-forward - [0:0] :ufw-before-input - [0:0] :ufw-before-logging-forward - [0:0] :ufw-before-logging-input - [0:0] :ufw-before-logging-output - [0:0] :ufw-before-output - [0:0] :ufw-logging-allow - [0:0] :ufw-logging-deny - [0:0] :ufw-not-local - [0:0] :ufw-reject-forward - [0:0] :ufw-reject-input - [0:0] :ufw-reject-output - [0:0] :ufw-track-input - [0:0] :ufw-track-output - [0:0] :ufw-user-forward - [0:0] :ufw-user-input - [0:0] :ufw-user-limit - [0:0] :ufw-user-limit-accept - [0:0] :ufw-user-logging-forward - [0:0] :ufw-user-logging-input - [0:0] :ufw-user-logging-output - [0:0] :ufw-user-output - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A INPUT -j ufw-before-logging-input -A INPUT -j ufw-before-input -A INPUT -j ufw-after-input -A INPUT -j ufw-after-logging-input -A INPUT -j ufw-reject-input -A INPUT -j ufw-track-input -A FORWARD -j ufw-before-logging-forward -A FORWARD -j ufw-before-forward -A FORWARD -j ufw-after-forward -A FORWARD -j ufw-after-logging-forward -A FORWARD -j ufw-reject-forward -A OUTPUT -o lo -j ACCEPT -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT -A OUTPUT -j ufw-before-logging-output -A OUTPUT -j ufw-before-output -A OUTPUT -j ufw-after-output -A OUTPUT -j ufw-after-logging-output -A OUTPUT -j ufw-reject-output -A OUTPUT -j ufw-track-output -A ufw-before-forward -j ufw-user-forward -A ufw-before-input -i lo -j ACCEPT -A ufw-before-input -m state --state RELATED,ESTABLISHED -j ACCEPT -A ufw-before-input -m state --state INVALID -j ufw-logging-deny -A ufw-before-input -m state --state INVALID -j DROP -A ufw-before-input -p icmp -m icmp --icmp-type 3 -j ACCEPT -A ufw-before-input -p icmp -m icmp --icmp-type 4 -j ACCEPT -A ufw-before-input -p icmp -m icmp --icmp-type 11 -j ACCEPT -A ufw-before-input -p icmp -m icmp --icmp-type 12 -j ACCEPT -A ufw-before-input -p icmp -m icmp --icmp-type 8 -j ACCEPT -A ufw-before-input -p udp -m udp --sport 67 --dport 68 -j ACCEPT -A ufw-before-input -j ufw-not-local -A ufw-before-input -j ufw-user-input -A ufw-before-output -o lo -j ACCEPT -A ufw-before-output -m state --state RELATED,ESTABLISHED -j ACCEPT -A ufw-before-output -j ufw-user-output -A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN -A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN -A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny -A ufw-not-local -j DROP -A ufw-track-output -p tcp -m state --state NEW -j ACCEPT -A ufw-track-output -p udp -m state --state NEW -j ACCEPT -A ufw-user-input -s 192.168.1.0/24 -p udp -m multiport --dports 137:138 -j ACCEPT -A ufw-user-input -s 192.168.1.0/24 -p tcp -m multiport --dports 139,445 -j ACCEPT -A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] " -A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable -A ufw-user-limit-accept -j ACCEPT -A ufw-user-logging-forward -j RETURN -A ufw-user-logging-input -j RETURN -A ufw-user-logging-output -j RETURN COMMIT # Completed on Sat Feb 20 16:19:02 2010

■ 参考資料
Ubuntu公式マニュアル Firewall
Upstart公式ページ
SourceForge.net : UbuntuのイベントベースinitデーモンUpstart