iptables 규칙을 적용할 때 SSH 세션 손실

iptables 규칙을 적용할 때 SSH 세션 손실

SSH와 iptables만으로는 설명할 수 없는 문제가 있습니다. 간단히 말해서 SSH를 사용하여 원격 호스트(Ubuntu 18.04 실행)에 연결하고 iptables 규칙을 적용하는 스크립트를 실행하면 실행 중인 SSH 세션이 손실됩니다. 다시 연결할 수 있지만 실행 중인 세션이 손실됩니다.

스크립트는 명령을 사용하여 iptables 규칙을 플러시 netfilter-persistent flush한 후 다음 iptables-save형식으로 이 규칙 세트를 적용합니다.

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -s x.x.x.x/XX -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j LOG --log-prefix "INPUT DROP: "
-A FORWARD -j LOG --log-prefix "FORWARD DROP: "
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state INVALID -j DROP
-A OUTPUT -d x.x.x.x/XX -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -d x.x.x.x/32 -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -d x.x.x.x/32 -p udp -m udp --dport 123 -j ACCEPT
-A OUTPUT -d x.x.x.x/32 -p tcp -m tcp --dport 3128 -j ACCEPT
-A OUTPUT -j LOG --log-prefix "OUTPUT DROP: "
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

스크립트가 완료된 후 세션이 손실되고 .NET에서 양방향으로 차단된 SSH 패킷을 볼 수 있습니다 /var/log/kern.log. 연결 추적 정보가 손실된 경우 이는 의미가 있지만 여전히 연결이 가능합니다 conntrack -L(서버는 VM이므로 SSH 연결이 손실된 경우에도 확인할 수 있습니다).

더 이상하게도 그렇게 하면 netfilter-persistent flush && ./myscript연결이 유지됩니다. 하지만 두 명령을 차례로 실행하면 연결이 끊어집니다. 또한 VM TTY에서 두 명령을 실행해도 연결이 끊어지지 않습니다.

누구든지 이 동작을 설명할 수 있나요?

답변1

기본 정책은 "DROP"으로 설정되어 있습니다.

따라서 규칙을 플러시하고 추가하는 사이에는 패킷이 허용되지 않으며 연결이 끊어집니다.

스크립트가 규칙을 추가하지 못하면 망할 것입니다.

일치하지 않는 모든 항목을 삭제하려면 (각 체인의) 끝에 규칙을 수락하고 추가하도록 정책을 설정해야 합니다.

관련 정보