[root@fedora ~]# vi iptables-router.sh ← IPマスカレード&ファイアウォール設定スクリプト作成※
#!/bin/bash
#---------------------------------------#
# 設定開始 #
#---------------------------------------#
# 内部インタフェース名定義
LAN=eth0
# 公開外部インタフェース名定義
PUBLIC_WAN=ppp0
# 公開サーバープライベートIPアドレス定義
SERVER=192.168.1.1
#---------------------------------------#
# 設定終了 #
#---------------------------------------#
# 自ホストプライベートIPアドレス取得
IPADDR=`ifconfig $LAN|sed -e 's/^.*inet addr:\([^ ]*\).*$/\1/p' -e d`
# 内部ネットワークのネットマスク取得
LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`
# 内部ネットワークアドレス取得
LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|grep 0.0.0.0|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK
# 外部インタフェース名取得
# ※マルチセッション対応
cd /etc/sysconfig/network-scripts
WANLIST=`ls ifcfg-ppp* | LANG=C egrep -v '(ifcfg-lo|:|-range|rpmsave|rpmorig|rpmnew)' | \
LANG=C egrep -v '(~|\.bak)$' | \
LANG=C egrep 'ifcfg-[A-Za-z0-9\._-]+$' | \
sed 's/^ifcfg-//g' |
sed 's/[0-9]/ &/' | LANG=C sort -k 1,1 -k 2n | sed 's/ //'`
# 読み込み対象モジュール追加
sed -i '/IPTABLES_MODULES/d' /etc/sysconfig/iptables-config
modinfo ip_nat_pptp > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "IPTABLES_MODULES=\"ip_conntrack_ftp ip_nat_ftp ip_nat_pptp\"" >> /etc/sysconfig/iptables-config
else
echo "IPTABLES_MODULES=\"ip_conntrack_ftp ip_nat_ftp\"" >> /etc/sysconfig/iptables-config
fi
# パケット転送停止
# ※ルール設定中のパケット通過防止
sysctl -w net.ipv4.ip_forward=0 > /dev/null
# ファイアウォール停止(すべてのルールをクリア)
/etc/rc.d/init.d/iptables stop
# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
iptables -P INPUT DROP # 受信はすべて破棄
iptables -P OUTPUT ACCEPT # 送信はすべて許可
iptables -P FORWARD DROP # 通過はすべて破棄
# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf
# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done
# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done
# フラグメント化されたパケットはログを記録して破棄
iptables -N LOG_FRAGMENT
iptables -A LOG_FRAGMENT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A LOG_FRAGMENT -j DROP
iptables -A INPUT -f -j LOG_FRAGMENT
iptables -A FORWARD -f -j LOG_FRAGMENT
# 外部からの送信元がプライベートIPアドレスのパケットはログを記録して破棄
# ※IP spoofing攻撃対策
iptables -N LOG_SPOOFING
iptables -A LOG_SPOOFING -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES SPOOFING] : '
iptables -A LOG_SPOOFING -j DROP
for WAN in $WANLIST
do
iptables -A INPUT -i $WAN -s 127.0.0.0/8 -j LOG_SPOOFING
iptables -A INPUT -i $WAN -s 10.0.0.0/8 -j LOG_SPOOFING
iptables -A INPUT -i $WAN -s 172.16.0.0/12 -j LOG_SPOOFING
iptables -A INPUT -i $WAN -s 192.168.0.0/16 -j LOG_SPOOFING
iptables -A FORWARD -i $WAN -s 127.0.0.0/8 -j LOG_SPOOFING
iptables -A FORWARD -i $WAN -s 10.0.0.0/8 -j LOG_SPOOFING
iptables -A FORWARD -i $WAN -s 172.16.0.0/12 -j LOG_SPOOFING
iptables -A FORWARD -i $WAN -s 192.168.0.0/16 -j LOG_SPOOFING
done
# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
for WAN in $WANLIST
do
iptables -A INPUT -i $WAN -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A INPUT -i $WAN -p udp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A OUTPUT -o $WAN -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A OUTPUT -o $WAN -p udp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A FORWARD -i $WAN -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A FORWARD -i $WAN -p udp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A FORWARD -o $WAN -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A FORWARD -o $WAN -p udp -m multiport --sports 135,137,138,139,445 -j DROP
done
# 1秒間に4回を超えるpingはログを記録して破棄
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH
iptables -A FORWARD -o ! $WAN -p icmp --icmp-type echo-request -j LOG_PINGDEATH
# 送信元IPアドレスが内部ネットワーク範囲外のアクセスはログを記録して破棄
# ※Ingress対策
iptables -N LOG_INGRESS
iptables -A LOG_INGRESS -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES INGRESS] : '
iptables -A LOG_INGRESS -j DROP
iptables -A FORWARD -i $LAN -s ! $LOCALNET -j LOG_INGRESS
# パスMTU問題対処
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT
# 内部からのアクセスをすべて許可
iptables -A INPUT -i $LAN -j ACCEPT
iptables -A FORWARD -i $LAN -j ACCEPT
# 内部からのインターネットへの同時接続を可能にする
# ※IP masquerade(NAPT)
for WAN in $WANLIST
do
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
done
# 内部から行ったアクセスに対する外部からの返答アクセスを許可
for WAN in $WANLIST
do
iptables -A INPUT -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT
done
# 外部からの必須ICMPパケットを許可
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type source-quench -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type parameter-problem -j ACCEPT
# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
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
#----------------------------------------------------------#
# 自ホストが各種サービスを公開する場合の設定(ここから) #
#----------------------------------------------------------#
router_eq_server(){
# 外部からの22番ポート(SSH)へのアクセスを許可
# ※SSHサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 22 -j ACCEPT
# 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可
# ※外部向けDNSサーバーを運用する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i $PUBLIC_WAN -p udp --dport 53 -j ACCEPT
# 外部からの80番ポート(HTTP)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 80 -j ACCEPT
# 外部からの443番ポート(HTTPS)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 443 -j ACCEPT
# 外部からの21番ポート(FTP)へのアクセスを許可
# ※FTPサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 21 -j ACCEPT
# 外部からのPASV用ポート(FTP-DATA)へのアクセスを許可
# ※FTPサーバーを公開する場合のみ
# ※PASV用ポート60000:60030は当サイトの設定例
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 60000:60030 -j ACCEPT
# 外部からの25番ポート(SMTP)へのアクセスを許可
# ※SMTPサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 25 -j ACCEPT
# 外部からの465番ポート(SMTPS)へのアクセスを許可
# ※SMTPSサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 465 -j ACCEPT
# 外部からの110番ポート(POP3)へのアクセスを許可
# ※POP3サーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 110 -j ACCEPT
# 外部からの995番ポート(POP3S)へのアクセスを許可
# ※POP3Sサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 995 -j ACCEPT
# 外部からの143番ポート(IMAP)へのアクセスを許可
# ※IMAPサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 143 -j ACCEPT
# 外部からの993番ポート(IMAPS)へのアクセスを許可
# ※IMAPSサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 993 -j ACCEPT
# 外部からの1723番ポート(PPTP)へのアクセスを許可
# 外部からのGREプロトコルへのアクセスを許可
# ※PPTPサーバーを公開する場合のみ
iptables -A INPUT -i $PUBLIC_WAN -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -i $PUBLIC_WAN -p gre -j ACCEPT
}
#----------------------------------------------------------#
# 自ホストが各種サービスを公開する場合の設定(ここまで) #
#----------------------------------------------------------#
#----------------------------------------------------------#
# 他ホストが各種サービスを公開する場合の設定(ここから) #
#----------------------------------------------------------#
router_ne_server(){
# 外部からの公開サーバーの22番ポート(SSH)へのアクセスを許可&転送
# ※SSHサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 22 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 22 -j DNAT --to $SERVER
# 外部からの公開サーバーのTCP/UDP53番ポート(DNS)へのアクセスを許可&転送
# ※外部向けDNSサーバーを運用する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 53 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 53 -j DNAT --to $SERVER
iptables -A FORWARD -i $PUBLIC_WAN -p udp -d $SERVER --dport 53 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p udp --dport 53 -j DNAT --to $SERVER
# 外部からの公開サーバーの80番ポート(HTTP)へのアクセスを許可&転送
# ※Webサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 80 -j DNAT --to $SERVER
# 外部からの公開サーバーの443番ポート(HTTPS)へのアクセスを許可&転送
# ※Webサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 443 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 443 -j DNAT --to $SERVER
# 外部からの公開サーバーの21番ポート(FTP)へのアクセスを許可&転送
# ※FTPサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 21 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 21 -j DNAT --to $SERVER
# 外部からの公開サーバーのPASV用ポート(FTP-DATA)へのアクセスを許可&転送
# ※FTPサーバーを公開する場合のみ
# ※PASV用ポート60000:60030は当サイトの設定例
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 60000:60030 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 60000:60030 -j DNAT --to $SERVER
# 外部からの公開サーバーの25番ポート(SMTP)へのアクセスを許可&転送
# ※SMTPサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 25 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 25 -j DNAT --to $SERVER
# 外部からの公開サーバーの465番ポート(SMTPS)へのアクセスを許可&転送
# ※SMTPSサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 465 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 465 -j DNAT --to $SERVER
# 外部からの公開サーバーの110番ポート(POP3)へのアクセスを許可&転送
# ※POP3サーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 110 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 110 -j DNAT --to $SERVER
# 外部からの公開サーバーの995番ポート(POP3S)へのアクセスを許可&転送
# ※POP3Sサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 995 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 995 -j DNAT --to $SERVER
# 外部からの公開サーバーの143番ポート(IMAP)へのアクセスを許可&転送
# ※IMAPサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 143 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 143 -j DNAT --to $SERVER
# 外部からの公開サーバーの993番ポート(IMAPS)へのアクセスを許可&転送
# ※IMAPSサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p tcp -d $SERVER --dport 993 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p tcp --dport 993 -j DNAT --to $SERVER
# 外部からの公開サーバーのUDP1194番ポート(OpenVPN)へのアクセスを許可&転送
# ※OpenVPNサーバーを公開する場合のみ
iptables -A FORWARD -i $PUBLIC_WAN -p udp -d $SERVER --dport 1194 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p udp --dport 1194 -j DNAT --to $SERVER
iptables -A FORWARD -i $PUBLIC_WAN -p udp -d $SERVER --dport 2304 -j ACCEPT
iptables -t nat -A PREROUTING -i $PUBLIC_WAN -p udp --dport 2304 -j DNAT --to $SERVER
}
#----------------------------------------------------------#
# 他ホストが各種サービスを公開する場合の設定(ここまで) #
#----------------------------------------------------------#
# 公開サーバーが自ホストの場合のルール設定を行う
[ "$SERVER" = "$IPADDR" ] || [ $SERVER = 127.0.0.1 ] && router_eq_server
# 公開サーバーが他ホストの場合のルール設定を行う
[ "$SERVER" != "$IPADDR" ] && [ $SERVER != 127.0.0.1 ] && router_ne_server
# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP
# 再起動時にも上記設定が有効となるようにルールを保存
/etc/rc.d/init.d/iptables save
# ファイアウォール起動
/etc/rc.d/init.d/iptables start
# パケット転送開始
sysctl -w net.ipv4.ip_forward=1 > /dev/null
sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@fedora ~]# chmod 700 iptables-router.sh ← IPマスカレード&ファイアウォール設定スクリプトへ実行権限付加
[root@fedora ~]# ./iptables-router.sh ← IPマスカレード&ファイアウォール設定スクリプト実行
ファイアウォールルールを適用中: [ OK ]
チェインポリシーを ACCEPT に設定中filter nat [ OK ]
iptables モジュールを取り外し中 [ OK ]
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[ OK ]
ファイアウォールルールを適用中: [ OK ]
チェインポリシーを ACCEPT に設定中nat filter [ OK ]
iptables モジュールを取り外し中 [ OK ]
iptables ファイアウォールルールを適用中: [ OK ]
iptables モジュールを読み込み中ip_conntrack_ftp ip_nat_ftp [ OK ]
|
|