LoginSignup
12
8

More than 5 years have passed since last update.

ポートを開放して外部からアクセスできるようにする

Last updated at Posted at 2016-01-24

Arch Linuxでポートを開放する.

sshdはsystemctl start sshdするだけでうまく行くのに,自分でウェブサーバを起動して外部からアクセスしようとしてもウンともスンとも言わないので戦った記録.
Arch Linuxで自作のサーバを建てたいんだけどポート開放がうまく行かない人向け.

結論

0.0.0.0を使ったら一瞬だった.0.0.0.0と127.0.0.1の違いを理解していなかった自分がアホだった.
恥ずかしいからこの記事も消したいけど一応ハマっている人がいるかもしれないから残す.かと言って127.0.0.1でハマる人なんかがサーバを立てるとも思えないので,この記事があっても生き恥をさらすだけで意味ないのかもしれない.

戦いの記録

Arch Linuxでは一般的な推奨事項

ファイアウォールの設定

ファイアウォールは Linux のネットワークスタックの上部で拡張保護レイヤーとして働きます。Linux カーネルには Netfilter プロジェクトのひとつで、ステートフルファイアウォールである iptables があります。利用するにはフロントエンドを使うか、直接設定します。Arch では全てのポートが閉じられており、ネットワークデーモンは設定をしないかぎり自動で起動しないため、保護すべきサービスがない限りファイアウォールはあまり意味がありません。

とあるので,iptablesを起動して全部ACCEPTにしたりしてもポートがオープンになりませんし,そもそもArchはデフォルトでiptablesを起動しないとiptablesに書いてあります.

これに気づくまでにだいぶ時間がかかりましたが気づいてからは早かったです.
まず,

ネットワークデーモンは設定をしないかぎり自動で起動しないため、

とありますが,対偶を取ると,「自動で起動しているネットワークデーモンは設定をしている」ということになります.
よって,冒頭で記述したsshdはパッケージに設定ファイルが入っているので,何もしなくても22番ポートが開放されネットワークデーモンが起動しています.
そこで,/usr/lib/systemd/system/sshdを調べると,sshd.serviceとsshd.socketという怪しげなファイルが見つかります.
中を見ると

/usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH Daemon
Wants=sshdgenkeys.service
After=sshdgenkeys.service
After=network.target

[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

# This service file runs an SSH daemon that forks for each incoming connection.
# If you prefer to spawn on-demand daemons, use sshd.socket and sshd@.service.
/usr/lib/systemd/system/sshd.socket
[Unit]
Conflicts=sshd.service
Wants=sshdgenkeys.service

[Socket]
ListenStream=22
Accept=yes

[Install]
WantedBy=sockets.target

と書かれています.
しかし,ここで私は疑問が出てきました.自分のsshdではポートを22番から変えているのです.
試しにsystemctl status sshd.socketしてみるとinactive,つまり起動していません.このため22番ポートという設定が無視されてポート開放できているのです.
(余談ですが,この話もSecure_Shellに書いてあります)
つまり,なんかうまいこと.socket ファイルや.serviceファイルを作ってポートを開放させてあげれば自作サーバをArch Linux上で動かせるはずです.
いろいろググるとこんなページがヒットしまして,あと,Systemdのページをちょろちょろ参考にすれば,

/etc.systemd/system/service-name.service
[Unit]
Description=Simple HTTP Proxy

[Service]
ExecStart=/usr/lib/systemd/systemd-socket-proxyd localhost:接続したいポート
PrivateTmp=yes
/etc.systemd/system/service-name.socket
[Unit]
Description=Simple HTTP Proxy Socket

[Socket]
ListenStream=接続を受け付けるポート
systemctl start service-name.socket

を書くだけです.
詳しくはman systemd-socket-proxyd
例えば,httpサーバを8080番で受け付けて,外部から80番ポートにアクセスしてコンテンツを取得したい場合,接続したいポートに8080,受け付けるポートに80を書けば良い.
この方法が正しいかは知らないので,もしシステムをぶっ壊しても自己責任でお願いします.

書いてsystemd daemon-reloadしてsystemd service.socketとかすると普通に動いて今までのiptables諸々の苦労は何だったんだ…って感じになった.

ちなみに,sshd.socketが起動していないのになんで正しいポートを開放できてるのかは謎です.これがわかったらもっと簡単になるかもしれません.

わかったので更新しました.

12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8