내 서버(다음 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 체인으로 이동하며, 여기서 DNAT로 표시됩니다.
- 패킷은 nat 테이블에서 POSTROUTING 체인으로 이동하여 SNAT가 됩니다.
- 내 Apache는 에서 왔고
192.168.3.106
내 요청에 응답하고 있습니다. - 패킷이 DNATed되어야 하는 nat 테이블의 PREROUTING 체인에 도달하고 있습니다.
- 패킷은 전달되어 어딘가에 던져집니다.
5, 6을 제외하면 모든 것이 예상대로 작동하는 것 같습니다. 즉, 서버로부터 응답을 받습니다.내 논리가 어디에서 깨졌는지 설명할 수 있는 사람이 있나요?
답변1
iptables nat 테이블은 (의사) 연결의 첫 번째 패킷에 대해서만 통과됩니다. 후속 패킷은 첫 번째 패킷에 의해 설정된 매핑에 따라 매핑(또는 유지)됩니다.