お仕事ではLinuxサーバをいじる機会が多く、今度メールリレーサーバとか作らないといけないんだけど、インターネットに晒すサーバ作るのにパケットフィルタちゃんといじれないのは怖すぎるので入門しておく
今ipfwで出来てる位の事は出来る様になっておきたい

マニュアルを見る

man iptablesしてみた。
iptablesはLinuxのkernel内蔵の機能を設定するコマンドらしい
chainというのがルールセットの名前の事か、あれipchainとかそういうコマンド無かったっけ
と思って調べたらipchainsが昔はあってそれの拡張としてiptablesが作られたらしい*1
RedHatの用意してるドキュメントがわかりやすそうなので読んでおく

iptables -L

で今設定されているルールーセットが表示されることぐらいは知っているので見てみた
INPUTにinルール OUTPUTにoutのルールが入るのは雰囲気でわかるけどFORWARDって何だろと思ったら

FORWARD (for packets being routed through the box)

との事。ルータ用途で使う時用かな

$ sudo iptables -L -v
Chain INPUT (policy ACCEPT 2982 packets, 380K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 2456 packets, 422K bytes)
 pkts bytes target     prot opt in     out     source               destination

わかってきた設定

これでsshの接続を受け付けてapt-get updateが出来て他は全部捨てる設定が出来ているはず

#!/bin/bash
IPTABLES="iptables"
ME=192.168.55.79

$IPTABLES -F
$IPTABLES -A FORWARD -j DROP

$IPTABLES -I INPUT  -j ACCEPT -p tcp -s 192.168.55.0/24 -d 192.168.55.79 --dport 22

$IPTABLES -I OUTPUT -j ACCEPT -p udp -s $ME --dport 53
$IPTABLES -I OUTPUT -j ACCEPT -p tcp -s $ME --dport 443
$IPTABLES -I OUTPUT -j ACCEPT -p tcp -s $ME --dport 80
# 戻りのパケットを通す
$IPTABLES -I INPUT  -j ACCEPT -p udp -m state --state ESTABLISHED
$IPTABLES -I INPUT  -j ACCEPT -p tcp -m state --state ESTABLISHED
$IPTABLES -I OUTPUT -j ACCEPT -p tcp -m state --state ESTABLISHED
# 他は全部捨てる
$IPTABLES -A INPUT  -j DROP
$IPTABLES -A OUTPUT -j DROP

$IPTABLES -nL

man iptables の冒頭部分

 NAME                                                                                                                              
      iptables/ip6tables ? administration tool for IPv4/IPv6 packet filtering and NAT                                            
 SYNOPSIS                                                                                                                          
      iptables [-t table] {-A|-C|-D} chain rule-specification
      ip6tables [-t table] {-A|-C|-D} chain rule-specification
      iptables [-t table] -I chain [rulenum] rule-specification 
      iptables [-t table] -R chain rulenum rule-specification
      iptables [-t table] -D chain rulenum
      iptables [-t table] -S [chain [rulenum]]
      iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
      iptables [-t table] -N chain
      iptables [-t table] -X [chain]
      iptables [-t table] -P chain target
      iptables [-t table] -E old-chain-name new-chain-name
      rule-specification = [matches...] [target]
      match = -m matchname [per-match-options]
      target = -j targetname [per-target-options]
                                                                                                                                 
DESCRIPTION                                                                                                                       
      Iptables  and  ip6tables  are  used to set up, 
      maintain, and inspect the tables of IPv4 and IPv6 packet filter rules in the
      Linux kernel.  Several different tables may be defined.  
      Each table contains a number of built-in chains and may also  con‐tain user-defined chains.                                                                                                  
                                                                                                                                 
      Each chain is a list of rules which can match a set of packets.  
      Each rule specifies what to do with a packet that matches.
      This is called a `target', which may be a jump to a user-defined chain in the same table.