短い質問:
単一のホストIPアドレスでのみポート転送を有効にするにはどうすればよいですか?
バックストーリー:
Centos 7サーバーには5つのIPアドレスがあります。以前は、Apacheでそれらすべてと、仮想ホストで解決されたIPアドレスに割り当てられたさまざまなドメインをリッスンしていました。
Httpd.confのListen
ディレクティブを変更して、Apacheが4つのIPアドレスのみをリッスンするようにしました
Node.jsを使用して別のサーバーインスタンスを作成しましたが、高度な権限がなければ標準ポート80でリッスンできません。昇格した権限で実行したくありません。
私はポート80を8080のようなものにポート転送したいのですが、他の4つのIPアドレスに向けられたトラフィックに影響を与えることなく、1つのIPアドレスのみを使用します。他のIPアドレスのトラフィックがルールの影響を受けないことが重要です。
ソリューションは次のようになります。
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
私が見つけた他の質問と回答は、ホストIPアドレスではなくソースIPアドレスに関係しています。
Firewalldゾーンは、インターフェースまたはsourceアドレスのいずれかで指定できますが、destinationアドレス。この特定の状況を処理するには、豊富なルールが必要です。
このような豊富なルールは次のようになります。
_firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" destination address="198.51.100.237" forward-port port="80" protocol="tcp" to-port="8080"'
_
豊富なルールのドキュメントについては、 firewalld.richlanguage(5)
のマニュアルページ を参照してください。
リッチルールが機能したら、次のようにして永続化することを忘れないでください。
_firewall-cmd --runtime-to-permanent
_
または、前の呼び出しに_--permanent
_を追加します。
5つのIPアドレスのうち、1つが192.0.2.3
、ポート80を転送する。 iptables
を使用して、このIPアドレスのポートを次のように転送できます。
iptables -t nat -A PREROUTING -d 192.0.2.3 -p tcp --dport 80 -j REDIRECT --to-ports 8080
これにより、他のすべてのアドレスは影響を受けません。プログラムがすべてのアドレスのポート80にバインドする場合、192.0.2.3
は、ルーティングの前にリダイレクトされるため、ポート8080にリダイレクトされます。
注:私は奇妙でおそらくサポートされていないソリューションを提案していますが、将来のfirewalld
バージョンで壊れる可能性があります。それにもかかわらず、それは確かにCentOS 7サーバーで動作します。
そのようなポート転送ルールをiptables
/ip6tables
スタックに直接追加することをお勧めします。 firewalld
の直接ルールを使用することでそれを実現できます。例えば:
# firewall-cmd --permanent --direct --add-rule ipv4 nat PRE_public_allow 0 \
--destination 11.22.33.44 --protocol tcp --destination-port 80 \
--jump REDIRECT --to-ports 8080
# firewall-cmd --permanent --direct --add-rule ipv6 nat PRE_public_allow 0 \
--destination 11:22:33:44:55:66:77:88 --protocol tcp --destination-port 80 \
--jump REDIRECT --to-ports 8080
CentOSのfirewalld
は、アクティブなゾーンごとにnat
テーブルにPRE_<zone>_allow
チェーンを作成し、ゾーン定義に一致するパケットが到着すると評価されると考えました。したがって、iptables
/ip6tables
ルールをそこに追加できます。
異なるドメインの同じポートで、同じIPアドレスのリバースプロキシを構成します。 httpd構成ページで、各ポート(Listen 80、Listen 8081、Listen 8082など)のListenディレクティブを追加し、httpd構成ページにvhosts構成ポートを含め、ポートに従ってvhosts構成ページを更新します。