DRYな備忘録

Don't Repeat Yourself.

【iptables】公開したくないport番号にファイアーウォールを設定する

ゴール

  • アプリケーションが9090番ポートで動いている
  • nginxの設定でsample.com:80localhost:9090にリバースプロキシしている
  • しかし9090番が外部公開なのでsample.com:9090でもアクセスできてしまう
  • この9090番ポートを外部的には閉じたい

9090番ポートの状態確認

# 一部省略
% netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp6       0      0 [::]:9090               [::]:*                  LISTEN

現状のiptablesの確認

% sudo iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

なんも制限してない

iptablesを使ってパケットルールを追加

まずは、localhostからの9090番へのtcpを許すルールを追加

% sudo iptables -A INPUT -p tcp -s localhost --dport 9090 -j ACCEPT
# これ↑でやってること
# -A INPUT     「"INPUT"チェインにルールを追加する」
# -p tcp       「"tcp"プロトコルで」
# -s localhost 「"localhost"から」
# --dport 9090 「"9090"ポートに行く」
# -j ACCEPT    「上記のルールに合致するパケットを受け入れる」

# そうすっと...

% sudo iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:9090
ACCEPT     tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:9090

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

次に、あらゆる元からの9090番へのtcpを破棄するルールを追加

% sudo iptables -A INPUT -p tcp --dport 9090 -j DROP
# これ↑でやってること
# -A INPUT     「"INPUT"チェインにルールを追加する」
# -p tcp       「"tcp"プロトコルで」
# --dport 9090 「"9090"ポートに行く」
# -j DROP      「上記のルールに合致するパケットを破棄する」

# そうすっと...

% sudo iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:9090
ACCEPT     tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:9090
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9090

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

確認

この状態で

  • sample.com
  • sample.com:9090

にブラウザからアクセスすると

  • sample.com
    • sample.com:80にアクセス
    • nginxがlocalhost:9090にリバースプロキシ
    • localhostから9090番へのtcpなので受け入れられる
  • sample.com:9090
    • sample.com:9090にアクセス
    • localhostではない元から9090番への要求なので破棄される

f:id:otiai10:20140823202020j:plain

とりあえず成功っぽい

参考

雑感

  • iptables-save > ファイルiptables-restore < ファイルで安全に管理すべき
  • 今回は9090番だったけど、とりあえず閉じなきゃいけないportってなんだっけ
  • "iptablesとりあえずのベストプラクティス"みたいなのググるか...

DRYな備忘録