AWS VPC + IPtables + NAT : 포트 전달이 작동하지 않습니다


10

어제 여기 에 질문을 올렸지 만 내 말로는 충분하지 않다고 생각합니다. BTW,이 질문은 중복되지 않습니다.

아래와 같이 AWS VPC 설정이 있습니다.

여기에 이미지 설명을 입력하십시오

목표 / 문제 : 인터넷에서 서버 A로 SSH. 그리고 작동하지 않습니다.

서버 A가 프라이빗 서브넷에 있으므로 인터넷에서 직접 서버 A로 ssh 할 수 있도록 내 NAT 인스턴스에서 iptables NAT를 활성화하려고합니다.

나는 이것이것을 따르고있다

NAT 인스턴스에서 아래 명령을 실행했습니다.

NAT# iptables -t nat -A PREROUTING  -p tcp --dport 2222 -j DNAT --to-destination 10.0.1.243:22

NAT 인스턴스에서 IP 전달이 활성화됩니다.

NAT# sysctl  -p
net.ipv4.ip_forward = 1

MASQUERADE가 NAT 인스턴스에서 실행 중입니다.

NAT# iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 6 packets, 312 bytes)
 pkts bytes target     prot opt in     out     source               destination
  199 16466 MASQUERADE  all  --  *      eth0    10.0.0.0/16          0.0.0.0/0

이 테스트 사례에 필요한 다양한 액세스를 허용하도록 AWS 보안 그룹이 올바르게 구성되었습니다.

문제 해결:

포트 22에서 NAT에서 서버 A로 텔넷 할 수 있습니다. 따라서 액세스가 좋습니다.

telnet 54.213.116.251 2222랩톱에서 실행할 때 NAT의 tcpdump 항목이 아래에 표시됩니다.

NAT# tcpdump -n -i eth0 dst 10.0.1.243 and port 22
09:59:13.738316 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S], seq 1868541786, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
09:59:16.737009 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S], seq 1868541786, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
09:59:22.775567 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S], seq 1868541786, win 8192, options [mss 1460,nop,nop,sackOK], length 0

따라서 iptables가 패킷을로 라우팅한다는 의미 10.0.1.243입니다. (BTW, xxx.xxx.xxx.xxx내 노트북의 공용 IP 주소입니다)

그러나 서버 A에서 tcpdump를 실행할 때 10.0.0.54NAT의 내부 / 개인 IP 주소가 무엇인지 알 수 없습니다 ( 그리고 이것이 문제라고 생각합니다 ).

Server A# tcpdump  -n src 10.0.0.54
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 

그러나 NAT 인스턴스에서 서버 A로 텔넷으로 연결하면 서버 A의 tcpdump에 좋은 내용이 표시됩니다 ( 이는 전체 PREROUTING규칙이 예상대로 작동하지 않음을 의미 함 ).

Server A# tcpdump  -n src 10.0.0.54
05:01:47.500080 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [S], seq 2862522431, win 14600, options [mss 1460,sackOK,TS val 3013083 ecr 0,nop,wscale 7], length 0
05:01:47.501601 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [.], ack 760676524, win 115, options [nop,nop,TS val 3013083 ecr 12074896], length 0
05:01:47.535720 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [.], ack 22, win 115, options [nop,nop,TS val 3013092 ecr 12074928], length 0

결론:

NAT의 tcpdump 출력에서 ​​Iptables가 패킷을 올바르게 전달하는 것 같습니다.

서버 A의 TCP 덤프에서 NAT에서 서버 A 로의 연결이 양호합니다.

그러나 엔드 투 엔드에서는 랩톱에서 서버 A에 연결할 수 없습니다.

( BTW, 나는 SSH 터널과 다른 좋은 것들을 알고 있지만 Iptables만이 나를 도울 수 있기를 바랍니다. )


2
NAT 인스턴스에서 소스 / 대상 확인을 비활성화 했습니까?
Dusan Bajic

무슨 뜻이에요? 확인하는 방법? 나는 전체 Iptables 매뉴얼 페이지를 검색했지만 소스 / 대상 확인에 대해 말하지 않습니다 (명백한 것이 빠진 경우가 아니라면)
slayedbylucifer

AWS 웹 콘솔 (또는 CLI)에서이를 수행해야합니다. docs.aws.amazon.com/AmazonVPC/latest/UserGuide/…
Dusan Bajic

감사. 이미 DisabledNAT 인스턴스에 대한 것임을 알았습니다 .
slayedbylucifer

답변:


8

마침내, 나는 그것을 깨뜨렸다 !!!!

NAT 인스턴스에서 아래 명령을 변경해야했습니다.

에서:

iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/16 -j MASQUERADE

에:

iptables -t nat -A POSTROUTING -j MASQUERADE

그리고 그것은 작동했습니다 !!!!

따라서 ServerFault에서 위의 두 명령을 사용할 때의 장단점을 묻는 새로운 질문을 곧 만들 것입니다.


백만에 감사드립니다. 같은 문제가 똑 같았다 ... 모든 단계가 제자리에 있었지만이 "-o eth0"도 있었다. 그것을 제거하고 매력처럼 일했습니다. 백만 감사합니다.
Neven

그것이 작동하는 이유는 "-s 10.0.0.0/16"이 소스 ip 10.xxx 로 패킷을 변환한다고 말했기 때문입니다. 가정용 랩탑이 가정용 네트워크에 있고 일부 외부 IP에서 온 것으로 추측됩니다. NAT 노트북의 요청을 무시하고있었습니다. 다른 사람들은 리눅스 명령 행에서 "ip r"을 실행하여 eth0이 이더넷 장치의 이름인지 확인할 수 있습니다. 그렇지 않은 경우 장치 이름을 바꾸십시오 (예 : ens192 또는 기타).
Ryan Shillington

또한 iptables 매뉴얼 페이지를 읽음으로써 위의 내용을 배웠습니다. 정말 좋고 오래 읽지 않았습니다. 나는 그것을 강력히 추천합니다. 명령 프롬프트에서 "man iptables"를 실행하면 모든 것을 볼 수 있습니다.
Ryan Shillington

7
  • nat 상자의 보안 그룹 2222에서 tcp 포트 inboud를 허용하는지 확인하십시오.0.0.0.0/0
  • VPC "Route Table"이 올바르게 설정되어 있는지 확인하십시오.
  • 최소한 두 개의 개별 테이블 (하나는 개인 서브넷과 관련되고 하나는 공개 서브넷과 관련)
  • 당신의 10.0.1.0목적지 : : (개인) 서브넷은 같은 경로 테이블 규칙이 있어야합니다 0.0.0.0/0, 대상 : "냇 상자"
  • 당신의 10.0.0.0목적지 : : (공개) 서브넷은 같은 경로 테이블 규칙을 가지고 있어야 0.0.0.0/0, 대상 : "인터넷 게이트웨이"
  • NAT 상자에 대해 NIC에서 소스 / 대상 확인 기능을 비활성화 했는지 확인하십시오 . (이미 이미 가지고 있지만 실제로 중요하므로 향후 시청자에게도 포함됨)

  • 아웃 바운드 패킷이 어디로 가야하는지 확인하십시오.

    iptables --table nat --append POSTROUTING --source 10.0.0.0/16 --destination 0.0.0.0/0 --jump MASQUERADE

  • inboud 패킷이 2222올바르게 다시 라우팅되는지 확인하십시오 .

    iptables --table nat --append PREROUTING --protocol tcp --dport 2222 --jump DNAT --to-destination 10.0.1.243:22


귀하의 모든 단일 제안이 이미 제자리에 있습니다. 감사.
slayedbylucifer

1
나는 모든 단계를 보여주기 위해 그것을 업데이트
c4urself

감사. 노력 +1 귀하의 MASQUERADE명령은 제 경우에는 도움이되지 않습니다. 뭔가 빠졌을 수도 있습니다. MASQUERADE내가 날아갈 수 있는 유일한 명령은 내가 대답 에서 언급 한 입니다.
slayedbylucifer

첫 번째 iptables 명령에서만 10.xxx를 라우팅하기 때문에 이것이 작동하지 않는 것을 제외하고는 모두 훌륭한 조언입니다. 그는 인터넷에서 오는 것을 라우팅하려고합니다. 아래의 OP 자체 답변을 참조하십시오.
Ryan Shillington

2

이 게시물은 AWS NAT를 이해하는 데 많은 도움이되었습니다. 그래서 나는 iptables -t nat -A POSTROUTING -j MASQUERADE그것이 효과가 있었던 것을 조사하기 시작 했습니다.

위의 진술에서 찾은 대답은 NAT 상자가 NAT를 'LAPTOP'IP를 '10 .0.0.54 '로 소싱하는 동시에 대상 NAT를 10.0.1.243으로 수행하도록 허용한다는 것입니다. 현재 개인 서브넷 상자는 NAT 장치에서만 들어오는 ssh 요청입니다. 이 명령은 실제로 개인 서브넷 서버의 보안을 감소시킵니다. 아래 명령을 사용하여 아래 언급 된 ssh 및 NAT 상자를 통해 개인 서브넷 액세스를 미세 조정하는 것이 좋습니다.

iptables --table nat --append POSTROUTING --source "INTERNET IP of the Laptop" --destination 10.0.1.243 --jump MASQUERADE

0

조금 더 안전합니다 :

iptables -t nat -I PREROUTING -d 52.213.216.251 -j DNAT --to-destination 10.0.1.243:22
iptables -t nat -I POSTROUTING -s 10.0.1.243 -j SNAT --to-source 52.213.216.251
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.