프로토콜 독립적인 양방향 포트 전달을 구성하는 방법은 무엇입니까?

프로토콜 독립적인 양방향 포트 전달을 구성하는 방법은 무엇입니까?

다음 문제를 해결하려고 합니다.


앞으로는 "로컬"이라고 부르겠습니다. 이 시스템은 포트 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에 바인딩되지 않은 모든 것을 전달합니다.

그게 다야! 이는 패킷이 필요한 위치로 패킷을 보내는 이 수준의 스택에 대한 완전한 구성입니다. 애플리케이션 수준 구성은 이 질문의 범위를 벗어납니다.

관련 정보