내 개인 네트워크 앞의 공용 IP 주소에 OpenWRT 게이트웨이(자체 구축 19.07, 커널 4.14.156)가 있습니다. 저는 nftables를 사용하고 있습니다(아니요iptables).
공용 주소에 비표준 포트를 노출하고 이를 게이트웨이 뒤에 있는 시스템의 표준 포트로 전달하고 싶습니다. 나는 이것을 포트 전달이라고 불렀다고 생각합니다. 게이트웨이 시스템이 http를 서비스하는 것처럼 보이지만 실제로는 게이트웨이 뒤의 개인 주소에 있는 시스템입니다.
이것이 내 nftables 구성입니다. 이러한 목적을 위해 내 "표준 서비스"는 포트 1234에 있으며 게이트웨이: 4321을 통해 공개 액세스를 허용하고 싶습니다.
#!/usr/sbin/nft -ef
#
# nftables configuration for my gateway
#
flush ruleset
table raw {
chain prerouting {
type filter hook prerouting priority -300;
tcp dport 4321 tcp dport set 1234 log prefix "raw " notrack;
}
}
table ip filter {
chain output {
type filter hook output priority 100; policy accept;
tcp dport { 1234, 4321 } log prefix "output ";
}
chain input {
type filter hook input priority 0; policy accept;
tcp dport { 1234, 4321 } log prefix "input " accept;
}
chain forward {
type filter hook forward priority 0; policy accept;
tcp dport { 1234, 4321 } log prefix "forward " accept;
}
}
table ip nat {
chain prerouting {
type nat hook prerouting priority 0; policy accept;
tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200;
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
tcp dport { 1234, 4321 } log prefix "nat-post ";
oifname "eth0" masquerade;
}
}
이 설정을 사용하면 외부 컴퓨터가 gateway:1234
. 로깅은 나머지 패킷을 처리하는 "기존 연결"을 통해 nat-pre
외부에서 게이트웨이 IP로 이동한 다음 forward
외부에서 내부 IP로, 외부에서 내부로 이동하는 SYN 패킷을 보여줍니다.nat-post
gateway:4321
로그 에 연결된 외부 머신은 입니다 raw
. 여기서 4321은 1234로 변경됩니다. 그런 다음 SYN 패킷이 내부 서버로 전달되고 응답 SYN 패킷이 다시 돌아온 다음... 아무것도 없습니다!
문제는 원격 시스템이 기대하는 것을 다시 변경하는 nftables 구성이 없다는 것입니다 internal:1234
. 로 변경 gateway:4321
되더라도 원격 시스템은 이를 예상하지 못하고 덤프할 수 있습니다.masquerade
internal:1234
gateway:1234
이 구성에 대해 어떻게 생각하시나요?
답변1
포트 번호를 번역하지 않았습니다. 1234번 포트에 외부적으로 연결하는 경우에는 문제가 되지 않습니다. 그러나 4321에 도달하면 dnat는 포트 1234 대신 내부 서버의 포트 4321로 전달됩니다. 노력하다
tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200:1234;
내부 서버에서 반환된 응답 패킷은 번역할 필요가 없습니다. 이는 첫 번째 syn 패킷에서 생성된 연결 추적 테이블의 항목을 사용하여 자동으로 수행됩니다.