いらっしゃいませ
ここではiptablesの設定について掲載しています。
iptablesとは…?
簡単に説明すると、ファイアウォールです。Windowsにもファイアウォールソフトってありますよね?アレです。
ただ、Windowsのとは違い、グラフィックを用いて操作しないのでちょっととっつきにくいですが、適切に設定することでセキュリティを高めることが出来ます。
iptablesの設定
いちいちコマンドで打ち込んでいるとめんどくさいので、スクリプトで一気に設定したいと思います。
iptables設定スクリプト
スクリプトファイルを作り、以下を丸ごとコピーします。Tera Termの場合、テキストモードにしておいてマウスの右クリック、または"Alt + v"で貼り付け可能です。
スクリプトはScientific Linuxで自宅サーバー構築様のものを参考にさせて頂きます。
[root@sl ~]# vi iptables.sh
#!/bin/bash #---------------------------------------# # 設定開始 # #---------------------------------------# # インタフェース名定義 LAN=eth0 #---------------------------------------# # 設定終了 # #---------------------------------------# # 内部ネットワークのネットマスク取得 LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` # 内部ネットワークアドレス取得 LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '` LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK # ファイアウォール停止(すべてのルールをクリア) /etc/rc.d/init.d/iptables stop # デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定 iptables -P INPUT DROP # 受信はすべて破棄 iptables -P OUTPUT ACCEPT # 送信はすべて許可 iptables -P FORWARD DROP # 通過はすべて破棄 # 自ホストからのアクセスをすべて許可 iptables -A INPUT -i lo -j ACCEPT # 内部からのアクセスをすべて許可 iptables -A INPUT -s $LOCALNET -j ACCEPT # 内部から行ったアクセスに対する外部からの返答アクセスを許可 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 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 -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : ' iptables -A INPUT -f -j DROP # 外部とのNetBIOS関連のアクセスはログを記録せずに破棄 # ※不要ログ記録防止 iptables -A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP iptables -A OUTPUT ! -d $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP # 1秒間に4回を超えるpingはログを記録して破棄 # ※Ping of Death攻撃対策 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 INPUT -d 255.255.255.255 -j DROP iptables -A INPUT -d 224.0.0.1 -j DROP # 113番ポート(IDENT)へのアクセスには拒否応答 # ※メールサーバ等のレスポンス低下防止 iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset #----------------------------------------------------------# # 各種サービスを公開する場合の設定(ここから) # #----------------------------------------------------------# # 外部からのTCP22番ポート(SSH)へのアクセスを許可 # ※SSHサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可 # ※外部向けDNSサーバーを運用する場合のみ #iptables -A INPUT -p tcp --dport 53 -j ACCEPT #iptables -A INPUT -p udp --dport 53 -j ACCEPT # 外部からのUDP123ポート(NTP)へのアクセスを許可 # ※外部向けNTPサーバーを運用する場合のみ #iptables -A INPUT -p udp --dport 123 -j ACCEPT # 外部からのTCP80番ポート(HTTP)へのアクセスを許可 # ※Webサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 外部からのTCP443番ポート(HTTPS)へのアクセスを許可 # ※Webサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 外部からのTCP21番ポート(FTP)へのアクセスをみ許可 # ※FTPサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 21 -j ACCEPT # 外部からのTCP990番ポート(FTPS)へのアクセスをみ許可 # ※FTPサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 990 -j ACCEPT # 外部からのPASV用ポート(FTP-DATA)へのアクセスを許可 # ※FTPサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 64000:64029 -j ACCEPT # 外部からのTCP25番ポート(SMTP)へのアクセスを許可 # ※SMTPサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 25 -j ACCEPT # 外部からのTCP465番ポート(SMTPS)へのアクセスを許可 # ※SMTPSサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 465 -j ACCEPT # 外部からのTCP110番ポート(POP3)へのアクセスを許可 # ※POP3サーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 110 -j ACCEPT # 外部からのTCP995番ポート(POP3S)へのアクセスを許可 # ※POP3Sサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 995 -j ACCEPT # 外部からのTCP143番ポート(IMAP)へのアクセスを許可 # ※IMAPサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 143 -j ACCEPT # 外部からのTCP993番ポート(IMAPS)へのアクセスを許可 # ※IMAPSサーバーを公開する場合のみ iptables -A INPUT -p tcp --dport 993 -j ACCEPT # 外部からのUDP1194番ポート(OpenVPN)へのアクセスを許可 # ※OpenVPNサーバーを公開する場合のみ #iptables -A INPUT -p udp --dport 1194 -j ACCEPT # VPNインタフェース用ファイアウォール設定 # ※OpenVPNサーバーを公開する場合のみ #[ -f /etc/openvpn/openvpn-startup ] && /etc/openvpn/openvpn-startup # FORWARD設定 iptables -A FORWARD -s $LOCALNET -j ACCEPT iptables -A FORWARD -d $LOCALNET -j ACCEPT # L2TP/IPSec #iptables -A INPUT -p udp --dport 1701 -j ACCEPT #iptables -A INPUT -p udp --dport 500 -j ACCEPT #iptables -A INPUT -p udp --dport 4500 -j ACCEPT #iptables -A INPUT -p esp -j ACCEPT #----------------------------------------------------------# # 各種サービスを公開する場合の設定(ここまで) # #----------------------------------------------------------# # 拒否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 # 上記のルールにマッチしなかったアクセスはログを記録して破棄 iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : ' iptables -A INPUT -j DROP iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : ' iptables -A FORWARD -j DROP # サーバー再起動時にも上記設定が有効となるようにルールを保存 /etc/rc.d/init.d/iptables save # ファイアウォール起動 /etc/rc.d/init.d/iptables start
スクリプトを実行
[root@sl ~]# chmod +x iptables.sh
[root@sl ~]# ./iptables.sh
iptables: ファイアウォールのルールを /etc/sysconfig/iptable[ OK ]中: iptables: ファイアウォールルールを適用中: [ OK ]
ルールの一覧を確認
スクリプトを走らせたら、きちんと設定されているかを確認します。
[root@co ~]# iptables -L
Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- 192.168.10.0/24 anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED LOG all -f anywhere anywhere LOG level warning prefix `[IPTABLES FRAGMENT] : ' DROP all -f anywhere anywhere DROP tcp -- !192.168.10.0/24 anywhere multiport dports epmap,netbios-ns,netbios-dgm, netbios-ssn,microsoft-ds DROP udp -- !192.168.10.0/24 anywhere multiport dports epmap,netbios-ns,netbios-dgm, netbios-ssn,microsoft-ds LOG_PINGDEATH icmp -- anywhere anywhere icmp echo-request DROP all -- anywhere 255.255.255.255 DROP all -- anywhere all-systems.mcast.net REJECT tcp -- anywhere anywhere tcp dpt:auth reject-with tcp-reset ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:ftp ACCEPT tcp -- anywhere anywhere tcp dpt:ftps ACCEPT tcp -- anywhere anywhere tcp dpts:64000:64029 ACCEPT tcp -- anywhere anywhere tcp dpt:smtp ACCEPT tcp -- anywhere anywhere tcp dpt:urd ACCEPT tcp -- anywhere anywhere tcp dpt:imap ACCEPT tcp -- anywhere anywhere tcp dpt:imaps LOG all -- anywhere anywhere limit: avg 1/sec burst 5 LOG level warning pref ix `[IPTABLES INPUT] : ' DROP all -- anywhere anywhere Chain FORWARD (policy DROP) target prot opt source destination ACCEPT all -- 192.168.10.0/24 anywhere ACCEPT all -- anywhere 192.168.10.0/24 LOG all -- anywhere anywhere limit: avg 1/sec burst 5 LOG level warning pref ix `[IPTABLES FORWARD] : ' DROP all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere !192.168.10.0/24 multiport sports epmap,netbios-ns,netbios-dgm, netbios-ssn,microsoft-ds DROP udp -- anywhere !192.168.10.0/24 multiport sports epmap,netbios-ns,netbios-dgm, netbios-ssn,microsoft-ds Chain LOG_PINGDEATH (1 references) target prot opt source destination ACCEPT all -- anywhere anywhere limit: avg 1/sec burst 4 LOG all -- anywhere anywhere LOG level warning prefix `[IPTABLES PINGDEATH] : ' DROP all -- anywhere anywhere
ごちゃごちゃと書いてありますが、簡単に説明すると、ここでのルールは以下の通りです。
1.ローカルネットワーク内からのアクセスは無条件で許可
2.SSH、HTTP(S)、FTP(Pasv)、SMTP(S)、IMAP(S)での接続を許可
3.あとは基本的に破棄(拒否)
#の付いた行はコメントとして扱われます。例えばDNSへの接続を許可したい場合は、関係する行の#を消してください。
その他、追加したいルールがある場合は改造して使ってください。
この辺の話は、ただ真似ただけでは意味がありません。スクリプトの1行1行が何を意味しているのかを知るためにも、自分で色々と調べてみた方が良いでしょう。
そのうち、自分できちんとしたルールを作れるようになると思います。
今回新しく登場したコマンド
- vi
- iptables
- sysctl
- chmod
[広告]
トップページ
Scientific Linux 6
○準備
○仮想化準備(VMware)
○仮想化準備(Hyper-V)
○仮想化準備(Proxmox)
○基本操作
○導入
○セキュリティ対策
○NTPサーバ
○Dynamic DNS
○DNSサーバ
○データベース
○WEBサーバ
○FTPサーバ
○メールサーバ
○ブログシステム
○その他