yujiro's blog

webエンジニアをしています。

iptables についてのメモ

INPUT, OUTPUT ポリシーについて (httpの場合)

INPUT

  • sport => 他ホストの80番から自分への通信
  • dport => 他ホストから自分の80番への通信

OUTPUT

  • sport => 自分の80番から他ホストへの通信
  • dport => 自分からホストへの80番への通信

チェインとは

それぞれのテーブルの中で、どのタイミングでフィルタリングするかを決めるのがチェインです。例えば受信時についてはINPUT、送信時についてはOUTPUTといった具合です。

INPUT, FORWARD の違いについて

パケットを受信した際、まずパケットの送信先をチェックします。送信先がそのパケットを受信したホストそのものであれば、INPUTチェインに送られて定義されているルールに従って処理され、そのパケットを受け取る場合は適切なサービスに渡されます。送信先が別のホストであればFORWARDチェインに送られ、パケットの通過が許可されれば該当するホストへと転送されます。許可されなかったパケットは、そこで破棄されるというわけです。反対に、そのホストのプログラムによって生成されたパケットはOUTPUTチェインでチェックされ、許可されれば送信先へと送り出されます。

state オプション

  • ESTABLISHED
  • INVALID
  • NEW
  • RELATED

上記4つが指定可能

設定を持続させる iptables-persistent について

iptables の設定を /etc/iptables/rules.v4 に保存

$ sudo service iptables-persistent save

/etc/iptables/rules.v4 にかかれた設定を iptables に反映

$ sudo service iptables-persistent reload

俺史上発展途上のiptables をさらす

最後に自分が作ったスクリプトを晒します。一応DOS対策もしています。(このあたりまた書きます)

普通に考えて下記記事で紹介されているものが最強かと思いますが、

自分で試行錯誤して改良していきたいと思いいます。

俺史上最強のiptablesをさらす

#!/bin/bash

# Ports
SSH=19921
#FTP=20,21
DNS=53
SMTP=25,465,587
POP3=110,995
#IMAP=143,993
HTTP=80,443
#IDENT=113
#NTP=123
#MYSQL=3306
#NET_BIOS=135,137,138,139,445
#DHCP=67,68
DKIM=8891

# Initialize 
iptables -F
iptables -X

# Policy
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# 自分自身は許可
iptables -A INPUT -m state --state NEW -s 127.0.0.1 -j ACCEPT

# Dos protection
iptables -N Attacker
iptables -A Attacker -m recent --set --name attacker -j LOG --log-level warning --log-prefix 'Attaker:'
iptables -A Attacker -j DROP

iptables -A INPUT -p tcp -m state --state NEW -m recent --rcheck --seconds 15 --name attacker -j DROP

iptables -A INPUT -m multiport -p tcp --dports ${HTTP} -m state --state NEW -m recent --set --name PreAttacker
iptables -A INPUT -m multiport -p tcp --dports ${HTTP} -m state --state NEW -m recent --update --seconds 1 --hitcount 20 --rttl --name PreAttacker -j Attacker

# セッション確立後のパケット疎通は許可
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH
iptables -A INPUT -p tcp --dport ${SSH} -j ACCEPT

# HTTP, HTTPS
iptables -A INPUT -p tcp -m multiport --dports ${HTTP} -j ACCEPT

# SMTP
iptables -A INPUT -p tcp -m multiport --dports ${SMTP} -j ACCEPT

# POP3
iptables -A INPUT -p tcp -m multiport --dports ${POP3} -j ACCEPT

# ICMP 
iptables -A INPUT -p icmp -j ACCEPT # ANY -> SELF

# DKIM
iptables -A INPUT -p tcp --dport ${DKIM} -j ACCEPT

# DNS
iptables -A INPUT -p udp --source-port ${DNS} -j ACCEPT

参考

オプションについての説明

上記の魚拓

state について

iptables で不正アクセスをブロック

コピペから脱出!iptablesの仕組みを理解して環境に合わせた設定をしよう

Ubuntuでiptablesを再起動後にも保持する方法

俺史上最強のiptablesをさらす

iptables -F に気をつけよう

Linuxで作るファイアウォール[パケットフィルタリング設定編] (½)

iptables の ipt_recent で ssh の brute force attack 対策

OSI参照モデル

大量のアクセスを試みる迷惑な接続元を制限する(iptables hashlimit)

TCP/IP 4階層モデルとは?

IPアドレスの基礎知識