web-dev-qa-db-ja.com

Ubuntuでポートファイアウォールを内部的に開く方法とそれを確認する方法

バックグラウンド

laravelアプリの両方を実行しているawsマシンを入手し、インストールしようとしました beanstalk console 。これは、laravelアプリのnginx構成ファイルは次のようになります。

include forge-conf/default/before/*;

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name default;
    root /home/forge/default/public;

    # FORGE SSL (DO NOT REMOVE!)
    # ssl_certificate;
    # ssl_certificate_key;

    ssl_protocols ..
    ssl_ciphers ..
    ssl_prefer_server_ciphers on;
    ssl_dhparam ..

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    # FORGE CONFIG (DOT NOT REMOVE!)
    include forge-conf/default/server/*;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/default-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

これは、beanstalkアプリのnginx構成ファイルがどのように見えるかです。

server {
    listen 8080;
    listen [::]:8080;
    server_name beanstalk_server;
    root /home/forge/beanstalk-console/public;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_log  /var/log/nginx/default-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

質問

server-ip:8080を押しようとすると、次のエラーが発生します。

server-ip took too long to respond.

Awsインスタンスのインバウンドルールを次のように更新したので、これがアクセス許可の問題ではないことを確認しました。

enter image description here

しかし、まだ運が悪いのですが、これはBeanstalkコンソール自体の問題ではないことを知っています。ポートを切り替えるだけの場合はb/c(つまり、beanstalkコンソールが8080ではなくポート80をリッスンする場合、問題なく動作します。 1515のような別のポートを試しましたが、それでも動作しませんでした。

また、localhost:8080が正常に機能し、b/cが実行されていることも知っています。

wget localhost:8080 

beanstalkのHTMLサイトを返します。

覚えておくべきことの1つは、私のawsマシンもロードバランサーの後ろにあるということです。ロードバランサーのhttpリクエストをポート80のロードバランサーでマシンのポート80に転送します。しかし、それで違いが生じるとは思いません。

enter image description here

私は何をしますか?

更新

アクセスログ(tail -f /var/log/nginx/access.logtail -f /var/log/nginx/access.log)とエラーログ($ tail -f /var/log/nginx/error.log)を確認しましたが、beanstalkにアクセスしようとしても何も見つかりませんでした。

これは私のnetstatコマンドの出力です

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11997/nginx -g daem
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      11997/nginx -g daem
tcp        0      0 10.0.17.158:80          10.0.1.251:19336        ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.17.87:62074        ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.17.101:59938       ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.17.101:60988       ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.1.21:63633         ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.1.21:62603         ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.17.87:63110        ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.1.251:20344        ESTABLISHED 11998/nginx: worker
tcp6       0      0 :::80                   :::*                    LISTEN      11997/nginx -g daem
tcp6       0      0 :::8080                 :::*                    LISTEN      11997/nginx -g daem

アップデート2:ファイアウォール設定

ポート8080はファイアウォールで保護されていないようです。これを参照してください コマンド

netstat -ntlp | grep LISTEN
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:11300           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:587           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11998/nginx: worker
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      11998/nginx: worker
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::3306                 :::*                    LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      11998/nginx: worker
tcp6       0      0 :::8080                 :::*                    LISTEN      11998/nginx: worker
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::5432                 :::*                    LISTEN      -

Nmapも実行しました:

nmap 10.0.17.158

Starting Nmap 7.01 ( https://nmap.org ) at 2017-10-11 10:38 EEST
Nmap scan report for 10.0.17.158
Host is up (0.000068s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
3306/tcp open  mysql
5432/tcp open  postgresql
8080/tcp open  http-proxy
1
abbood

Shadiの回答に基づいて、AWSが実際に8080ポートをマシンにルーティングしていることを確認した後、問題はiptablesから判明しました。

ポートがブロックされているか、iptablesを使用していないかを確認する方法はわかりませんが、ポート8080を許可するコマンドは次のとおりです。

これは、OSレベルからポート8080へのアクセスを許可するiptablesコマンドです。

Sudo iptables -I INPUT 1 -i eth0 -p tcp --dport 8080 -j ACCEPT

(iptablesコマンドの参照については、この excellent post を参照してください。直接引用符はそのようにフォーマットされており、残りにも独自の説明を追加しました):

-I入力1:-Iフラグは、iptablesにルールを挿入するように指示します。これは、最後にルールを追加する-Aフラグとは異なります。 -Iフラグは、チェーンと、新しいルールを挿入するルールの位置をとります。

この場合、このルールをINPUTチェーンの最初のルールとして追加します。これにより、残りのルールが押し下げられます。これは基本的なものであり、後続のルールの影響を受けないため、これを最上位に配置します。

-i eth0:パケットが使用しているインターフェースが「eth0」インターフェース(イーサネット)である場合、ルールのこのコンポーネントは一致します。

-p tcp:これは単にtcpプロトコルを指定するだけです

-dport 8080:私たちが話しているポート

-j ACCEPT:これは一致するパケットのターゲットを指定します。ここでは、前述の基準に一致するパケットを受け入れて許可する必要があることをiptablesに通知します。

ポートが開いているかどうかを確認するにはどうすればよいですか?

上記のリンクでも述べたように、次のコマンドを実行するだけです。

Sudo iptables -S

これは、設定に応じて、ルールのlotを出力します。追跡を切り抜けるには、このコマンドを実行するだけです

$ Sudo iptables -S | grep "dport 8080"
-A INPUT -i eth0 -p tcp -m tcp --dport 8080 -j ACCEPT

そこから、ポート8080で何が起こっているかをすぐに知ることができます

Iptablesコマンドを永続化する方法は?

iptables-persistentパッケージを使用するだけです。

Sudo apt-get update
Sudo apt-get install iptables-persistent

新規インストール時にiptablesルールが保持されます。詳細については、上記のリンクを参照してください

1
Jad Joubran

Localhost:8080が機能するため、外部からのリクエストは、そのポート8080でリッスンしているサーバーに到達しません。以下を確認してください

  1. AWSはリクエストをサーバーにルーティングしています(これは設定に基づく場合です)
  2. 使用しているインスタンスのファイアウォール構成を確認してください。使用しているOSは何ですか?おそらく、設定はそのポートへのアクセスを拒否します
2
Shadi Moadad