タグ: iptables

自宅CentOS

なんとかして1台のサーバですべての用事を済まそう計画…

  1. minimum install
  2. date –set=’****/**/** **:**:**’
  3. vi /etc/sysconfig/network-scripts/ifcfg-eth0
  4. vi /etc/selinux/config
  5. vi /etc/sysconfig/iptables
  6. vi /etc/resolv.conf
    nameserver 192.168.1.1
  7. vi /etc/yum.conf (Proxy check only)
  8. yum install ntp openssh-clients wget rsync mlocate
  9. vi /etc/ntp.conf
    server 192.168.1.1 iburst
  10. /etc/init.d/ntpd start
  11. chkconfig ntpd on
  12. chkconfig ntpdate on
  13. ssh-keygen -t rsa
  14. cd /root/.ssh/
  15. mv id_rsa.pub id_rsa.pub.192.168.1.2
  16. scp id_rsa.pub.192.168.1.2 root@192.168.1.1:/root/.ssh/
  17. (on 192.168.1.1)
    cat id_rsa.pub.192.168.1.2 >> authorized_keys
  18. vi /etc/wgetrc (Proxy check only)
  19. vi /etc/profile
    HISTSIZE=5000
  20. cd /root
  21. wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
  22. rpm -ivh mysql-community-release-el6-5.noarch.rpm
  23. vi /etc/yum.repos.d/mysql-community.repo
  24. wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
  25. rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
  26. vi /etc/yum.repos.d/rpmforge.repo
  27. cd /etc/pki/rpm-gpg/
  28. wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6
  29. cd /root/
  30. vi /etc/yum.repos.d/epel.repo
    [epel]
    name=Extra Packages for Enterprise Linux (EPEL)
    baseurl=http://ftp.riken.jp/Linux/fedora/epel/6/$basearch/
    enabled=0
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  31. wget http://mirror.sysadminguide.net/centalt/repository/centos/6/x86_64/centalt-release-6-1.noarch.rpm
  32. rpm -ivh centalt-release-6-1.noarch.rpm
  33. vi /etc/yum.repos.d/centalt.repo
    [CentALT]
    name=CentALT Packages for Enterprise Linux 6 - $basearch
    baseurl=http://mirror.sysadminguide.net/centalt/repository/centos/6/$basearch/
    enabled=0
    gpgcheck=0
  34. yum install –enablerepo=mysql-community,rpmforge,epel,CentALT httpd php mysql transmission kernel-devel unzip gcc ccid pcsc-lite pcsc-lite-devel pcsc-lite-libs perl-Gtk2
  35. yum update –enablerepo=mysql-community,rpmforge,epel,CentALT
  36. cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.original
  37. vi /etc/httpd/conf/httpd.conf
    Timeout 20
    ServerName 192.168.0.2:80
    <Directory />
    AllowOverride All
    </Directory>
    AddDefaultCharset off
  38. /etc/init.d/httpd start
  39. chkconfig httpd on
  40. cp /etc/my.cnf /etc/my.cnf.original
  41. vi /etc/my.cnf
    sql_mode=NO_ENGINE_SUBSTITUTION
    # for Replication
    log-bin=mysql-bin
    server-id       = 168001002
    max_connections = 1000
    
    #log = /var/log/mysql/query.log
  42. /etc/init.d/mysqld start
  43. chkconfig mysqld on
  44. mysql -u root -p
  45. > grant all privileges on *.* to username identified by ‘password’ with grant option;
  46. > quit

iptables を直接編集で

いろいろと面倒になってきたので、iptablesは直接編集することにする。
Stray Penguinさまのサイトにすごく詳しく書いてある。全部通して読みたいけど時間がない。
とりあえず、

vi /etc/sysconfig/iptables

で、編集することができる。

デフォルトは

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

ってカンジで、2行目に「このファイルを直接編集するのはお勧めしないよ」って書いてあるけど、
気にしないことにする。

iptables -F

をやってしまった直後だと、

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

しか書いてなくて、参考になるものがないかもしれない。
この状態だと、

INPUT → すべて許可
FORWARD → すべて許可
OUTPUT → すべて許可

ということになる。
サーバだからINPUTがなきゃOUTPUTしない、と思い込んでいるので、INPUTとFORWARDについて主に書いていく。
デフォルトのファイルを参考に修正するだけなら、大丈夫かな?

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
# -A RH-Firewall-1-INPUT -p 50 -j ACCEPT
# -A RH-Firewall-1-INPUT -p 51 -j ACCEPT
# -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
# -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
# -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
# HTTP
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# NTP
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 123 -j ACCEPT
# HTTPS
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
# MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT
# Zabbix-Agent
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 192.168.1.0/24 --dport 10050 -j ACCEPT
# Zabbix-Trapper
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 192.168.1.0/24 --dport 10051 -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

こんなかんじにしてみた。
SSH、MySQL、Zabbixは家の中からのアクセスしか無いので。
デフォルトで入ってる631(IPP)とか5353(mDNS)は使うかどうかわからないので一旦コメントアウト。

必要に応じて、

# zend server
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10081 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10082 -j ACCEPT
# deep security
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 4118 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 4119 -j ACCEPT

とか加えてもいいかも。

「Get value error: cannot connect to [[***.***.***.***]:10050]: [113] No route to host」って

Get value error: cannot connect to [[***.***.***.***]:10050]: [113] No route to host

ってなにさ・・・
んー・・・

あ、10050と10051開けてないからだ。
ってことはiptablesか。

ということで

iptables -A INPUT -m state --state NEW -p tcp --dport 10050 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 10051 -j ACCEPT

で、追加。

iptables-save

で保存しておく。

iptables を眺める

iptablesを全くわかっていないので、駄文的に書いてみる。

iptablesのマニュアルはここにあるのでよく読む。

現状を把握したい時は

iptables -L

で状況を確認できる。
とりあえず、デフォルトはこんな感じ。

[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere            icmp any
ACCEPT     esp  --  anywhere             anywhere
ACCEPT     ah   --  anywhere             anywhere
ACCEPT     udp  --  anywhere             224.0.0.251         udp dpt:mdns
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ipp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ipp
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

簡単にオプションの意味を書き出してみる。
[ -A ] → [ INPUT ][ FORWARD ][ OUTPUT ]の条件として付け加えます(append)。
[ -m ] → モジュールを呼び出します(module)。
[ –state ] → コンマで区切られた接続状態のリストを指定します。
[ -m ] → モジュールを呼び出します(module)。
[ -p ] → プロトコルを指定します。
[ –dport ] → 宛先のポート番号を指定します。
[ -j ] → 今までの条件にマッチしたパケットをどうするか指定します。

上記を踏まえると、
[ -A INPUT ] → INPUTに付け加えます。
[ -m state ] → stateモジュールを呼び出します。
[ –state NEW ] → 接続状態はNEWで。
[ -m tcp ] → tcpモジュールを呼び出します。
[ -p tcp ] → プロトコルはTCPで。
[ –dport 80 ] → 80番ポート宛で。
[ -j ACCEPT ] → 許可します。

ということで、

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

は、
「接続状態はNEW」で「プロトコルはTCP」で「80番ポート宛」なパケットが来たら、
そのパケットは「INPUTの条件」として「許可」する。
という条件を付け加える。
なのかな?

[ -m tcp ]の扱いは何なんだ?ということでググると
http://search.luky.org/linux-users.a/msg03917.html
ということで、[ -p tcp ]を書くなら一緒につけておこうよ的な感覚らしい。

最悪、訳が分からなくなったら

iptables -F

で全てをリセットできるので、初めからやり直せる。

とりあえずは

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

で、httpとsshが通れば文句言わないことにする。

 

自宅内のみか何かで要らないなーと思った時は、

chkconfig --list iptables
iptables       	0:off	1:off	2:on	3:on	4:on	5:on	6:off

なので

chkconfig iptables off

で無効に。

chkconfig --list iptables
iptables       	0:off	1:off	2:off	3:off	4:off	5:off	6:off

を確認しておく。