현재는 localhost에서 localhost()로 연결하려는 모든 포트를 허용해야 하는데 iptables -A INPUT -i lo -p tcp -m tcp --dport 8888 -j ACCEPT
, 이는 a) 매번 약간 짜증나고 b) 로컬 포트를 변경하는 서비스에서는 종종 불가능합니다.
netcat
데비안에서 이것을 테스트하고 있습니다 .
nc -vv -l -s 127.0.0.1 -p 8888
127.0.0.1 인터페이스의 포트 8888에서 수신 대기합니다. 연결 시도 중
nc 127.0.0.1 8888
위의 규칙을 수동으로 추가할 때까지 연결이 거부됩니다. 어떻게 해야 하나요?
루프백 인터페이스의 모든 트래픽을 아무 소용이 없도록 허용해 보았습니다.
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
또한 다음을 모두 허용합니다 127.0.0.1
.
-A INPUT -s 127.0.0.1 -j ACCEPT
netstat
127.0.0.1에서 오는 것으로 나열되어 있으므로 작동하지 않아야 합니다 .
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 15338/nc
현재 규칙은 다음과 같습니다.
# Generated by iptables-save v1.6.0 on Thu Jan 25 08:01:28 2018
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 172.20.0.0/24 -j MASQUERADE
COMMIT
# Completed on Thu Jan 25 08:01:28 2018
# Generated by iptables-save v1.6.0 on Thu Jan 25 08:01:28 2018
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:port-scan - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 67:68 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 587 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2368 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 9987 -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1666 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m limit --limit 25/min --limit-burst 100 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A INPUT -i eth0 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j DROP
-A FORWARD -i wintap0 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT
-A OUTPUT -o tun0 -j ACCEPT
-A port-scan -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -m limit --limit 1/sec -j RETURN
-A port-scan -j DROP
참고: 저는 포트가 외부 세계에 표시되는 것을 원하지 않고 내부에서만 표시되기를 바랍니다.
답변1
문제는 거의 확실하게 다음 줄에 있습니다.
-A INPUT -j REJECT --reject-with icmp-port-unreachable
트래픽을 허용하고 필터가 없는 규칙 앞에 오므로 lo
마지막 4개 규칙은 표시되지 않습니다.
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A INPUT -i eth0 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j DROP
인터페이스(127.0.0.1/8)에서만 수신 대기하는 서비스 에 사람들이 연결할 수 있는지 걱정할 필요가 없습니다 lo
. 이는 내부 전용 인터페이스입니다.
답변2
추가하여 지속적으로 행을 추가하는 것과는 반대로 다음을 수행합니다.
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
다음을 입력하여 해당 행을 지속적으로 추가해 보십시오.
-I INPUT -i lo -j ACCEPT
-I OUTPUT -o lo -j ACCEPT
이렇게 하면 규칙이 INPUT 체인 끝이 아닌 앞쪽에 배치됩니다. 이것
-A INPUT -j REJECT --reject-with icmp-port-unreachable
읽기 규칙을 차단합니다.