airproxyサーバー構築
以前からNFSサーバー上で利用していたのだが、ML115G5を導入したついでに、外部公開のサービスは別のサーバーに移行することにした。具体的にはSSHとairproxyを別サーバーで稼働させることにした。
こういうわけで、数日前からVMware Server 2上で仮想マシンを作成し、CentOS 5.2のインストールを繰り返してきたのだが、本日、実機へのインストールを行った。なぜVMware Serverで仮想化しないのか、という質問がありそうだが、これには次のような理由がある。
(1) SSH或いはOpenVPNを利用してNFSサーバー上の資源にアクセスするにしても、それ程頻度は多くない。今までの経験から言っても、ファイルを同期していたことで自宅のファイルサーバー上のファイルが必要になることはあまりなかった。
(2) 上記の理由に加えて、airproxyの利用にはそれ程高速なCPUは必要ないため、ML115G5を常時稼働させる必要はない。
(3) ML115G5が発する音・熱及び消費電力の問題。もっとも自分は外出しているわけだからこれは真夏*1以外ではそれ程問題ではない。
というわけで、物理的に別個のサーバーを構築することとなった。スペックは以下の通りである。*2
- IBM NetVista A40 6881-22J
- OS: CentOS 5.2
- CPU: Intel Celeron 600MHz
- チップセット: Intel 810e
- メモリ: SDRAM PC133 nonECC 320MB (64MB + 256MB)
- ビデオカード: チップセット内蔵
- HDD: FUJITSU MPF3120AT (10.1GB, Ultra ATA 66, 5400rpm)
- FDD: 型番不明 (3モード対応)
- 光学ドライブ: TEAC CD-224E
- NIC: オンボード (intel 82559)
CentOS 5.2をCDからブートし、ネットワーク(NFS)経由でインストールした。NFSを利用するためにiptables, /etc/exports , /etc/hosts.allow の設定を適宜変更し、あとはBASEのみをインストールした。BASEのみといっても必要ないパッケージがまだ含まれているので、F2キーでパッケージ一覧を表示させてチェックを外した。
インストール完了後、useraddでユーザーを作成後、passwdでパスワードを設定し、sshで接続。その後、scpで用意しておいたスクリプト(このエントリの末尾に掲載のcentos52.sh)とairproxyのrpmを転送し、実行した。tcpwrapper, iptables, yum, 仮想コンソール, rootログインの禁止, logrotate, ssh, ipv6の無効化, ntp, airproxy, 不要サービスの無効化等の設定を行っている。今回はWillcom以外からのアクセスを遮断するために、WILLCOM|ウィルコムのセンター情報を基にiptablesを設定した。無線LAN等PHSよりも帯域が広い回線で使う場合には、ssh経由でairproxyに接続すれば良いであろう。
- centos52.sh
#!/bin/sh cat << EOF >> /etc/hosts 192.168.0.x hoge 192.168.0.y foo EOF cat << EOF >> /etc/hosts.deny ALL: ALL EOF cat << EOF >> /etc/hosts.allow sshd: 192.168.0.x EOF cat << EOF > /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 INPUT -j LOG --log-prefix iptables: -A INPUT -j DROP -A FORWARD -j DROP -A RH-Firewall-1-INPUT -p all -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT #SMB -A RH-Firewall-1-INPUT -p udp --dport 137:138 -d 192.168.0.255 -j ACCEPT #ICMP ping -A RH-Firewall-1-INPUT -s 192.168.0.x -p icmp --icmp-type 8 -j ACCEPT #ssh -A RH-Firewall-1-INPUT -s 192.168.0.x -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT #airproxy -A RH-Firewall-1-INPUT -s 61.198.128.0/24 -p tcp --dport 8080 -m conntrack --ctstate NEW -j ACCEPT # 以下同様のため省略 #local -A RH-Firewall-1-INPUT -i lo -j ACCEPT COMMIT EOF cat << EOF > /etc/yum.repos.d/local-addons http://ftp.riken.jp/Linux/centos/\$releasever/addons/\$basearch/ http://ftp.kddilabs.jp/Linux/distributions/centos/\$releasever/addons/\$basearch/ http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/\$releasever/addons/\$basearch/ http://ftp.nara.wide.ad.jp/pub/Linux/centos/\$releasever/addons/\$basearch/ http://rsync.atworks.co.jp/centos/\$releasever/addons/\$basearch/ http://ftp.iij.ad.jp/pub/linux/centos/\$releasever/addons/\$basearch/ EOF cat << EOF > /etc/yum.repos.d/local-base http://ftp.riken.jp/Linux/centos/\$releasever/os/\$basearch/ http://ftp.kddilabs.jp/Linux/distributions/CentOS/\$releasever/os/\$basearch/ http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/\$releasever/os/\$basearch/ http://ftp.nara.wide.ad.jp/pub/Linux/centos/\$releasever/os/\$basearch/ http://rsync.atworks.co.jp/centos/\$releasever/os/\$basearch/ http://ftp.iij.ad.jp/pub/linux/centos/\$releasever/os/\$basearch/ EOF cat << EOF > /etc/yum.repos.d/local-extras http://ftp.riken.jp/Linux/centos/\$releasever/extras/\$basearch/ http://ftp.kddilabs.jp/Linux/distributions/centos/\$releasever/extras/\$basearch/ http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/\$releasever/extras/\$basearch/ http://ftp.nara.wide.ad.jp/pub/Linux/centos/\$releasever/extras/\$basearch/ http://rsync.atworks.co.jp/centos/\$releasever/extras/\$basearch/ http://ftp.iij.ad.jp/pub/linux/centos/\$releasever/extras/\$basearch/ EOF cat << EOF > /etc/yum.repos.d/local-updates http://ftp.riken.jp/Linux/centos/\$releasever/updates/\$basearch/ http://ftp.kddilabs.jp/Linux/distributions/centos/\$releasever/updates/\$basearch/ http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/\$releasever/updates/\$basearch/ http://ftp.nara.wide.ad.jp/pub/Linux/centos/\$releasever/updates/\$basearch/ http://rsync.atworks.co.jp/centos/\$releasever/updates/\$basearch/ http://ftp.iij.ad.jp/pub/linux/centos/\$releasever/updates/\$basearch/ EOF cp -p /etc/inittab /etc/inittab.orig sed -e 's/3:2345/#3:2345/g' -e 's/4:2345/#4:2345/g' -e 's/5:2345/#5:2345/g' -e 's/6:2345/#6:2345/g' /etc/inittab.orig > /etc/inittab cp -p /etc/securetty /etc/securetty.orig sed -e 's/tty.*//g' /etc/securetty.orig > /etc/securetty cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.orig sed -e 's/#PermitRootLogin\ yes/PermitRootLogin\ no/g' -e 's/#RhostsRSAAuthentication/RhostsRSAAuthentication/g' -e 's/#PubkeyAuthentication/PubkeyAuthentication/g' -e 's/^PasswordAuthentication\ yes/PasswordAuthentication\ no/g' /etc/ssh/sshd_config.orig > /etc/ssh/sshd_config echo "AllowUsers nobu" >> /etc/ssh/sshd_config cp -p /etc/logrotate.conf /etc/logrotate.conf.orig sed -e 's/^rotate\ 4/#rotate\ 4/g' -e 's/^#compress/compress/g' /etc/logrotate.conf.orig > /etc/logrotate.conf echo "#keep 26 weeks (6 months)" >> /etc/logrotate.conf echo "rotate 26" >> /etc/logrotate.conf cat /etc/sysconfig/network | grep NETWORKING_IPV6 cat << EOF >> /etc/modprobe.conf alias ipv6 off alias net-pf-10 off EOF yum -y install ntp cp -p /etc/ntp.conf /etc/ntp.conf.orig sed -e 's/^restrict\ -6/#restrict\ -6/g' -e 's/^server/#server/g' -e 's/^fudge/#fudge/g' /etc/ntp.conf.orig > /etc/ntp.conf echo "server hpml115" >> /etc/ntp.conf chkconfig ntpd on ntpdate foo yum -y install libpng zlib giflib libjpeg useradd -d /usr/share/airproxy -M -s /bin/bash airproxy rpm -ivh jre-*-linux-i586.rpm rpm -ivh airproxy-*-*.el5.centos.i686.rpm chkconfig airproxy on yum -y update for i in $(echo "atd cups exim firstboot haldaemon ip6tables irqbalance jexec kudzu lvm2-monitor messagebus netfs nfslock pcscd portmap rpcgssd rpcidmapd sendmail "); do chkconfig $i off done
airproxyのrpmは以下のスペックファイルを用いて作成した。セキュリティーを考慮し、airproxy自体はユーザ名"airproxy"で動くようにしてある。大して効果がないことは分かっているが、一応Pentium3に最適化させている。そのため、Pentium3以外のi386の場合やx86_64の場合は%defineマクロで定義してある幾つかの箇所を書き換える必要がある。rpmとsrpmはスペース的にもライセンス的にも面倒そうなので公開しない。Fedoraでもビルド出来るはずである。
# airproxy spec file for CentOS 5.2 %define srcFileName src20070401.zip %define binFileName airproxy050.zip %define apHostName hostname %define apPort 8080 %define apWebPort 80 %define passwd hogehoge %define libfastloadArch i386 #libfastloadArch amd64 %define javaDataModel 32 #%define javaDataModel 64 %define optOption -O3 -m32 -march=pentium3 -mtune=pentium3 -mmmx -msse #optOption -O3 -m32 -march=pentium4 -mtune=pentium4 -mmmx -msse -msse2 #optOption -O3 -m64 -march=k8 -mtune=k8 -mmmx -msse -msse2 -m3dnow -fPIC Summary: a proxy server Name: airproxy Version: 0.5.0 Release: 3.el5.centos License: original Group: Applications/Internet URL: http://www.ne.jp/asahi/web/ryo/airproxy/ Source0: http://www.ne.jp/asahi/web/ryo/airproxy/download/%{srcFileName} Source1: http://www.ne.jp/asahi/web/ryo/airproxy/download/%{binFileName} Packager: Nobuyuki Ito <nobu.1026@gmail.com> Requires: libpng Requires: zlib Requires: giflib Requires: libjpeg BuildRequires: jdk >= 1.5.0 BuildRequires: ant BuildRequires: libpng-devel BuildRequires: zlib-devel BuildRequires: giflib-devel BuildRequires: libjpeg-devel BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %description airproxy is a proxy server %prep %setup -n airproxy -c rm -rf * mkdir -p src bin unzip -d src $RPM_SOURCE_DIR/%{srcFileName} unzip -d bin $RPM_SOURCE_DIR/%{binFileName} cat << EOF > build.xml <?xml version="1.0"?> <project name="airproxy" default="airproxy" basedir="."> <target name="airproxy"> <mkdir dir="classes" /> <javac srcdir="src" destdir="classes" encoding="Shift_JIS" /> <mkdir dir="classes/resources" /> <copy todir="classes/resources"> <fileset dir="src/resources"/> </copy> <mkdir dir="jars" /> <jar jarfile="jars/airproxy.jar" update="yes" basedir="classes"> <include name="airproxy/**"/> <include name="http/**"/> <include name="resources/**"/> <include name="plugins/**"/> <manifest><attribute name="Main-Class" value="airproxy.Main"/></manifest> </jar> </target> <target name="clean"> <delete dir="classes" /> <delete file="jars" /> </target> </project> EOF mv src/fastload/Makefile.linux src/fastload/Makefile.linux.orig sed -e 's/OPT\ /OPT\ +/' -e 's/local\/java/java\/latest/g' -e 's/test\.exe//g' src/fastload/Makefile.linux.orig > src/fastload/Makefile.linux %build ant airproxy cd src/fastload OPT="%{optOption}" make -f Makefile.linux %install [ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT # install aiproxy.jar files mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name} install jars/%{name}.jar $RPM_BUILD_ROOT%{_datadir}/%{name} # install plugins #mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}/plugins/{impress,goo,google} #install jars/plugins/*.jar $RPM_BUILD_ROOT%{_datadir}/%{name}/plugins # install libfastload.so mkdir -p $RPM_BUILD_ROOT%{_prefix}/java/latest/lib/%{libfastloadArch} install src/fastload/libfastload.so $RPM_BUILD_ROOT%{_prefix}/java/latest/lib/%{libfastloadArch} # install filter.txt install bin/filter.txt $RPM_BUILD_ROOT/%{_datadir}/%{name} # install config files mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}/users cat << EOF > $RPM_BUILD_ROOT%{_datadir}/%{name}/%{name}.properties hostname = %{apHostName} port = %{apPort} web.port = %{apWebPort} parent.hostname = parent.port = parent.username = parent.password = ddns.update.url = ddns.update.interval = cache.prefetch = on log.access.filename = /var/log/airproxy.log EOF mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}/htdocs install bin/htdocs/index.html $RPM_BUILD_ROOT%{_datadir}/%{name}/htdocs cat << EOF > $RPM_BUILD_ROOT%{_datadir}/%{name}/users/%{name}.properties password = %{passwd} image.quality.png = 75 image.quality.jpeg = 75 image.type = byLength image.maxWidth = 480 image.maxHeight = 480 image.reductionRate = 100 image.maxDataSize = 4096 html.optimize = on html.remove.filter = filter.txt userAgent = EOF cat << EOF > $RPM_BUILD_ROOT%{_datadir}/%{name}/users/au.properties password = %{passwd} image.quality.png = 75 image.quality.jpeg = 75 image.type = byLength image.maxWidth = 480 image.maxHeight = 480 image.reductionRate = 100 image.maxDataSize = 4096 html.optimize = on html.remove.filter = filter.txt userAgent = KDDI-SH35 UP.Browser/6.2.0.7.3.129 (GUI) MMP/2.0 EOF cat << EOF > $RPM_BUILD_ROOT%{_datadir}/%{name}/users/docomo.properties password = %{passwd} image.quality.png = 75 image.quality.jpeg = 75 image.type = byLength image.maxWidth = 480 image.maxHeight = 480 image.reductionRate = 100 image.maxDataSize = 4096 html.optimize = on html.remove.filter = filter.txt userAgent = DoCoMo/2.0 SH906i(c100;TB;W24H16) EOF cat << EOF > $RPM_BUILD_ROOT%{_datadir}/%{name}/users/pc.properties password = %{passwd} image.quality.png = 80 image.quality.jpeg = 80 image.type = byType image.maxWidth = 1024 image.maxHeight = 768 image.reductionRate = 100 image.maxDataSize = 0 html.optimize = off html.remove.filter = userAgent = EOF # create log file mkdir -p $RPM_BUILD_ROOT/var/log touch $RPM_BUILD_ROOT/var/log/%{name}.log # create logrotate config file mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d cat << EOF > $RPM_BUILD_ROOT/etc/logrotate.d/%{name} /var/log/airproxy { missingok notifempty sharedscripts postrotate /bin/kill -HUP \`cat /var/run/airproxy.pid 2> /dev/null\` 2> /dev/null || true endscript } EOF # create sysconfig file mkdir -p $RPM_BUILD_ROOT/etc/sysconfig cat << EOF > $RPM_BUILD_ROOT/etc/sysconfig/%{name} JAVA_HOME=/usr/java/latest JAVA_ARGS="-server -d%{javaDataModel}" AIRPROXY_HOME=/usr/share/airproxy EOF #create init script mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d cat << EOF > $RPM_BUILD_ROOT/etc/rc.d/init.d/%{name} #!/bin/bash # # airproxy This shell script takes care of starting and stopping airproxy. # chkconfig: 2345 90 10 # description: airproxy is a proxy server. # Source function library. . /etc/init.d/functions # Source networking configuration. . /etc/sysconfig/network RETVAL=0 prog=airproxy lockfile=/var/lock/subsys/\$prog pidfile=/var/run/\$prog.pid start() { # Check that networking is up. [ "\$NETWORKING" = "no" ] && exit 1 [ -f /etc/sysconfig/airproxy ] || exit 6 . /etc/sysconfig/airproxy # Start daemons. echo -n \$"Starting \$prog: " cd \$AIRPROXY_HOME su %{name} -c "\$JAVA_HOME/bin/java \$JAVA_ARGS -jar airproxy.jar &" RETVAL=\$? ps aux | egrep ^airproxy | awk {'print \$2'} > \$pidfile [ \$RETVAL -eq 0 ] && touch \$lockfile && success echo return \$RETVAL } stop() { echo -n \$"Shutting down \$prog: " kill -s SIGTERM \`cat \$pidfile\` RETVAL=\$? echo [ \$RETVAL -eq 0 ] && rm -f \$lockfile \$pidfile && success } case "\$1" in start) start ;; stop) stop ;; status) status \$prog ;; restart|force-reload) stop start ;; try-restart|condrestart) if [ -f \$lockfile ]; then stop start fi ;; reload) exit 3 ;; *) echo \$"Usage: \$0 {start|stop|status|restart|try-restart|force-reload}" exit 2 esac EOF # create /usr/bin/airproxy.sh mkdir -p $RPM_BUILD_ROOT%{_bindir} cat << EOF > $RPM_BUILD_ROOT%{_bindir}/%{name}.sh #!/bin/sh JAVA_HOME=\$1 AIRPROXY_HOME=\$2 \$JAVA_HOME/bin/java -server -jar airproxy.jar -cp \$AIRPROXY_HOME & EOF %clean [ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT %post /sbin/chkconfig --add %{name} %postun /sbin/chkconfig --del %{name} %files %defattr(-, %{name}, %{name}) %attr(6555, %{name}, %{name}) %{_bindir}/%{name}.sh %attr(444, %{name}, %{name}) %{_datadir}/%{name}/%{name}.jar %attr(644, %{name}, %{name}) %config %{_datadir}/%{name}/%{name}.properties %attr(644, %{name}, %{name}) %config %{_datadir}/%{name}/filter.txt %attr(644, %{name}, %{name}) %config %{_datadir}/%{name}/users/*.properties %attr(444, %{name}, %{name}) %{_datadir}/%{name}/htdocs/* #%attr(444, %{name}, %{name}) %{_datadir}/%{name}/plugins %attr(644, root, root)%config /etc/logrotate.d/%{name} %attr(655, root, root) /etc/rc.d/init.d/%{name} %attr(655, root, root) %config /etc/sysconfig/%{name} %attr(555, %{name}, %{name}) %{_prefix}/java/latest/lib/%{libfastloadArch}/libfastload.so %attr(600, %{name}, %{name}) /var/log/%{name}.log %doc src/license.txt bin/readme.txt %changelog * Fri Feb 27 2009 Nobuyuki Ito <nobu.1026@gmail.com> - 0.5.0-3.el5.centos - changed init script so that you can use 'chkconfig' * Wed Feb 25 2009 Nobuyuki Ito <nobu.1026@gmail.com> - 0.5.0-2.el5.centos - changed ownerships and permissions - airproxy starts as a user, "airproxy" * Sun Jan 11 2009 Nobuyuki Ito <nobu.1026@gmail.com> - 0.5.0-1 - initial build