Ubuntu-16.04.02-LTE에 내장된 Linux 커널 4.10-28-generic에서 다음 문제에 직면했습니다. 내 컴퓨터에는 다음과 같은 두 개의 이더넷 어댑터가 있습니다.
enp0s3: 198.168.56.2(내부 네트워크)
enp0s8: 172.22.181.41(외부 네트워크)
enp0s3에 연결된 내부 네트워크에는 enp0s8을 통해 연결된 외부 네트워크에서 접속하려는 FTP 서버와 Telnet 서버가 있습니다.
FTP 모드를 활성화해야 합니다.
이 작업을 수행하기 위해 다음 iptables 규칙을 사용합니다.
modprobe nf_conntrack_ftp
modprobe nf_nat_ftp
sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
## Masquerade settings
iptables -A POSTROUTING -t nat -o enp0s3 -j MASQUERADE
iptables -A POSTROUTING -t nat -o enp0s8 -j MASQUERADE
## ftp rules
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 20 -i enp0s8 -j DNAT --to-destination 192.168.56.2:20
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 21 -i enp0s8 -j DNAT --to-destination 192.168.56.2
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 1024:65535 -i enp0s8 -j DNAT --to-destination 192.168.56.2:1024-65535
## telnet rules
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 23 -i enp0s8 -j DNAT --to-destination 192.168.56.2`
이러한 규칙은 Linux 커널 2.6.32-38-generic을 사용하는 Ubuntu-10에서 작동하지만 새 커널과의 데이터 연결을 설정할 수 없습니다. 클라이언트가 PORT 명령을 실행하면 서버가 서버의 IP 주소를 받습니다. 내부 네트워크 대신 외부 네트워크. 서버 측에서 실행되는 "netstat"에 따르면 "nf_nat_ftp" 모듈이 제대로 작동하지 않는 것 같습니다. 즉, 클라이언트 IP 주소(외부 주소)를 입력 인터페이스 enp0s8(내부 주소)의 IP 주소로 바꾸지 않는 것입니다. 명령을 서버에 전달하기 전에. 따라서 서버가 외부 IP 주소(SYN 상태)에 대한 연결을 설정하려고 시도하면서 중단됩니다.
FTP는 텔넷 연결뿐만 아니라 수동 모드에서도 문제 없이 작동합니다.
이 문제를 해결하기 위한 제안을 해주실 수 있나요? 이것은 회귀입니까, 아니면 새로운 요구 사항에 따라 iptables 규칙을 변경해야 합니까?
미리 감사드립니다!
감사합니다, 스테파노
답변1
이미 나는이 질문은 superuser.com에서 답변되었습니다.
기본적으로 최신 커널(>=4.7)에서는 명시적 규칙을 위해 자동 도우미 모듈 포트 할당을 더 이상 사용하지 않습니다.
이전 동작에 대한 간단한 수정을 받으세요.
echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper
더 나은 장기 수정(더 많은 작업이 필요하지만 더 나은 제어 제공):
자세한 내용은 iptables-extensions(8) 매뉴얼 페이지의 CT 대상 설명을 참조하십시오.
또한 이 블로그에서 예제를 읽어보세요.
https://home.regit.org/netfilter-en/secure-use-of-helpers/
중요: 많은 FTP 규칙이 의미가 없습니다(두 번째 규칙만 필요함). 예를 들어, 그런 것은 없습니다 --dport 20
. 한 번. 활성 FTP 사용원천포트 20, 절대로목적지포트 20. nf_conntrack_ftp/nf_nat_ftp가 이미 이것을 처리하고 있습니다. NAT 관련 연결을 전혀 시도하지 마십시오. 그것이 보조자의 임무입니다.
방화벽을 사용하는 경우 방화벽 규칙( filter
아님 nat
)에는 일반적인 규칙만 있으면 됩니다 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
(장기적인 솔루션에 대해서는 이에 대한 블로그도 읽어보세요). 어쩌면 모든 규칙을 설정하지 않았거나 방화벽을 사용하지 않고 있을 수도 있습니다.