이 스크립트의 목적은 localhost<->localhost 및 들어오는 SSH 트래픽을 제외하고 VPN을 통한 트래픽만 허용하는 것입니다. 그러나 SSH를 통해 스크립트를 실행하면 연결이 끊어지고 VM을 다시 시작해야 합니다. 내 스크립트에 문제가 있나요?
#!/bin/bash
iptables -F
#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT
#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
답변1
귀하의 #SSH
규칙은 ssh가 단방향 통신 형태임을 암시하지만 그렇지 않습니다. 데이터가 전송되고 있습니다그리고물러서세요.
클라이언트의 포트 번호를 미리 알 수 없으므로 이를 처리하는 일반적인 방법은 고려되는 연결을 허용하는 것입니다."확립된" 또는 "관련된"설정된 연결로. 이렇게 하려면 다음이 필요합니다.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
DROP
규칙 앞 (규칙은 순차적으로 처리되고 이 두 규칙은 대부분의 패킷에 적용되므로 맨 위에 있는 것이 좋습니다).
TCP 연결이 어떻게 ESTABLISHED되는지에 대한 설명여기;기본적으로 서버가 규칙에서 허용하는 패킷으로 응답한다는 사실이 #SSH
INPUT
이를 가능하게 합니다.
답변2
출력 체인은 다음을 담당합니다.어느패킷이 나갑니다.
스크립트에서는 아웃바운드 패킷이 터널 인터페이스, localhost 및 123.123.123.123의 원격 호스트로만 전송되도록 허용합니다.
위의 대상 중 하나가 아닌 다른 대상으로 패킷을 보내기 위해 SSH 데몬이 필요한 방식으로 서버에 연결하면 트래픽이 허용되지 않습니다.
SSH 데몬에서 SSH 클라이언트로의 아웃바운드 패킷을 허용하려면 다음 규칙을 추가해야 합니다.
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
단일 위치에서만 연결하는 경우 위 규칙에 대상 IP 기준을 추가해야 할 수도 있습니다. 이 규칙은 출력 체인의 최종 "다른 항목 제거" 규칙 앞에 나타나야 합니다.