AWS 인스턴스에서 포트와 IP를 가져오는 iptables 규칙

AWS 인스턴스에서 포트와 IP를 가져오는 iptables 규칙

누군가가 나를 도와주거나 적어도 올바른 방향을 알려줄 수 있기를 바랍니다. 호스트에서 인터넷으로 아웃바운드 트래픽을 제공하는 AWS에 NAT 인스턴스가 있습니다. 이것은 훌륭하게 작동합니다. 내가 해야 할 일은 호스트와 NAT 시스템에서 임의의 포트를 가져와(예를 들어 포트 26을 사용하겠습니다) 포트 25의 NAT 시스템에서 나오도록 변환하는 것입니다. 이 규칙은 제가 일을 하려는 것입니다:

iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 26 -j SNAT --to 172.17.2.125:25

현재 규칙은 IP 주소를 변경하지만 나가는 포트는 변경되지 않은 상태로 유지합니다.

리디렉션은 포트를 행복하게 변경하지만 소스 IP는 변경하지 않습니다(따라서 올바른 공용 IP에 상자를 두지 않습니다).

나는 pfSense나 다른 방화벽 제품을 사용하는 것을 고려해 보았습니다. 그들이 이것을 할 수 있을 것이라고 생각하지만 "단순"해 보이는 것에 비해 과잉인 것 같습니다. 미친 듯이 인터넷 검색을 시도했지만 잘못된 용어를 검색한 것 같습니다. "투명 프록시"를 시도했지만 그것도 작동하지 않는 것 같습니다.

이거 좀 업데이트해

HOST = 172.17.1.125, 포트 26을 통한 아웃바운드 SMTP 연결 NAT = 172.17.2.126 DESTINATION = 216.1.2.3 포트 25(표준 SMTP 포트)

필요한 것은 가지고 있는 것이다.

호스트(내부) -> NAT -> 대상

이를 올바르게 수행하려면 NAT 서버가 포트 26 트래픽을 172.17.2.126 포트 25로 변환해야 합니다.

답변1

테스트 설정: 두 개의 네트워크 네임스페이스 ns0(외부 메일 서버) ns1(호스트). 기본 네트워크 네임스페이스(NAT)는 전달 및 NAT를 수행합니다. 네임스페이스를 연결하는 두 개의 veth 쌍:

ns0 --->     <------ main ns ----->     <--- ns1
veth0b   --- veth0a      veth1a     --- veth1b
10.0.0.1     10.0.0.254  10.0.1.254     10.0.1.1

tcpdumpveth0a 및 veth1a에서. "메일 서버"로 nc -k -l -p 9999포트 9999를 수신합니다. ns0클라이언트는 NAT 없음, 기본 임의 소스 포트를 nc통해 정상적으로 연결됩니다.ns1

$ echo foo | nc 10.0.0.1 9999 -q0
veth*a: IP 10.0.1.1.60560 > 10.0.0.1.9999 
veth*a: IP 10.0.0.1.9999 > 10.0.1.1.60560

소스 포트에서 일치(놀라움을 피하기 위해 모든 일치에 추가했지만 -s없이도 작동함 -s):

# iptables -t nat -A POSTROUTING -o veth0a -s 10.0.1.1/32 -p tcp --sport 8001 -j SNAT --to 10.0.1.81:9900
$ echo foo | nc 10.0.0.1 -p 8001 9999 -q0
veth1a: IP 10.0.1.1.8001 > 10.0.0.1.9999 
veth0a: IP 10.0.1.81.9900 > 10.0.0.1.9999
veth0a: IP 10.0.0.1.9999 > 10.0.1.81.9900
veth1a: IP 10.0.0.1.9999 > 10.0.1.1.8001

대상 포트 일치(규칙이 대상 포트를 다시 쓸 수 없기 때문에 "서버"에 도달하지 않음):

# iptables -t nat -A POSTROUTING -o veth0a -s 10.0.1.1/32 -p tcp --dport 7002 -j SNAT --to 10.0.1.82:9900
$ echo bar | nc 10.0.0.1 7002 -q0
veth1a: IP 10.0.1.1.38614 > 10.0.0.1.7002 
veth0a: IP 10.0.1.82.9900 > 10.0.0.1.7002
veth0a: IP 10.0.0.1.7002 > 10.0.1.82.9900
veth1a: IP 10.0.0.1.7002 > 10.0.1.1.38614

보시다시피 소스 주소와 소스 포트가 모두 훌륭하게 변환되었습니다. 존재하다에스NAT(소스 NAT), 번역만 가능원천주소와 포트는 S가 의미하는 바이며 링크된 문서에 나와 있는 내용입니다. 대조적으로, DNAT에서는 다음을 번역할 수 있습니다.목적지주소와 포트. SNAT는 POSTROUTING( veth0a이 설정에서 켜져야 함)에서 발생하고 DNAT는 PREROUTING( veth1a이 설정에서 켜져야 함)에서 발생합니다. 따라서 이 둘을 하나의 규칙으로 결합할 수 없으며, PREROUTING이 POSTROUTING보다 먼저 발생하므로 SNAT 이후에는 DNAT를 수행할 수 없습니다.

내 생각에 당신이 정말로 원하는 것은 다양한 메일 서버에 접근하는 것이지만,원천표준 25 포트를 다른 포트로 교체하면 주소를 볼 수 있습니다.목적지포트. 예를 들어 mail.xxx.com:26연락처는 mail.xxx.com:25한 주소에서 와야 하고 mail.xxx.com:27연락처는 mail.xxx.com:25다른 주소에서 와야 합니다. (스팸 발송과 관련이 없기를 진심으로 바랍니다...) 따라서 소스 포트는 중요하지 않으며 지정된 대상 포트에 따라 소스 주소가 결정되며 대상 포트는 다시 25로 변경되어야 합니다. 이 올바른지? 그렇다면 nat 작동 방식으로 인해 Linux에서는 쉽게 수행할 수 없습니다.

스팸을 처리하는 데 이 프로그램이 필요하지 않다고 확신할 수 있다면 MTA 소프트웨어의 기능에 따라 두 가지 더 나은 옵션을 생각해 볼 수 있습니다.

답변2

나는 이 문제를 해결하는데 도움을 줄 수 있는 사람을 찾았습니다. 다음은 AWS에서 포트를 나가는 IP 주소에 매핑하는 데 사용하는 규칙입니다.

먼저, 제대로 작동하려면 NAT 인스턴스를 통해 실행해야 합니다. 구성 방법에 대한 많은 리소스가 있습니다.

iptables -t mangle -A PREROUTING -p tcp --dport 27 -j MARK  --set-mark 27
iptables -t nat -A PREROUTING -p tcp --dport 27 -j DNAT --to :25
iptables -t nat -A POSTROUTING -m mark --mark 27 -j SNAT --to-source 10.0.0.11

관련 정보