포트에서 다른 호스트:포트로 모든 TCP 트래픽 라우팅

포트에서 다른 호스트:포트로 모든 TCP 트래픽 라우팅

10.0.1.110.0.1.2원격 서버( )와 로컬 컴퓨터( ) 사이에 VPN을 생성하여 서버가 로컬 컴퓨터에 연결하거나 그 반대의 경우도 가능하도록 하는 와이어가드 구성이 있습니다 .

서버가 포트에서 들어오는 모든 TCP 연결을 8000내 로컬 컴퓨터로 라우팅하기를 원합니다.

내가 시도한 것:

이 답변:

iptables -t nat -I PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -I POSTROUTING -p tcp --dport 8000 -d 10.0.1.2 -j MASQUERADE

이 답변도 있습니다 (quora):

iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -D POSTROUTING -j MASQUERADE

또한 이것을 시도했습니다:

iptables -t nat -A POSTROUTING -p tcp -d 10.0.1.2 --dport 8000 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.0.1.2:8000

그 중 어느 것도 작동하지 않습니다(인터넷을 통해 액세스할 수 없음).

물론 nginx이 작업을 수행하기 위해 서버를 설정할 수 있지만 웹소켓 연결처럼 내가 원하는 만큼 안정적이거나 강력하지는 않습니다.

VPN 연결과 방화벽은 잘 작동합니다. curl원격 서버의 셸에서 로컬 컴퓨터의 서버에 액세스 할 수 있고 8000원격 서버의 포트에서 시작된 HTTP 서버에 액세스할 수 있습니다. 도.sysctl net.ipv4.ip_forward1

답변1

예를 들어 테이블을 제어할 수 있는 다른 도구를 실행하고 있는지 여부를 설명하지 않았습니다 firewalld. 이로 인해 규칙이 적용되지 않을 수 있습니다.

FORWARD또한 메인 테이블의 규칙 에 대해 이야기하는 것을 볼 수 없습니다 .

iptables의 전체 목록을 보지 못했습니다. NAT 규칙보다 먼저 적용되는 체인의 앞부분에서 DROP 또는 REJECT로 이동하는 다른 규칙이 있을 수 있습니다.

(RHEL 7에서 자체 방화벽을 구축하는 방법에 대해 자세히 설명합니다.https://www.sweharris.org/post/2017-05-07-home-grown-router/ - 간단한 요약은 다음과 같습니다.)

일반적으로 처음부터 시작하는 경우 NAT를 시작하기 전에 마스터 테이블을 설정해야 합니다. INPUT 체인은 컴퓨터로 향하는 패킷용이고, OUTPUT 체인은 컴퓨터에서 발생하는 패킷용이며, FORWARD 체인은 패킷용입니다.시간 여행당신의 기계.

내 경우에는 세 가지를 모두 동일하게 설정했습니다.

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP

시작 트래픽을 허용해야 할 수도 있습니다.

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i internal_interface -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A FORWARD -i internal_interface -j ACCEPT
iptables -A FORWARD -i external_interface -m conntrack --ctstate DNAT -j ACCEPT

eth0저는 "external_interface"를 사용합니다. 이는 VPN, 터널 tun0또는 브리지(제가 사용하는 것) 와 같은 인터페이스일 수 있습니다 .

이를 통해 "내부"의 트래픽이 외부로 도달하고 외부가 응답할 수 있습니다.

이제 NAT를 시작하여 "내부" 머신이 "외부" 머신에 액세스할 수 있습니다.

iptables -t nat -A POSTROUTING -o external_interface -j MASQUERADE

이로 인해 로컬 네트워크를 떠나 외부 세계로 가는 모든 트래픽이 외부 인터페이스의 주소로 NAT됩니다.

이제 이미 시도한 것과 유사한 규칙을 사용하여 외부 트래픽이 방화벽 뒤의 내부 컴퓨터에 도달하도록 허용할 수 있습니다.

예를 들어

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443

이러한 규칙 중 일부는 반드시 필요한 것은 아니지만 그 사이에서 잘못된 형식의 패킷, 내부가 외부(및 외부의 응답)에 도달하는 기능, 포트 전달을 통해 내부의 특정 서비스에 도달하는 외부의 기능을 필터링할 수 있습니다.

관련 정보