web-dev-qa-db-ja.com

iptablesポート転送(プレルーティングポート80)とファイアウォールが一緒に機能しない

私はこのトピックに関する多くの記事と回答を読み、Linodeのサポートについて話し合っていますが、私の正確な問題に答えられる人はいません。

簡単なようです-iptablesファイアウォールを使用して、22、80、および443を除くすべてのポートへのアクセスを制限したいと思います。Linodeは、ここにすばらしい記述があります https://library.linode.com/securing-your -server#sph_creating-a-firewall と私は彼らのファイアウォールルールをそのまま使用しました。ファイアウォールは適切に機能します。

これはnodejsアプリですので、いくつかのポートを事前ルーティングしたいと思います。だから私は使用しました:

Sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3000

これらのルールは、ファイアウォールルールがない場合に機能します。実際、私は今それらを使用していますが、ファイアウォールをダウンさせたままにしなければなりませんでした。

ファイアウォールルールを追加すると、PREROUTINGが機能しなくなります。アクティブなiptablesルールをファイルに保存して表示すると、ファイアウォール(フィルタールール)とPREROUTING(natルール)の両方が存在しますが、機能するのはファイアウォールルールだけです。こちらをご覧ください:

# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*security
:INPUT ACCEPT [1606:135329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*raw
:PREROUTING ACCEPT [1620:139613]
:OUTPUT ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*nat
:PREROUTING ACCEPT [4:248]
:INPUT ACCEPT [6:376]
:OUTPUT ACCEPT [12:728]
:POSTROUTING ACCEPT [12:728]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3000
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*mangle
:PREROUTING ACCEPT [1620:139613]
:INPUT ACCEPT [1606:135329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1206:144815]
:POSTROUTING ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -j DROP
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Wed Mar 26 02:40:04 2014 

iptables -Fを使用すると、ファイアウォール(フィルター)ルールのみがフラッシュされ、PREROUTINGが再び機能し始めます。ですから、それは間違いなく対立です。これ(上記)は、iptablesにルールを保存した順序に関係なく、iptablesによる標準出力であるため、ルールブロックの順序は重要ではないようです。

私には、それは次の2つのうちの1つであるように見えます。

  1. ACCEPTルールもあるPREROUTINGポートは、プレルーティングが無視されることを意味する場合があります
  2. 技術的にブロックされているポートにPREROUTINGしていること(ただし、ここで「PRE」が発生したと思った)

誰か知ってる?

ありがとう!

ポール

3
paintedbicycle

PREROUTING後、ローカルパケットはローカルフィルターに送られ、そこでドロップされます(ケース2)。

したがって、iptablesでこれらのポートへの着信トラフィックを許可する必要があるだけです。

iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT

Http(s)トラフィックを80/443から8080/3000にリダイレクトしているため、後者のポートが開いていてインターネットに公開されているように見えるので、外部との違いはなく、セキュリティ上の影響はありません。

6
LinuxDevOps