NAT 반사(NAT 루프백)의 예로 OpenWRT에서 자동으로 생성된 규칙을 사용하고 있습니다.
따라서 두 개의 호스트(+ 라우터)(192.168.1.100 및 192.168.1.200)가 있는 네트워크 192.168.1.0/24가 있다고 가정해 보겠습니다. 라우터에는 LAN(br-lan)과 WAN(eth0)의 두 가지 인터페이스가 있습니다. LAN 인터페이스의 IP는 192.168.1.1이고 WAN 인터페이스의 IP는 82.120.11.22(공용)입니다. 192.168.1.200에 www 서버가 있습니다. 공용 IP 주소를 사용하여 192.168.1.100에서 웹 서버에 연결하려고 합니다.
인터넷 사용자가 웹 서버에 액세스할 수 있도록 WAN->LAN을 리디렉션하려면 iptables에 다음 규칙을 추가할 수 있습니다.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200:80
나는 규칙이 무엇을 의미하는지 알고 있다. 그러나 NAT 반사를 담당하는 두 가지 다른 규칙이 있습니다. 그 중 하나는 위와 같이 나에게 명확하지 않습니다. 따라서 첫 번째 규칙은 다음과 같습니다.
iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200
이는 192.168.1.0/24 네트워크에서 공용 IP, 포트 80까지의 모든 트래픽이 로컬 웹 서버로 전송되어야 함을 의미합니다. 즉, Firefox에 공용 IP를 입력하면 서버에서 반환된 페이지를 받아야 한다는 의미입니다. 오른쪽? 테이블의 다른 모든 전달 마법이 filter
완료되었지만 여전히 공용 IP를 사용하여 웹 서버에 연결할 수 없습니다. 패킷이 규칙과 일치하지만 아무 일도 일어나지 않습니다.
nat
전체 메커니즘이 작동하려면 또 다른 규칙이 필요합니다 .
iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1
이 규칙이 왜 필요한지 모르겠습니다. 이 규칙이 무엇인지 설명할 수 있는 사람이 있나요?
답변1
NAT가 제대로 작동하려면 클라이언트에서 서버로, 서버에서 클라이언트로의 패킷이 NAT를 통과해야 합니다.
iptables의 NAT 테이블은 연결의 첫 번째 패킷에만 사용됩니다. 연결과 관련된 후속 패킷은 첫 번째 패킷이 변환될 때 생성된 내부 매핑 테이블을 사용하여 처리됩니다.
iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200
이 규칙이 적용될 때마다 다음이 발생합니다.
- 클라이언트는 초기 패킷(tcp syn)을 생성하고 이를 공용 IP로 지정합니다. 클라이언트는 소스 IP/포트와 대상 IP/포트가 교환되는 이 패킷에 대한 응답을 기대합니다.
- 클라이언트의 라우팅 테이블에는 특정 항목이 없으므로 기본 게이트웨이로 전송됩니다. 기본 게이트웨이는 NAT 상자입니다.
- NAT 상자는 초기 패킷을 수신하고, 대상 IP를 수정하고, 매핑 테이블 항목을 설정하고, 라우팅 테이블에서 새 대상을 찾아 패킷을 서버로 보냅니다. 소스 주소는 변경되지 않습니다.
- 서버는 초기 패킷을 수신하고 응답(syn-ack)을 합니다. 이에 대한 응답으로 소스 IP/포트는 대상 IP/포트와 교환됩니다. 들어오는 패킷의 소스 IP는 변경되지 않았으므로 응답의 대상 IP는 클라이언트의 IP입니다.
- 서버는 라우팅 테이블에서 IP를 조회하고 패킷을 클라이언트로 다시 보냅니다.
- 클라이언트는 소스 주소가 예상한 주소와 일치하지 않기 때문에 패킷을 거부합니다.
iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1
이 규칙을 추가하면 이벤트 순서가 변경됩니다.
- 클라이언트는 초기 패킷(tcp syn)을 생성하고 이를 공용 IP로 지정합니다. 클라이언트는 소스 IP/포트와 대상 IP/포트가 교환되는 이 패킷에 대한 응답을 기대합니다.
- 클라이언트의 라우팅 테이블에는 특정 항목이 없으므로 기본 게이트웨이로 전송됩니다. 기본 게이트웨이는 NAT 상자입니다.
- NAT 상자는 초기 패킷을 수신하고 NAT 테이블의 항목을 기반으로 대상 IP, 소스 IP 및 가능한 경우 소스 포트를 수정하고(모호성을 명확하게 해야 하는 경우에만 소스 포트 수정) 매핑 테이블 항목을 구축하고 라우팅 테이블에 새로운 목적지를 추가하고 패킷을 서버로 보냅니다.
- 서버는 초기 패킷을 수신하고 응답(syn-ack)을 합니다. 이에 대한 응답으로 소스 IP/포트는 대상 IP/포트와 교환됩니다. 들어오는 패킷의 소스 IP는 NAT 상자에 의해 수정되었으므로 패킷의 대상 IP는 NAT 상자의 IP입니다.
- 서버는 라우팅 테이블에서 IP를 조회하고 패킷을 NAT 상자로 다시 보냅니다.
- NAT 상자는 NAT 매핑 테이블에서 패킷 세부 정보(소스 IP, 소스 포트, 대상 IP, 대상 포트)를 조회하고 역변환을 수행합니다. 이렇게 하면 소스 IP가 공용 IP로, 소스 포트가 80으로, 대상 IP가 클라이언트 IP로, 대상 포트가 클라이언트가 사용한 소스 포트로 다시 변경됩니다.
- NAT 상자는 라우팅 테이블에서 새 대상 IP를 조회하고 패킷을 클라이언트로 다시 보냅니다.
- 클라이언트가 패킷을 수락합니다.
- NAT는 패킷을 앞뒤로 변환하고 통신은 계속됩니다.
답변2
역방향 트래픽도 openwrt를 통해 흐르도록 강제하는 것처럼 들립니다. 웹 서버가 볼 소스 주소를 다시 작성합니다.
네트워크 서버가 클라이언트에 직접 응답하는 경우 소스 주소는 다음과 같습니다.그것들패킷은 여전히 웹 서버의 패킷입니다. 그러나 클라이언트는 openwrt IP와 통신을 시도하고 있습니다. 따라서 응답 패킷이 삭제됩니다.
첫 번째 경우에는 웹 서버에서 인터넷 클라이언트로의 경로가 이미 openwrt 상자를 통과하기 때문에 이를 시행할 필요가 없습니다.