내 서버(아래 iptables
규칙이 로드됨)에는 IP가 있습니다 192.168.3.110
. 내 LAN에 IP가 있는 다른 컴퓨터가 있습니다 192.168.3.106
. 포트 80에서 내 서버로의 요청을 192.168.3.106
.
iptables
CentOS 7 서버에 다음 파일이 로드되어 있습니다 .
*nat
:PREROUTING DROP
:INPUT DROP
:OUTPUT DROP
:POSTROUTING DROP
-A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A PREROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A PREROUTING --dst 192.168.3.110 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.106
-A PREROUTING -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A OUTPUT --dst 192.168.3.110 -p tcp -m state --state NEW --dport 80 -j DNAT --to-destination 192.168.3.106
-A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A POSTROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A POSTROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A POSTROUTING --src 192.168.3.0/24 --dst 192.168.3.106 -p tcp --dport 80 -j SNAT --to-source 192.168.3.110
-A POSTROUTING -o lo -j ACCEPT
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -j ACCEPT
-A OUTPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
기본적으로 나는 다음을 수행하고 있습니다(적어도 나는 그렇게 이해합니다).
SSH 활성화
포트 80에서 TCP를 활성화합니다.
DNAT 및 SNAT 패킷을 사용하여 원하는 동작을 달성합니다.
질문:내 서버에서 자체 서버로 호출할 때 192.168.3.110
응답을 받는 이유를 이해할 수 없습니다.
이것이 제가 이 경우에 작동해야 한다는 것을 이해하는 방법입니다.
curl http://192.168.3.110
- IP를 사용하여 내 서버에서 이것을 실행한다는 것을 잊지 마십시오.192.168.3.110
- 패킷은 NAT 테이블의 OUTPUT 체인으로 이동하며, 여기서 DNATed됩니다.
- 패킷은 NAT 테이블에서 POSTROUTING 체인으로 이동하며, 여기서 SNAT가 발생합니다.
- 내 Apache가
192.168.3.106
내 요청에 응답하고 있습니다. - 패킷이 DNATed되어야 하는 nat 테이블의 PREROUTING 체인에 도달하고 있습니다.
- 패킷이 전달되어 어딘가에 던져집니다.
5와 6을 제외하고 모두 예상대로 작동하는 것 같습니다. 즉, 서버로부터 응답을 받습니다.내 논리가 어디에서 깨졌는지 설명해 줄 수 있는 사람이 있나요?
답변1
iptables nat 테이블은 (유사) 연결의 첫 번째 패킷에 대해서만 통과됩니다. 이후 패킷은 첫 번째 패킷에 의해 설정된 매핑에 따라 매핑되거나 단독으로 유지됩니다.