IP의 패킷이 포트에 도착함 => x초 동안 IP의 포트 범위 열기

IP의 패킷이 포트에 도착함 => x초 동안 IP의 포트 범위 열기

iptables 문제로 어려움을 겪고 있습니다.

단일 패킷이 특정 포트로 전송되므로 포트 범위를 x 초/분 동안 특정 IP에 열어 두려고합니다.

정확히 포트 노킹을 위한 것은 아니지만 동일한 원리입니다. 하지만 작동하게 할 수는 없습니다. 지금까지 내가 한 일은 다음과 같습니다. 방화벽, 특히 iptables를 이제 막 사용하기 시작했기 때문에 뭔가 완전히 오해했을 수도 있습니다.

암호:

#########       UPnP        ###########

#Opens up for all udp ports on local network - not so good.
#-A INPUT -s 10.10.10.254/24 -i eno1 -p udp -m udp -j ACCEPT

#Opens for the needed ports for syncthing but still too many
#-A INPUT -s 10.10.10.254/24 -i eno1 -p udp --match multiport --dports 40000:65000 -j ACCEPT

#allows for related ports to be opened along with ones already established. Does not work
-A INPUT -s 10.10.10.254/24 -i eno1 -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT

###### Opening op selected portrange when udp package is received on port 1900 for x seconds

#Creating chain STATE0-1

-N STATE0
-A INPUT -j STATE0

#Opening and receiving package from port 1900
-A STATE0 -s 10.10.10.254/24 -i eno1 -m state --state NEW -p udp -m udp --dport 1900 -m recent --name UPnPpacket --set -j ACCEPT
-A STATE0 -j DROP

-N STATE1

#Looking at recent with name UPnPpacket and if it exists open ports 40000:65000 for 10 seconds 
###
#-A STATE1 -s 10.10.10.254/24 -i eno1 -m state --state NEW -p udp --match multiport --dports 40000:65000 -m recent --rcheck --seconds 10 --name UPnPpacket -j ACCEPT 
###
#trying this instead
-A STATE1 -m recent --name UPnPpacket --remove
-A STATE1 -s 10.10.10.254/24 -i eno1 -p udp --match multiport --dports 40000:65000 -j ACCEPT
-A STATE1 -j STATE0

보시다시피, 저는 UPnP를 아치 리눅스와 함께 작동시키려고 노력하고 있습니다. 제가 추가할 수 있는 간단한 작업은 아닙니다. :-)

건배,

----------#########------------

고쳐 쓰다:

    ########################################
#########       UPnP        ###########

#allows for related ports to be opened along with ones already established. Does not work on its own
-A INPUT -s 10.10.10.254/24 -i eno1 -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT

#Open up for the multicast discovery (THESE SHOULD BE DELETED ONE BY ONE TO TEST WHICH ARE NEEDED)
-A INPUT -i eno1 -d 224.0.0.0/8 -p igmp -j ACCEPT
-A INPUT -i eno1 -s 0.0.0.0/32 -d 224.0.0.1/32 -p igmp -j ACCEPT
-A INPUT -p igmp -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

# Upon a udp package being received on port 1900 from the local subnet
# the port range 40000:65000 is opened for 30 seconds.

#0 Create chain and give packages received name
-N INTO-PHASE2

#3 Take all packages arriving in chain INTO-PHASE2 and rename them from PHASE1 to PHASE 2 and log the event
-A INTO-PHASE2 -m recent --name PHASE1 --remove
-A INTO-PHASE2 -m recent --name PHASE2 --set
-A INTO-PHASE2 -j LOG --log-prefix "INTO PHASE2: "

#1 Name incoming packages
-A INPUT -s 10.10.10.254/24 -p udp -m recent --update --name PHASE1

#1 Name packages from port 1900 from local subnet and name it PHASE1
-A INPUT -s 10.10.10.254/24 -i eno1 -p udp -m udp --dport 1900 -m recent --set --name PHASE1 -j INTO-PHASE2

# Check for whether a package received on portrange has a sender with the same IP as sender of package PHASE1, if so, pass package into the INTO-PHASE2 chain.
-A INPUT -s 10.10.10.254/24 -p udp --match multiport --dports 30000:65000 -m recent --rcheck --name PHASE1 -j ACCEPT

# Check packages arriving at portrange from local subnet to see if they have the name "PHASE2" - they they do and they are recent open accepting all packages the portrange for 30 seconds
-A INPUT -s 10.10.10.254/24 -p udp --match multiport --dports 30000:65000 -m recent --rcheck --seconds 30 --name PHASE2 -j ACCEPT

#test
#-A INPUT -s 10.10.10.254/24 -p udp --match multiport --dports 30000:65000 -j ACCEPT

#############

문제가 무엇인지 모르겠지만 패키지가 1900 udp에서 수신되고 승인되지만 포트레인지 열기가 거부됩니다....

답변1

다음은 원하는 것을 달성할 수 있는 규칙 세트입니다. (외부 포트 노크를 허용하는 유사한 규칙이 수정되었습니다.

-A INPUT -p udp --dport 30000:65000   -m recent --rcheck --seconds 60 --name UPnP          -j ACCEPT'
-A INPUT -p upd --dport 1899 -m recent                       --name UPnP --remove -j DROP
-A INPUT -p udp --dport 1900 -m recent                       --name UPnP --set    -j DROP
-A INPUT -p udp --dport 1901 -m recent                       --name UPnP --remove -j DROP

예를 들어 실제 UPnP 데몬을 사용하는 것이 더 나을 수도 있습니다 miniupnpd. 그러면 방화벽이 보다 적절한 방식으로 관리됩니다. 일부 데몬은 열린 포트를 네트워크의 모든 호스트가 아닌 요청하는 클라이언트로 제한하도록 구성할 수 있습니다.

관련 정보