次の問題を解決しようとしています。
今後は「ローカル」と呼びます。このシステムは、ポート 80 とポート 443 でサービスをホストし、ポート 25 で送信される発信要求に依存します。また、ポート22で別々のサービスをホストします。これを「グローバル」と呼びます。 DNSが構成されているグローバルにアクセス可能な静的IPアドレスがあり、ポート80、443、25、および222からの着信要求を受け入れることができます。
ローカルおよびグローバルは、予約済みサブネット10.0.0.0/24に接続されます(重要な場合はVPNインターフェイスを介して)。
グローバルポート80と443からのすべての着信要求は、それぞれポート80と443でローカルにリダイレクトされることを望みます。また、グローバルポート222からの着信要求がポート22のローカルポートにリダイレクトされることを望みます(たとえば、わざと別のポートです)。また、ローカルからポート 25 へのすべての要求がポート 25 からグローバルにリダイレクトされることを望みます。
ローカルとグローバルは、apt、iptables、nftables、ufwを使用できる最新のLinuxシステムです。
私は成功せずにさまざまなiptables設定を試しました。
私が知っている限り、/should/はうまくいくはずですが、うまくいかない設定は次のとおりです。
Global:
/etc/ufw/before.rules (excerpt)
*nat
:PREROUTING ACCEPT [0:0]
# forward port 222 to Local:22
-A PREROUTING -p tcp --dport 222 -j DNAT --to-destination <Local IP on 10.0.0.0/24 Subnet>:22
# forward port 80 to Local:80
-A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <Local IP on 10.0.0.0/24 Subnet>:80
# forward port 443 to Local:443
-A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <Local IP on 10.0.0.0/24 Subnet>:443
# and forward the responses the other direction
-A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE
COMMIT
Local:
/etc/ufw/before.rules (excerpt)
*nat
:PREROUTING ACCEPT [0:0]
# forward outgoing port 25 to Global:25
-A OUTPUT -p tcp --dport 25 -j DNAT --to-destination <Global IP on 10.0.0.0/24 Subnet>:25
COMMIT
着信HTTP要求はnginxまたはapache設定を使用してルーティングできることを認識していますが、このトラフィックは常にHTTPである必要はないため、プロトコルに依存せず、sshまたは他のプロトコルと連携する一般的なソリューションが必要です。
これを行う方法を知っている人はいますか?
この種の構成が不可能な理由はありますか?
答え1
まあ、ちょっとしたパニックの終わりに元の問題を解決することができたので、後でこの問題が発生する可能性がある人のためにここに正しい解決策を投稿することができます。アプリケーション階層の構成は、元の質問の範囲外です。
まず、ufwを設定した場合は、ファイアウォールによってブロックされず、これらのルールが適用されることを許可する必要があります。これは入るべきです両方ホスト(両方ともufwを持つ場合)これは、以下の手順で実行されます。https://help.ubuntu.com/lts/serverguide/firewall.html「IP Masquerading」セクションで要約すると、次のようになります。
0) edit /etc/default/ufw to set DEFAULT_FORWARD_POLICY="ACCEPT"
1) edit /etc/ufw/sysctl.conf to set net/ipv4/ip_forward=1 and net/ipv6/conf/default/forwarding=1
2) put the desired iptables rules in /etc/ufw/before.rules using ufw's syntax, starting with *nat and ending with COMMIT
3) restart ufw
着信パケットをリダイレクトしてローカルにプロキシするには、次のようにします。グローバル:
#ensure forwarding is enabled, just for sanity's sake (for ufw sysctl.conf covers this)
sysctl -w net.ipv4.ip_forward=1
#rewrite incoming port 222 to Local:22
iptables -t nat -A PREROUTING -p tcp --dport 222 -j DNAT --to-dest <Local IP on 10.0.0.0/24 subnet>:22
#having rewritten the destination, also rewrite the source for all packets that now have a destination of Local:22
#rewriting the source means that the ACKs and other bidirectional data gets sent back to Global instead of attempting to go from Local directly to the originator
iptables -t nat -A POSTROUTING -d <Local IP on 10.0.0.0/24 subnet> -p tcp --dport 22 -j SNAT --to-source <Global IP on 10.0.0.0/24 subnet>
#repeat the above for ports 80 and 443, as in the original question
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-dest <Local IP on 10.0.0.0/24 subnet>:80
iptables -t nat -A POSTROUTING -d <Local IP on 10.0.0.0/24 subnet> -p tcp --dport 80 -j SNAT --to-source <Global IP on 10.0.0.0/24 subnet>
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-dest <Local IP on 10.0.0.0/24 subnet>:443
iptables -t nat -A POSTROUTING -d <Local IP on 10.0.0.0/24 subnet> -p tcp --dport 443 -j SNAT --to-source <Global IP on 10.0.0.0/24 subnet>
これには、着信プロキシ接続が含まれます。発信接続の場合は、次の構成が必要です。地元の:
#rewrite outgoing port 25 to Global:25, UNLESS it's meant for localhost (assumes lo is set up for ipv4, and not just ipv6)
iptables -t nat -A OUTPUT -p tcp '!' -d 127.0.0.1/32 --dport 25 -j DNAT --to-destination <Global IP on 10.0.0.0/24 subnet>:25
#having rewritten the destination, also rewrite the source for all packets that now have a destination of Global:25
iptables -t nat -A POSTROUTING -p tcp '!' -d 127.0.0.1/32 --dport 25 -j SNAT --to-source <Local IP on 10.0.0.0/24 subnet>
そのポートのローカルサーバーに接続できるようにlocalhostを許可する必要があります。これは、SMTPとプロトコルレベル(DNSを含む)でプロキシを実行する他の多くのプログラムが機能する必要がある方法であるためです。したがって、私たちはlocalhostにバインドされていないすべてを渡します。
それだけです!これは、パケットが必要な場所にパケットを送信するこのレベルのスタックの完全な構成です。アプリケーションレベルの設定はこの質問の範囲外です。