주요 규칙은 다음과 같습니다.
OUTIF=eth0
/sbin/iptables --policy INPUT DROP
/sbin/iptables --policy FORWARD DROP
/sbin/iptables --policy OUTPUT ACCEPT
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A INPUT -i $OUTIF -m state --state RELATED,ESTABLISHED -j ACCEPT
lo
mysql이 포트 3306 에서 수신 대기하도록 하고 싶습니다 . 또한 로봇으로부터 멀리 떨어져 있기를 원하기 때문에 WAN 인터페이스( ) eth0
의 포트 33060에서 수신 대기하기를 원합니다.
성공하지 못한 채 여러 번 리디렉션을 시도했습니다. 예를 들어:
/sbin/iptables -A INPUT -p tcp -i $OUTIF --dport 34306 -j ACCEPT
/sbin/iptables -A PREROUTING -t nat -p tcp -s 0/0 --dport 34306 \
-j DNAT --to 127.0.0.1:3306
어떻게 해야 하나요?
편집하다:
나는 사용하고 싶다총디르하지만 여전히 iptables를 사용하여 이 작업을 수행하는 방법을 알고 싶습니다.
답변1
이것은 작동하지만 외부에서 포트 3306에 대한 액세스를 허용하는 경우에만 가능합니다.하지만 이건 작동하지 않아)
iptables -t nat -A PREROUTING -p tcp --dport 34306 --syn -j DNAT --to :3306
하지만 궁극적으로 하고 싶은 일은 :(하지만 그것도 작동하지 않습니다)
iptables -t nat -A PREROUTING -p tcp --dport 34306 --syn -j DNAT --to 127.0.0.1:3306
즉, 외부 인터페이스의 포트 34306으로 전송된 패킷을 127.0.0.1, 포트 3306으로 리디렉션하려고 합니다. 이 방법은 작동하지만 대상이 127.0.0.1로 다시 작성되면 패킷은 화성 패킷(외부에서 들어옴, 대상 127.0.0.1)이 됩니다. 화성 패킷은 정상적으로 조용히 필터링되며 여러분은 정말로 그것을 원합니다.
방화벽 태그와 관련된 좀 더 우회적인 솔루션이 있습니다. 이론: 패킷이 외부 인터페이스에서 포트 34306/tcp를 호출하면 이를 허용 가능한 것으로 표시한 다음 3306/tcp에서 온 것처럼 보이도록 다시 작성합니다. 3306/tcp로의 트래픽표시가 있는허용된. 3306/tcp에 대한 다른 모든 트래픽은 거부됩니다(명시적으로 또는 기본 정책을 통해 암시적으로). 암호:
IFACE=eth0 # or whatever
HIPORT=34306
REALPORT=3306
MARK=42 # not-so-random random number
iptables -t mangle -A PREROUTING -p tcp -i $IFACE --dport $HIPORT -j MARK --set-mark $MARK
iptables -t nat -A PREROUTING -p tcp --dport $HIPORT --syn -j DNAT --to :$REALPORT
iptables -A INPUT -p tcp -m mark --mark $MARK -j ACCEPT
iptables -A INPUT -p tcp --dport $REALPORT -j DROP # explicitly dropping
마지막 규칙은 허용되지 않는 패킷에 대해 조치를 취할 수 있는 곳입니다. 나는 삭제된 모든 패킷을 기록하는 것을 좋아하므로 내 체인은 마지막 두 규칙 a -j LOG
및 에 속합니다 -j DROP
. 그래서 내 경우에는 필요하지 않았지만 귀하의 마일리지는 물론 다양합니다.
방금 이것을 테스트했는데 내 설정에 적합합니다. 이것은 예상보다 조금 더 우회적이지만 이것이 넷필터의 수명입니다.
당신이 사용하는 경우상태 필터링, --syn
규칙 3( -m mark
체인 내 INPUT
)에 추가하고 상태 검사 규칙 앞에 붙여넣습니다. 규칙 4를 사용하여 패킷을 명시적으로 삭제/거부하고 상태 저장 방화벽을 구현하는 경우 --syn
이 규칙도 추가해야 합니다. 좀 더 복잡하지만(8바이트 전체) 태그 확인 규칙은 각 TCP 연결의 SYN(첫 번째) 패킷에만 적용됩니다. 승인/거부 결정이 내려지면 상태 저장 검사 규칙이 나머지 작업을 수행하므로 방화벽은 모든 패킷에 대해 검사 플래그를 유지할 필요가 없습니다. CPU 사이클을 낭비할 이유가 없으며 네트워크 성능을 높게 유지할 수 있습니다.
참고할 사항:
- 귀하의 질문에 포트 33060이 언급되어 있지만 코드는 포트 34306을 사용합니다. 나는 후자를 사용했다.
- MySQL이 실제로 127.0.0.1:3306을 수신하고 있는지 확인하세요. 로컬 통신을 위해 인터넷 도메인(TCP/IP) 소켓 대신 Unix 도메인 소켓을 사용할 수 있으며 네트워크로 연결되어 있지 않습니다.
- 필요한 것은
DNAT
패킷 뿐입니다SYN
. Stateful NAT는 다른 모든 패킷을 자동으로 변환합니다. 이렇게 하면 작업이 약간 더 빨라집니다. - -s 0/0을 명시적으로 지정할 필요는 없으며 소스를 완전히 무시하면 됩니다.
문제는 다음과 같습니다. 모호한 보안은 가혹한 여주인입니다. MySQL이 수신 대기하는 포트를 변경하면 실제로 자신을 보호할 수 없습니다. 포트 스캐너는 자동화된 장치이므로 시스템의 모든 포트를 스캔하는 데 신경 쓰지 않습니다. :) 안전한 방법으로 터널을 ssh
사용하는 것이 좋습니다 -L
. 더 고급 기능을 원하시면 VPN을 사용하세요. 하지만 때로는 인생이 레몬을 주고 넷필터로 레모네이드를 만들어야 할 때도 있습니다. (그것은 여러분이 가지고 있는 몇 안 되는 것 중 하나일 수 있습니다.)할 수 없다그걸로 해)
답변2
nmap과 같은 도구를 살펴보고 봇넷을 지휘하는 악당이 무제한의 시간과 시스템을 가지고 있다는 점을 고려하고 "(쉽게 추측할 수 있는) 포트에 MySQL을 숨기는 데" 얼마나 많은 시간을 투자할 것인지 추정해 보십시오.