- iptablesの解説は
https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sect-Security_Guide-IPTables.html
が便利
- iptablesで、ファイアウォールの設定を行う。
- もっとも、安全な設定は
tables -P INPUT DROP
tables -P FORWARD DROP
tables -P OUTPUT DROP
である。
- 設定の保管は
service iptables save
で、行える。
- IPTables コマンドオプションの構造
iptables [-t <table-name>] <command> <chain-name> <parameter-1> <option-1> ... <parameter-n> <option-n>
<table-name> — ルールが適用されるテーブルを指定します。省略時は、 filter テーブルが使用されます。
<command> — ルールの追加または削除などの、実行するアクションを指定します。
<chain-name> — 編集、作成または削除するチェーンを指定します。
<parameter>-<option> のペア — ルールにマッチするパケットをどのように処理するかを指定するパラメーターおよび関連するオプションです。
iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
Commands:
Either long or short options are allowed.
--append -A chain Append to chain
--check -C chain Check for the existence of a rule
--delete -D chain Delete matching rule from chain
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain [rulenum]]
List the rules in a chain or all chains
--list-rules -S [chain [rulenum]]
Print the rules in a chain or all chains
--flush -F [chain] Delete all rules in chain or all chains
--zero -Z [chain [rulenum]]
Zero counters in chain or all chains
--new -N chain Create a new user-defined chain
--delete-chain
-X [chain] Delete a user-defined chain
--policy -P chain target
Change policy on chain to target
--rename-chain
-E old-chain new-chain
Change chain name, (moving any references)
Options:
--ipv4 -4 Nothing (line is ignored by ip6tables-restore)
--ipv6 -6 Error (line is ignored by iptables-restore)
[!] --protocol -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
source specification
[!] --destination -d address[/mask][...]
destination specification
[!] --in-interface -i input name[+]
network interface name ([+] for wildcard)
--jump -j target
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match
extended match (may load extension)
--numeric -n numeric output of addresses and ports
[!] --out-interface -o output name[+]
network interface name ([+] for wildcard)
--table -t table table to manipulate (default: `filter')
--verbose -v verbose mode
--line-numbers print line numbers when listing
--exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
--modprobe=<command> try to insert modules using this command
--set-counters PKTS BYTES set the counter during insert/append
[!] --version -V print package version.
tcp match options:
[!] --tcp-flags mask comp match when TCP flags & mask == comp
(Flags: SYN ACK FIN RST URG PSH ALL NONE)
[!] --syn match when only SYN flag set
(equivalent to --tcp-flags SYN,RST,ACK,FIN SYN)
[!] --source-port port[:port]
--sport ...
match source port(s)
[!] --destination-port port[:port]
--dport ...
match destination port(s)
[!] --tcp-option number match if TCP option set
udp match options:
[!] --source-port port[:port]
--sport ...
match source port(s)
[!] --destination-port port[:port]
--dport ...
match destination port(s)
icmp match options:
[!] --icmp-type typename match icmp type
[!] --icmp-type type[/code] (or numeric type or type/code)
Valid ICMP Types:
any
echo-reply (pong)
destination-unreachable
network-unreachable
host-unreachable
protocol-unreachable
port-unreachable
fragmentation-needed
source-route-failed
network-unknown
host-unknown
network-prohibited
host-prohibited
TOS-network-unreachable
TOS-host-unreachable
communication-prohibited
host-precedence-violation
precedence-cutoff
source-quench
redirect
network-redirect
host-redirect
TOS-network-redirect
TOS-host-redirect
echo-request (ping)
router-advertisement
router-solicitation
time-exceeded (ttl-exceeded)
ttl-zero-during-transit
ttl-zero-during-reassembly
parameter-problem
ip-header-bad
required-option-missing
timestamp-request
timestamp-reply
address-mask-request
address-mask-reply
-m
limit
このモジュールは、トークンバケツフィルタを使い、単位時間あたり制限された回数だけマッチする。
この拡張を使ったルールは、(`!' フラグが指定されない限り) 制限に達するまでマッチする。
例えば、このモジュールはログ記録 を制限するために LOG ターゲットと組み合わせて使うことができる。
--limit rate
単位時間あたりの平均マッチ回数の最大値。 数値で指定され、添字 `/second', `/minute', `/hour',
`/day' を付けることもできる。 デフォルトは 3/hour である。
--limit-burst number
パケットがマッチする回数の最大初期値:上のオプションで指定した制限に達しなければ、
その度ごとに、この数値になるまで 1 個ずつ増やされる。 デフォルトは 5 である。
icmp
この拡張は `--protocol icmp' が指定された場合にロードされ、 以下のオプションが提供される:
[!] --icmp-type typename
ICMP タイプを指定できる。タイプ指定には、数値の ICMPタイプ、または以下のコマンド
で表示される ICMP タイプ名を指定できる。
iptables -p icmp -h
multiport
このモジュールは送信元や送信先のポートの集合にマッチする。
ポートは 15個まで指定できる。
このモジュールは -p tcp または -p udp と組み合わせて使うことしかできない。
--source-ports port[,port[,port...]]
送信元ポートが指定されたポートのうちのいずれかであればマッチする。
フラグ --sports は、このオプションの便利な別名である。
--destination-ports port[,port[,port...]]
宛先ポートが指定されたポートのうちのいずれかであればマッチする。
フラグ --dports は、このオプションの便利な別名である。
--ports port[,port[,port...]]
送信元ポートと宛先ポートが等しく、かつそのポートが指定されたポートの
うちのいずれかであればマッチする
state
このモジュールは、接続追跡 (connection tracking) と組み合わせて用いると、
パケットについての接続追跡状態を知ることができる。
--state state
state は、マッチングを行うための、コンマで区切られた接続状態のリストである。 指定可能な state
は以下の通り。
INVALID: このパケットは既知の接続と関係していない。
ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。
NEW: このパケットが新しい接続を開始したか、双方向にはパケットがやり取りされていない接続に属するパケットである。
RELATED: このパケットが新しい接続を開始しているが、FTPデータ転送やICMPエラーのように、既存の接続に関係している。
tcp
これらの拡張は `--protocol tcp' が指定され場合にロードされ、 以下のオプションが提供される:
[!] --source-port port[:port]
送信元ポートまたはポート範囲の指定。サービス名またはポート番号を指定できる。
port:portという形式で、2 つの番号を含む範囲を指定することもできる。
最初のポートを省略した場合、"0"を仮定する。
最後のポートを省略した場合、"65535"を仮定する。
最初のポートが最後のポートより大きい場合、2つは入れ換えられる。
フラグ --sport は、このオプションの便利 な別名である。
[!] --destination-port port[:port]
送信先ポートまたはポート範囲の指定。 フラグ --dport は、このオプションの便利な別名である。
[!] --tcp-flags mask comp
TCP フラグが指定されたものと等しい場合にマッチする。
第 1 引き数は評価対象とするフラグで、コンマ区切りのリストである。
第 2 引き数は必ず設定しなければならないフラグで、コンマ区切りのリストである。
指定できるフラ グは SYN ACK FIN RST URG PSH ALL NONE である。
よって、コマンド iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
は、SYN フラグが設定され ACK, FIN, RST フラグが設定されていない パケットにのみマッチする。
[!] --syn
SYN ビットが設定され ACK、RST および FIN ビットがクリアされている TCPパケットにマッチする。
このようなパケットは TCP接続の開始要求に使われる。
例えば、あるインターフェースに入ってくるこのようなパケットをブロックすれば、
内側への TCP接続は禁止されるが、外側への TCP 接続には影響しない。
これ は --tcp-flags SYN,RST,ACK,FIN SYN と等しい。
"--syn" の前に "!" フラグ を置くと、この条件を満たさないパケットにマッチする。
[!] --tcp-option number
TCP オプションが設定されている場合にマッチする。
--mss value[:value]
指定された MSS 値 (の範囲) を持つ TCP の SYN または SYN/ACK パケットにマッチする。 MSS
は接続に対するパケットの最大サイズを制御する。
tos
このモジュールは IP ヘッダーの 8 ビットの (つまり上位ビットを含む) Type of Service
フィールドにマッチする。
--tos tos
引き数は、マッチを行う標準的な名前でも数値でもよい (名前のリストを見るには
iptables -m tos -h
を使うこと)。
ttl
このモジュールは IP ヘッダーの time to live フィールドにマッチする。
--ttl ttl
指定された TTL 値にマッチする。
udp
これらの拡張は `--protocol udp' が指定された場合にロードされ、 以下のオプションが提供される:
[!] --source-port port[:port]
送信元ポートまたはポート範囲の指定。
詳細は TCP拡張の --source-port オプションの説明を参照すること。
[!] --destination-port port[:port]
送信先ポートまたはポート範囲の指定。
詳細は TCP拡張の --destination-port オプションの説明を参照すること。
-j
LOG - このルールにマッチするすべてのパケットのログを記録します。パケットのログがカーネルによって記録されるので、/etc/syslog.conf ファイルはこれらのログエントリーが書き込まれる位置を決めます。デフォルトでは、ログエントリーは /var/log/messages ファイルに置かれます。
ロギングの方法を指定するために、追加のオプションを LOG ターゲットの後に使用できます。
--log-level - ロギングイベントの優先レベルを設定します。優先レベルの一覧は syslog.conf man ページを参照してください。
デフォルト(--log-levelを指定しないとき) warning
--log-ip-options - IP パケットのヘッダーに設定されているすべてのオプションをログに記録します。
--log-prefix - ログ行が書き込まれる際に、ログ行の前に最大 29文字の文字列を置きます。これはパケットのロギングと共に syslog フィルターを作成する際に役立ちます。
注記
上記のオプションについては、(このオプションに関連した問題を考慮して) log-prefix 値に末尾のスペースを追加する必要があります。
--log-tcp-options - TCP パケットのヘッダーに設定されたオプションのログを記録します。
--log-tcp-sequence - パケットの TCP シーケンス番号をログに書き込みます。
ULOG
このターゲットは、マッチしたパケットをユーザー空間でログ記録する機能を提供する。
このターゲットがルールに設定されると、 Linux カーネルは、そのパケットを netlink
ソケットを用いてマルチキャストする。
そして、1 つ以上のユーザー空間プロセスがいろいろなマルチキャストグループに登録をおこない、
パケットを受信する。
LOG と同様、これは "非終了ターゲット" であり、 ルールの検討は次のルールへと継続される。
--ulog-nlgroup nlgroup
パケットを送信する netlink グループ (1-32) を指定する。 デフォルトの値は 1 である。
--ulog-prefix prefix
指定したプレフィックスをログメッセージの前に付ける。 32 文字までの指定できる。
ログの中でメッセージを区別するのに便利である。
--ulog-cprange size
ユーザー空間にコピーするパケットのバイト数。 値が 0
の場合、サイズに関係なく全パケットをコピーする。 デフォルトは 0 である。
--ulog-qthreshold size
カーネル内部のキューに入れられるパケットの数。 例えば、この値を 10 にした場合、 カーネル内部で
10 個のパケットをまとめ、 1 つの netlink マルチパートメッセージとしてユーザー空間に送る。
(過去のものとの互換性のため) デフォルトは 1 である。
TCPMSS
このターゲットを用いると、TCP の SYN パケットの MSS 値を書き換え、そのコネクションの最大サイズ
(通常は、送信インターフェースの MTUから 40 引いた値)を制御できる。 もちろん -p tcp と組み合わせてしか使えない。
このターゲットは犯罪的に頭のいかれた ISP や ICMP Fragmentation Needed パケットをブロックしてしまうサーバーを
乗り越えるために使用する。
Linuxファイアウォール/ルーターでは何も問題がないのに、そこにぶら下がるマシンでは以下のように大きなパケットを
やりとりできないというのが、この問題の兆候である。
1) ウェブ・ブラウザで接続が、何のデータも受け取らずにハングする
2) 短いメールは問題ないが、長いメールがハングする
3) ssh は問題ないが、scp は最初のハンドシェーク後にハングする
回避方法: このオプションを有効にし、以下のようなルールを ファイアウォールの設定に追加する。
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
--set-mss value
MSS オプションの値に指定した値を明示的に設定する。
--clamp-mss-to-pmtu
自動的に、MSS 値を (path_MTU - 40) に強制する。
これらのオプションはどちらか 1 つしか指定できない。
LOGで、--log-levelを、debugにした場合、
rsyslog.confを修正しないと、保管しない様だ
●facility は次のキーワードのいずれかである:
auth、 authpriv、 cron、 daemon、 kern、 lpr、 mail、 mark、 news、 security (auth と同じ)、 syslog、 user、 uucp、 local0からlocal7。
このうち security は今後は利用するべきでなく、また、 mark は内部利用のためのものなので、アプリケーションレベルで用いるべきではない。
ただし利用できないわけではない。 facility はメッセージを生成するサブシステムを規定する、
すなわち(例えば)全てのメイルプログラムは syslog を用いてログを記録する場合は mail facility (LOG_MAIL) を用いる。
●priority は以下のキーワードのいずれかである(昇順):
debug, info, notice, warning, warn ( warning と同じ), err, error (err と同じ), crit, alert, emerg, panic (emergと同じ).
このうちキーワード error、warn、panic については、同等のものがあるので今後は利用するべきでない。
priority はメッセージの重要性を定義する。
kern.debug /var/log/kern-debug
ルールをクリアするには、-Fを使用する。
# iptables -F
は、-t filter が、省略されています。iptables -t filter -F
# iptables -t nat -F
ポリシーの設定
INPUT:入ってくるパケット
FORWARD:転送パケット
OUTPUT:出て行くパケット
原則破棄
# tables -P INPUT DROP
# tables -P FORWARD DROP
原則許可
# tables -P OUTPUT ACCEPT
外部からのアクセスを許可する
SSHサーバーを公開する場合
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
外部向けDNSサーバーを運用する場合
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
Webサーバー(http)を公開する場合
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Webサーバー(HTTPS)を公開する場合
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
FTPサーバーを公開する場合
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
SMTPサーバーを公開する場合
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
SMTPSサーバーを公開する場合
# iptables -A INPUT -p tcp --dport 465 -j ACCEPT
POP3サーバーを公開する場合
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
POP3Sサーバーを公開する場合
# iptables -A INPUT -p tcp --dport 995 -j ACCEPT
IMAPサーバーを公開する場合
# iptables -A INPUT -p tcp --dport 143 -j ACCEPT
IMAPSサーバーを公開する場合
# iptables -A INPUT -p tcp --dport 993 -j ACCEPT
などを、設定する。
LinuxサーバーをPCルーターにする場合
前提とするネットワーク条件
内部のネットワークを192.168.10.0/24
内部のネットワークアダプタをeth0
外部接続のインターフェイスをppp0
# iptables -N Firewall-INPUT
# iptables -A INPUT -j Firewall-INPUT
# iprables -A Firewall-INPUT -i eth0 -j ACCEPT
SSHサーバーを公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 22 -j ACCEPT
外部向けDNSサーバーを運用する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 53 -j ACCEPT
# iptables -A Firewall-INPUT -i ppp0 -p udp --dport 53 -j ACCEPT
Webサーバー(http)を公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT
Webサーバー(HTTPS)を公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 443 -j ACCEPT
FTPサーバーを公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 21 -j ACCEPT
SMTPサーバーを公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 25 -j ACCEPT
SMTPSサーバーを公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 465 -j ACCEPT
POP3サーバーを公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 110 -j ACCEPT
POP3Sサーバーを公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 995 -j ACCEPT
IMAPサーバーを公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 143 -j ACCEPT
IMAPSサーバーを公開する場合
# iptables -A Firewall-INPUT -i ppp0 -p tcp --dport 993 -j ACCEPT
NetBIOS関連のパケットが外に出ないように
# iptables -A OUTPUT -o ppp0 -m multiport -p tcp --dport 135,137:139,445 -j DROP
# iptables -A OUTPUT -o ppp0 -m multiport -p udp --dport 135,137:139,445 -j DROP
を設定する。
スパムメールの対策としてiptablesを利用する。
# iptables -N SPAMFILTER
# iptables -N SPAMFILTERED
# iptables -A SPAMFILTERED -j LOG --log-prefix '[IPTABLES SPAMFILTER] : '
# iptables -A SPAMFILTERED -j DROP
# iptables -A INPUT -p tcp -j SPAMFILTER
58.18.0.0/16から、スパムメールが送られてくる場合
# iptables -A SPAMFILTER -s 58.18.0.0/16 -p tcp --dport 25 -j SPAMFILTERED
と、SPAMFILTERルールに追加する。
SPAMFILTERルールをクリアしたい場合、
# iptables -F SPAMFILTER
で、行うことが可能である。
内部から行ったアクセスに対する外部からの応答アクセスを許可
# iptables -A INPUT -i ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -i ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
コンソールにメッセージが表示されるため、
/etc/sysconfig/syslog を、修正
KLOGD_OPTIONS="-x"
から
KLOGD_OPTIONS="-x -c 4"
に、変更