Post

iptables / firewalld

iptables

체인은 3가지.

  • INPUT
  • OUTPUT
  • FORWARD : 나를 지나가는 패킷. 라우터 등에서 사용.

iptables는 ip 헤더부터 잡힌다. 그 아래는 안잡힘.

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo iptables -L

// 밖으로 나가는 icmp 막기
iptables -A OUTPUT -p icmp -j DROP
iptables -D OUTPUT -p icmp -j DROP

// 80번만 풀기. iptables는 위에서 부터 검사하다 break하기 때문에 먼저 써야 함.
iptables -A OUPUT -p tcp --dport 80 -j ACCEPT
// 밖으로 나가는 tcp 막기
iptables -A OUTPUT -p tcp -j DROP

// netfilter queue로 패킷 보내기.
iptables -A OUTPUT -p tcp --dport 80 -j NFQUEUE

firewalld

  • CentOS 7 부터 iptables가 아니라 firewalld가 기본 방화벽으로 깔려있다.
  • iptables의 업그레이드 wrapper 같은거라 생각하면 된다.
  • iptables와의 가장 큰 차이점은 firewalld는 동적으로 설정을 반영해준다는 점.
    • 따라서 룰 변경 시 네트워크 중단이 발생하지 않는다.
  • zone은 그냥 네트워크 설정 단위 집합 같은거라고 생각하면 됨 default가 public으로 되어 있다.
–permanent 옵션
  • firewall-cmd는 현재 떠있는 firewalld 에서만 적용
    • –reload 또는 재부팅 시 초기화
    • 임시 테스트 시 등등…
  • firewall-cmd –permanent는 영구 설정에 추가
    • 그러나 바로 적용되는 것이 아니라 –reload 한 번 해줘야 함.
현재 서비스 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
확인 systemctl status firewalld
또는 systemctl [| grep firewalld]

실행 systemctl start firewalld

재시작 systemctl restart service_name.service

중지 systemctl stop service_name.service

부팅 시 서비스 자동 시작
systemctl enable service_name.service

부팅 시 서비스 자동 시작 해제
systemctl disable service_name.service
개방되어 있는 포트 확인
1
2
firewall-cmd --zone=public --list-all
netstat -tupan
포트가 외부에서 접속되지 않는다면 포트를 방화벽에 추가하고, 리로드
1
2
3
4
sudo firewall-cmd --zone=public --add-port=8000/tcp --permanent
sudo firewall-cmd --reload

제거는 add만 remove로 바꿔서 써주면 된다.

CentOS 8에서 위처럼 설정 했음에도 접근이 안되는 경우가 있어서, 이런 경우 그냥 firewalld는 내리고 클라우드 방화벽만 유지해도 괜찮아보임.

기타 다양한 사용 예제

https://www.lesstif.com/ws/firewalld-43844015.html

8080 -> 80 포트 redirect

root 이외 계정은 1024 포트를 개방할 수 없기 때문에 80 포트로 jenkins 등을 띄우는 것이 불가능하다.
하지만 hook을 받아야 하는데 80으로만 수신이 가능하다는 등… 꼭 80으로 서비스를 띄워야 하는 경우가 있을 수 있는데,
이 때 8080 -> 80으로 REDIRECT 걸어 두는 방법.

앞단에 nginx 두고, 특정 domain name으로 들어온 경우 특정 port로 proxy_pass를 설정하는 것도 가능하다.
사실 이 방법을 더 많이 쓴다. port redirection 보다 히스토리 관리도 쉽고 명확하기 때문. [nginx] reverse proxy 설정

iptables 사용한 방법

1
2
3
추가 $ iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
확인 $ iptables -t nat -L -n --line-number
제거 $ iptables -t nat -D PREROUTING {rule-number-here}

firewalld 사용한 방법

1
$ firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr={ip}

기타?

클라우드 플랫폼에는 자체적으로 방화벽을 제공해주기 때문에(NCP의 경우 ACG) 시스템 상의 iptables에서도 open, 클라우드 플랫폼에서 관리하는 UI에서도 open, 이렇게 이중으로 열어주어야 한다.

pf.conf

This post is licensed under CC BY 4.0 by the author.