라즈베리파이용 방화벽을 만들려고 합니다. 내가 원하는 규칙은
들어오는 SSH 허용 - 작동합니다.
나가는 SSH 허용 - 이것은 작동하지 않으며 내 주요 문제입니다.
- 들어오고 나가는 VNC 허용 - 현재 이 세미웍스에서는 연결할 수 있지만 어떤 작업도 수행할 수 없습니다. 딱히 우선순위는 아니지
- 나가는 https 허용 - 웹사이트를 방문할 수 있지만 부팅 시 제대로 작동하려면 DNS에 대한 다른 줄을 추가해야 할 것 같습니다.
- 발신 이메일 허용 - 작동합니다
- 나가는 핑을 허용하고 응답을 받습니다. 작동합니다.
- 다른 모든 것을 삭제하십시오. 나가는 SSH를 만들 수 없기 때문에 이것이 작동한다고 추측하므로 문제가 내 규칙에 있다고 생각합니다.
나는 방화벽이 로드되지 않은 상태에서 한 파이에서 다른 파이로 나가는 SSH를 만들 수 있기 때문에 일반적으로 내 SSH가 작동한다는 것을 알고 있습니다.
#!/bin/sh
#Flush all rules
iptables -F
#Allow incoming and outgoing SSH
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
#Allow VNC sessions
sudo iptables -A INPUT -s 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -j ACCEPT
sudo iptables -A OUTPUT -d 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --sports 5900:5905,6000:6005 -j ACCEPT
#Accept only incoming etstablished and allow new or established outgoing
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
#Accept port 587 for email
sudo iptables -A INPUT -p tcp --sport 587 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
#Allow ping requests to go out and get a reply
sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
#Drop all other packets and protocols
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT DROP
답변1
22
SSH 라인의 문제는 로컬 시스템의 소스 포트를 허용하려고 한다는 것입니다 . 그러나 원격 SSH 서버에 연결할 때 컴퓨터는 이를 위해 포트 22를 사용하지 않습니다. 일반적으로 더 높은 포트 범위에서 임의 포트를 사용합니다. 나가는 SSH 연결에 포트 22를 사용한다면 한 번에 하나의 SSH 서버에만 연결할 수 있기 때문에 이는 의미가 있습니다.
이 문제를 해결하기 위한 가장 간단한 방법은 --dport
대신을 사용하여 --sport
대상 포트가 (ssh)인 모든 연결을 허용하는 것입니다 22
.
sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
하셔야 한다는 점 참고해주세요추가하다@bcs78이 주석에서 지적했듯이 이 줄을 바꾸는 대신 이 줄을 사용하세요.
내부 루프백 연결에 대한 트래픽을 차단하는 것도 일반적으로 좋지 않은 생각입니다. 일부 프로그램은 이 연결에 의존하며 연결이 없으면 제대로 작동하지 않습니다. 스크립트 시작 부분에 다음을 추가하세요.
sudo iptables -A INPUT -i lo -j ACCEPT
답변2
체인당 한 번씩 포괄 항목을 추가하세요.상태 저장대부분의 다른 규칙을 단순화하는 규칙:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -F
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
모든 로컬 서비스를 허용하는 일반적인 lo
인터페이스 규칙에 더해, 실제로 필요하지 않다고 생각되면 제거하세요.
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
이제 다른 규칙을 복제할 필요가 없습니다( NEW
매우 유용하지 않고 지속적으로 존재하지 않더라도 해당 규칙이 있을 때 상태를 떠납니다).
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 10.10.10.1 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.0.150 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
모든 것은 처음 두 규칙에 의해 처리되므로 모든 규칙을 복제할 필요가 없으며 이제 흐름의 초기 방향은 명확합니다: INPUT
또는 OUTPUT
한 번만. 따라서 --sport 22
SSH용이 나가는 사례( --dport 22
필요함) 에 도움이 되지 않았다는 것이 더 명확해졌습니다 . 관련 오류 응답 에 대한 규칙이 RELATED
있었다면 유용했을 것입니다 . 이 설정에서는 필요하지 않을 수도 있습니다.udp
icmp