Arch linuxのファイヤーウォールとして
iptablesを設定した。
- iptablesの取得
iptablesはpacmanから入手できる。
pacman -S iptables
必要なチェインの生成
# iptables -N TCP
# iptables -N UDP
ポリシーの設定
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
INPUT chainのpolicyをdropに設定する。
全てのトラフィックを破棄し、必要なものを指定して許可することがセキュアなファイヤーウォールの作り方らしい。
# iptables -P INPUT DROP
ESTABLISHED,RELATEDの許可
- ESTABLISHED
- 確立された既存のパケットと関係のあるパケット
- RELATED
- 既存のパケットと関係のある新しいセッションのパケット
# iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
loopbackの許可loopbak(lo)interfaceは多くのサービスやアプリケーションに必要である。
- loopback
- 自分自身に対するデータ通信
# iptables -A INPUT -i lo -j ACCEPT
INVALIDの破棄invalid状態のトラフィックを全て破棄すること。
トラフィックは状態により、NEW,ESTABLISHED,RELATED,INVALIDという4つのカテゴリに分けられる。
そして、"stateless"firewallよりもセキュアな"stateful"firewallを作ることが可能。
# iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
ICMP echo requestの許可(ping)PCがルータでなくなってから、他に状態NEWのICMPトラフィックは許可する必要はない。
# iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
OPEN chainsの設定トランスポート層でありネットワーク層のIPとセッション層のプロトコル橋渡しする。
- UDP
- user datagram protocol
- TCP
- transmission control protocol
新しい接続はsyn packetで始まる。
# iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
# iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
RST TCPコネクションと、ICMP port unreacheのUDP streamは拒絶(REJECT)する。これはデフォルトのLinuxのふるまい(RFC準拠)を模倣しており、接続停止の素早い許可と整理がなされる。
REJECT:dropとは違い、拒絶したことが送り側に返される。
RST:syn を送り、接続できなかった場合RSTパケットが送られてくる。
# iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
# iptables -A INPUT -p tcp -j REJECT --reject-with tcp-rst
他のプロトコルのための設定。これはデフォルトのLinuxの振る舞いを模倣している。
# iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable
以下ではFTP,SMPT,WEBを許可している。
FTPの許可
# iptables -A TCP -p tcp --dport 20 -j ACCEPT
# iptables -A TCP -p tcp --sport 20 -j ACCEPT
# iptables -A TCP -p tcp --dport 21 -j ACCEPT
# iptables -A TCP -p tcp --sport 21 -j ACCEPT
SMTP(送信)の許可
# iptables -A TCP -p tcp --dport 25 -j ACCEPT
# iptables -A TCP -p tcp --sport 25 -j ACCEPT
WEBの許可
# iptables -A TCP -p tcp --dport 80 -j ACCEPT
# iptables -A TCP -p tcp --sport 80 -j ACCEPT
spoofing attack対策(なりすまし)spoofing attackに対応するために/etc/sysctl.confを編集する。
vim /etc/sysctl.conf
net.ipv4.conf.all.rp_filter=1
Hide PCecho リクエストをブロックする。
vim /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all = 1
また、レート制限をすることは不正行為をコントロールするためには良い方法といえる。
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 30/min --limit-burst 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
ルールのセーブここまで行った操作を保存する。
# /etc/rc.d/iptables save
boot時の読み込み(/etc/rc.conf::networkの前に書く)boot時にiptablesが読み込まれるようにdaemonの設定をする。
DAEMONS=(... iptables network ...)
サーバ用ではない個人用のPCのファイアーウォールの設定としてArch linuxに以上のiptablesの設定をした。
参考リンク
Archwiki::Simple Stateful Firewall