#!/bin/bash #---------------------------------------# # 設定開始 # #---------------------------------------# # LANインタフェース名定義 LAN=eth0 # WANインタフェース名定義 WAN=ppp0 # 公開サーバープライベートIPアドレス定義 SERVER=192.168.1.3 #---------------------------------------# # 設定終了 # #---------------------------------------# # 自ホストプライベートIPアドレス取得 IPADDR=`ifconfig $LAN|sed -e 's/^.*inet addr:\([^ ]*\).*$/\1/p' -e d` # LANネットマスク取得 LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` # LANネットワークアドレス取得 LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|grep 0.0.0.0|cut -f1 -d' '` LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK # 読み込み対象モジュール追加 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 # パスMTU問題対処 iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定 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 # WANからの送信元がプライベート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 iptables -A INPUT -i ppp+ -s 127.0.0.0/8 -j LOG_SPOOFING iptables -A INPUT -i ppp+ -s 10.0.0.0/8 -j LOG_SPOOFING iptables -A INPUT -i ppp+ -s 172.16.0.0/12 -j LOG_SPOOFING iptables -A INPUT -i ppp+ -s 192.168.0.0/16 -j LOG_SPOOFING iptables -A FORWARD -i ppp+ -s 127.0.0.0/8 -j LOG_SPOOFING iptables -A FORWARD -i ppp+ -s 10.0.0.0/8 -j LOG_SPOOFING iptables -A FORWARD -i ppp+ -s 172.16.0.0/12 -j LOG_SPOOFING iptables -A FORWARD -i ppp+ -s 192.168.0.0/16 -j LOG_SPOOFING # WANとのNetBIOS関連のアクセスはログを記録せずに破棄 iptables -A INPUT -i ppp+ -p tcp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A INPUT -i ppp+ -p udp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A OUTPUT -o ppp+ -p tcp -m multiport --sports 135,137,138,139,445 -j DROP iptables -A OUTPUT -o ppp+ -p udp -m multiport --sports 135,137,138,139,445 -j DROP iptables -A FORWARD -i ppp+ -p tcp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A FORWARD -i ppp+ -p udp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A FORWARD -o ppp+ -p tcp -m multiport --sports 135,137,138,139,445 -j DROP iptables -A FORWARD -o ppp+ -p udp -m multiport --sports 135,137,138,139,445 -j DROP # 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 ! ppp+ -p icmp --icmp-type echo-request -j LOG_PINGDEATH # 送信元IPアドレスがLANネットワーク範囲外のアクセスはログを記録して破棄 # ※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 # 自ホストからのアクセスをすべて許可 iptables -A INPUT -i lo -j ACCEPT # LANからのアクセスをすべて許可 iptables -A INPUT -i $LAN -j ACCEPT iptables -A FORWARD -i $LAN -j ACCEPT # LANからのインターネットへの同時接続を可能にする # ※IP masquerade(NAPT) iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE # LANから行ったアクセスに対するWANからの返答アクセスを許可 iptables -A INPUT -i ppp+ -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i ppp+ -m state --state ESTABLISHED,RELATED -j ACCEPT # DNS応答アクセスを許可 iptables -A INPUT -p udp --sport 53 -j ACCEPT # WANからの必須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 # ACCEPT_COUNTRY_MAKE関数定義 # 指定された国のIPアドレスからのアクセスを許可するユーザ定義チェイン作成 ACCEPT_COUNTRY_MAKE(){ for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'` do iptables -A ACCEPT_COUNTRY -s $addr -j ACCEPT done } # DROP_COUNTRY_MAKE関数定義 # 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成 DROP_COUNTRY_MAKE(){ for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'` do iptables -A DROP_COUNTRY -s $addr -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_COUNTRY] : ' iptables -A DROP_COUNTRY -s $addr -j DROP done } # IPアドレスリスト取得 . /root/iptables_functions IPLISTGET # 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成 iptables -N ACCEPT_COUNTRY ACCEPT_COUNTRY_MAKE JP # 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する # 中国・台湾・ロシア※からのアクセスをログを記録して破棄 # ※全国警察施設への攻撃元上位3カ国(日本・アメリカを除く) # http://www.cyberpolice.go.jp/detect/observation.htmlより iptables -N DROP_COUNTRY DROP_COUNTRY_MAKE CN DROP_COUNTRY_MAKE TW DROP_COUNTRY_MAKE RU iptables -A INPUT -j DROP_COUNTRY iptables -A FORWARD -j DROP_COUNTRY #----------------------------------------------------------# # 自ホストが各種サービスを公開する場合の設定(ここから) # #----------------------------------------------------------# router_eq_server(){ # WANからの22番ポート(SSH)へのアクセスを許可 # ※SSHサーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT_COUNTRY # WANからのTCP/UDP53番ポート(DNS)へのアクセスを許可 # ※WAN向けDNSサーバーを運用する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 53 -j ACCEPT iptables -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT # WANからの80番ポート(HTTP)へのアクセスを許可 # ※Webサーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT # WANからの443番ポート(HTTPS)へのアクセスを許可 # ※Webサーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 443 -j ACCEPT # WANからの21番ポート(FTP)へのアクセスを許可 # ※FTPサーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 21 -j ACCEPT_COUNTRY # WANからのPASV用ポート(FTP-DATA)へのアクセスを許可 # ※FTPサーバーを公開する場合のみ # ※PASV用ポート60000:60030は当サイトの設定例 iptables -A INPUT -i $WAN -p tcp --dport 60000:60030 -j ACCEPT_COUNTRY # WANからの25番ポート(SMTP)へのアクセスを許可 # ※SMTPサーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 25 -j ACCEPT # WANからの465番ポート(SMTPS)へのアクセスを許可 # ※SMTPSサーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 465 -j ACCEPT_COUNTRY # WANからの110番ポート(POP3)へのアクセスを許可 # ※POP3サーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 110 -j ACCEPT_COUNTRY # WANからの995番ポート(POP3S)へのアクセスを許可 # ※POP3Sサーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 995 -j ACCEPT_COUNTRY # WANからの143番ポート(IMAP)へのアクセスを許可 # ※IMAPサーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 143 -j ACCEPT_COUNTRY # WANからの993番ポート(IMAPS)へのアクセスを許可 # ※IMAPSサーバーを公開する場合のみ iptables -A INPUT -i $WAN -p tcp --dport 993 -j ACCEPT_COUNTRY } #----------------------------------------------------------# # 自ホストが各種サービスを公開する場合の設定(ここまで) # #----------------------------------------------------------# #----------------------------------------------------------# # 他ホストが各種サービスを公開する場合の設定(ここから) # #----------------------------------------------------------# router_ne_server(){ # WANからの公開サーバーの22番ポート(SSH)へのアクセスを許可&転送 # ※SSHサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 22 -j ACCEPT_COUNTRY iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 22 -j DNAT --to $SERVER # WANからの公開サーバーのTCP/UDP53番ポート(DNS)へのアクセスを許可&転送 # ※WAN向けDNSサーバーを運用する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 53 -j ACCEPT iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 53 -j DNAT --to $SERVER iptables -A FORWARD -i $WAN -p udp -d $SERVER --dport 53 -j ACCEPT iptables -t nat -A PREROUTING -i $WAN -p udp --dport 53 -j DNAT --to $SERVER # WANからの公開サーバーの80番ポート(HTTP)へのアクセスを許可&転送 # ※Webサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 80 -j ACCEPT iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j DNAT --to $SERVER # WANからの公開サーバーの443番ポート(HTTPS)へのアクセスを許可&転送 # ※Webサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 443 -j ACCEPT iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 443 -j DNAT --to $SERVER # WANからの公開サーバーの21番ポート(FTP)へのアクセスを許可&転送 # ※FTPサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 21 -j ACCEPT_COUNTRY iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 21 -j DNAT --to $SERVER # WANからの公開サーバーのPASV用ポート(FTP-DATA)へのアクセスを許可&転送 # ※FTPサーバーを公開する場合のみ # ※PASV用ポート60000:60030は当サイトの設定例 iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 60000:60030 -j ACCEPT_COUNTRY iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 60000:60030 -j DNAT --to $SERVER # WANからの公開サーバーの25番ポート(SMTP)へのアクセスを許可&転送 # ※SMTPサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 25 -j ACCEPT iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 25 -j DNAT --to $SERVER # WANからの公開サーバーの465番ポート(SMTPS)へのアクセスを許可&転送 # ※SMTPSサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 465 -j ACCEPT_COUNTRY iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 465 -j DNAT --to $SERVER # WANからの公開サーバーの110番ポート(POP3)へのアクセスを許可&転送 # ※POP3サーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 110 -j ACCEPT_COUNTRY iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 110 -j DNAT --to $SERVER # WANからの公開サーバーの995番ポート(POP3S)へのアクセスを許可&転送 # ※POP3Sサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 995 -j ACCEPT_COUNTRY iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 995 -j DNAT --to $SERVER # WANからの公開サーバーの143番ポート(IMAP)へのアクセスを許可&転送 # ※IMAPサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 143 -j ACCEPT_COUNTRY iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 143 -j DNAT --to $SERVER # WANからの公開サーバーの993番ポート(IMAPS)へのアクセスを許可&転送 # ※IMAPSサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p tcp -d $SERVER --dport 993 -j ACCEPT_COUNTRY iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 993 -j DNAT --to $SERVER # WANからの公開サーバーのUDP1194番ポート(OpenVPN)へのアクセスを許可&転送 # ※OpenVPNサーバーを公開する場合のみ iptables -A FORWARD -i $WAN -p udp -d $SERVER --dport 1194 -j ACCEPT_COUNTRY iptables -t nat -A PREROUTING -i $WAN -p udp --dport 1194 -j DNAT --to $SERVER } #----------------------------------------------------------# # 他ホストが各種サービスを公開する場合の設定(ここまで) # #----------------------------------------------------------# # 拒否IPアドレスからのアクセスはログを記録せずに破棄 # ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと # (/root/deny_ipがなければなにもしない) if [ -s /root/deny_ip ]; then for ip in `cat /root/deny_ip` do iptables -I INPUT -s $ip -j DROP done fi # 公開サーバーが自ホストの場合のルール設定を行う [ "$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