わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

今週の成果: iptables

仕事場のとあるサーバには,古くはNICと言うんでしたっけ,LANのポートが2つありまして,一つは他の計算機と同じようにスイッチングハブにつないで外向けのアクセスをし,もう一つにも別のスイッチングハブをつけて内向けのネットワークを作っていました.
それぞれのネットワークアドレスの設定や,内向けのネットワークで何か接続したときにIPアドレスを割り当てる,DHCPサーバの設定,それとホスト名・IPアドレスの名前解決に必要なDNSの設定は,すでに済ませています.
それでIPアドレスの割り当てはできているのですが,そこからそのサーバを経由して,外へアクセスするのは,うまくいっていませんでした.
内外のアクセスを取り持つのは,iptablesです.これまでの設定では,どこかダメなようです.【Vine Linuxで自宅サーバー】サーバー機でルータ構築(PPPoE+iptables)の「iptablesファイヤーウォールIPマスカレードの設定」をいただいて,自分の環境に適した設定にしました.

#!/bin/bash

# Thanks to: http://vine.1-max.net/pc-router.html

#------------------------#
# インターフェイスの設定 #
#------------------------#
WAN='eth0' # 外部インタフェース
LAN='eth1' # 内部インタフェース

#----------------------------------------#
# ローカル・ネットワーク・アドレスの設定 #
#----------------------------------------#
LOCALNET='192.168.xxx.0/24' # ローカル・ネットワーク・アドレス

#------------------------#
# すべてのルールをクリア #
#------------------------#
iptables -F
#/etc/init.d/iptables stop

#--------------------------------------------------------------------------#
# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定 #
#--------------------------------------------------------------------------#
iptables -P INPUT   DROP   # 受信はすべて破棄
iptables -P FORWARD DROP   # 通過はすべて破棄
iptables -P OUTPUT  ACCEPT # 送信はすべて許可

#------------------------------------------------#
# ループバックアドレスからのアクセスをすべて許可 #
#------------------------------------------------#
iptables -A INPUT -i lo -j ACCEPT

#--------------------------------------------------#
# ローカルネットワーク内からのアクセスをすべて許可 #
#--------------------------------------------------#
iptables -A INPUT   -i $LAN -j ACCEPT
iptables -A FORWARD -i $LAN -j ACCEPT

#------------------------------------------------------#
# ローカルネットワーク内からのインターネット接続を許可 #
#------------------------------------------------------#
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

#------------------------------------------------------------#
# 内部から行ったアクセスに対する外部からの応答アクセスを許可 #
#------------------------------------------------------------#
iptables -A INPUT   -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT

#--------------------#
# フラグメントを破棄 #
#--------------------#
iptables -N fragment
iptables -A fragment -j LOG --log-prefix '[iptables FRAGMENT] '
iptables -A fragment -j DROP
iptables -A INPUT   -f -i $WAN -j fragment
iptables -A FORWARD -f -i $WAN -j fragment

#--------------------------#
# IPスプーフィング攻撃対策 #
#--------------------------#
iptables -N spoofing
iptables -A spoofing -j LOG --log-prefix '[iptables SPOOFING] '
iptables -A spoofing -j DROP
iptables -A INPUT   -i $WAN -s 127.0.0.0/8    -j spoofing
iptables -A INPUT   -i $WAN -s 10.0.0.0/8     -j spoofing
iptables -A INPUT   -i $WAN -s 172.16.0.0/12  -j spoofing
iptables -A INPUT   -i $WAN -s 192.168.0.0/16 -j spoofing
iptables -A FORWARD -i $WAN -s 127.0.0.0/8    -j spoofing
iptables -A FORWARD -i $WAN -s 10.0.0.0/8     -j spoofing
iptables -A FORWARD -i $WAN -s 172.16.0.0/12  -j spoofing
iptables -A FORWARD -i $WAN -s 192.168.0.0/16 -j spoofing

#-----------------------#
# Ping of Death攻撃対策 #
#-----------------------#
iptables -N ping-death
iptables -A ping-death -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A ping-death -j LOG --log-prefix '[iptables PING DEATH] '
iptables -A ping-death -j DROP
iptables -A INPUT   -i $WAN -p icmp --icmp-type echo-request -j ping-death
iptables -A FORWARD -i $WAN -p icmp --icmp-type echo-request -j ping-death

#-------------------------------#
# NetBIOS関連パケットの流出防止 #
#-------------------------------#
iptables -N net-bios
iptables -A net-bios -j LOG --log-prefix '[iptables NETBIOS] '
iptables -A net-bios -j DROP
iptables -A INPUT   -i $WAN -p tcp -m multiport --dports 135,137,138,139,445 -j net-bios
iptables -A INPUT   -i $WAN -p udp -m multiport --dports 135,137,138,139,445 -j net-bios
iptables -A OUTPUT  -o $WAN -p tcp -m multiport --sports 135,137,138,139,445 -j net-bios
iptables -A OUTPUT  -o $WAN -p udp -m multiport --sports 135,137,138,139,445 -j net-bios
iptables -A FORWARD -i $WAN -p tcp -m multiport --dports 135,137,138,139,445 -j net-bios
iptables -A FORWARD -i $WAN -p udp -m multiport --dports 135,137,138,139,445 -j net-bios
iptables -A FORWARD -o $WAN -p tcp -m multiport --sports 135,137,138,139,445 -j net-bios
iptables -A FORWARD -o $WAN -p udp -m multiport --sports 135,137,138,139,445 -j net-bios

#----------------------------------#
# 外部からの必須ICMPパケットを許可 #
#----------------------------------#
iptables -A INPUT   -i $WAN -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT   -i $WAN -p icmp --icmp-type source-quench -j ACCEPT
iptables -A INPUT   -i $WAN -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT   -i $WAN -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A FORWARD -i $WAN -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A FORWARD -i $WAN -p icmp --icmp-type source-quench -j ACCEPT
iptables -A FORWARD -i $WAN -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A FORWARD -i $WAN -p icmp --icmp-type parameter-problem -j ACCEPT

#-------------#
# Ingress対策 #
#-------------#
iptables -N Ingress
iptables -A Ingress -j LOG --log-prefix '[IPTABLES INGRESS] : '
iptables -A Ingress -j DROP
iptables -A FORWARD -i $LAN ! -s $LOCALNET -j Ingress

#-----------------#
# パスMTU問題対処 #
#-----------------#
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

#---------------------#
# SYNフラッド攻撃対策 #
#---------------------#
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

#---------------#
# Smurf攻撃対策 #
#---------------#
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#------------------------------------#
# メールサーバ等のレスポンス低下防止 #
#------------------------------------#
iptables -A INPUT   -p tcp --dport 113 -j REJECT --reject-with tcp-reset
iptables -A FORWARD -p tcp --dport 113 -j REJECT --reject-with tcp-reset

#---------------------------------------------------#
# FTPサーバー(21番ポート)へのアクセスをすべて許可 #
#---------------------------------------------------#
#iptables -A INPUT -i $WAN -p tcp --dport 21 -j ACCEPT

#------------------------------------------------#
# PASV用ポート(FTP-DATA)へのアクセスをすべて許可 #
# FTPサーバー構築でPASV用ポーを指定した場合のみ  #
#------------------------------------------------#
#iptables -A INPUT -i $WAN -p tcp --dport 4000:4029 -j ACCEPT

#-------------------------------------------------------#
# Webサーバー(80番ポート)HTTPへのアクセスをすべて許可 #
#-------------------------------------------------------#
iptables -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT

#---------------------------------------------------------#
# Webサーバー(433番ポート)HTTPSへのアクセスをすべて許可 #
# サーバー通信暗号化(HTTPS)を運営する場合のみ           #
#---------------------------------------------------------#
iptables -A INPUT -i $WAN -p tcp --dport 443 -j ACCEPT

#------------------------------------------------------#
# メールサーバー(25番ポート)へのアクセスをすべて許可 #
#------------------------------------------------------#
iptables -A INPUT -i $WAN -p tcp --dport 25 -j ACCEPT

#-------------------------------------------------------#
# メールサーバー(110番ポート)へのアクセスをすべて許可 #
#-------------------------------------------------------#
iptables -A INPUT -i $WAN -p tcp --dport 110 -j ACCEPT

#-----------------------------------------------------------#
# メールサーバー(143番ポート)IMAPへのアクセスをすべて許可 #
#-----------------------------------------------------------#
iptables -A INPUT -i $WAN -p tcp --dport 143 -j ACCEPT

#-------------------------------------------------------------#
# メールサーバー(993番ポート)IMAP4sへのアクセスをすべて許可 #
#-------------------------------------------------------------#
iptables -A INPUT -i $WAN -p tcp --dport 993 -j ACCEPT

#---------------------------------------------#
# 外部からの22番ポート(SSH)へのアクセスを許可 #
#---------------------------------------------#
iptables -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT

#---------------------------------------------------------------#
# LAN内からのみSSH(22番ポート)に接続を許可                    #
# 「外部からの22番ポート(SSH)へのアクセスを許可」しない場合のみ #
#---------------------------------------------------------------#
#iptables -A INPUT -s $LOCALNET -p tcp --dport 22 -j ACCEPT

#----------------------------------------#
# Usermin(20000番ポート)への接続を許可 #
# Userminを運営する場合のみ              #
#----------------------------------------#
#iptables -A INPUT -i $WAN -p tcp --dport 20000 -j ACCEPT

#----------------------------------------------------#
# LAN内からのみWebmin(10000番ポート)への接続を許可 #
#----------------------------------------------------#
#iptables -A INPUT -s $LOCALNET -p tcp --dport 10000 -j ACCEPT

#--------------------------------------------#
# 設定ルール外のアクセスはログを記録して破棄 #
#--------------------------------------------#
iptables -A INPUT   -j LOG --log-prefix '[iptables INPUT DROP] '
iptables -A INPUT   -j DROP
iptables -A FORWARD -j LOG --log-prefix '[iptables FORWARD DROP] '
iptables -A FORWARD -j DROP

#----------------#
# 設定内容の保存 #
#----------------#
#/etc/rc.d/init.d/iptables save

#------------------------#
# 再起動で設定内容を反映 #
#------------------------#
#service iptables restart

今後,見直したくなるかもしれないので,不要な設定は取り除くのではなく,コメントとしました.
あと,Linuxディストリビューションによっては,iptablesはサーバ起動時にサービスの一つとして立ち上がる(終了時には登録内容を保存するなど)ものもありますが,Ubuntuではそうなっていないので,少し手を加えました.以下rootで作業します.上記のスクリプトファイルを/root/iptables.shに保存してから(実行属性を忘れずに),crontab -eを実行し,

@reboot /root/iptables.sh

を書いて保存しました.crontabの各行は,空白区切りで「分」「時」「日」「月」「曜日」「コマンド」を書くのが基本ですが,@rebootについては,man 5 crontabを読み進めれば,使用できることが書かれています.
今はリブートは不要なので,単純に/root/iptablesを実行し…これで,うまくいきました.
ついでなので,ネットワークのチェックでよく使うコマンドを書いておきます.

  • IPアドレスを知りたければ,idconfig
  • ルーティングを知りたければ,route
  • iptablesの設定内容を知りたければ,iptables -L
  • DNSの設定内容を知りたければ,cat /etc/resolv.conf