iptables Firewall on Ubuntu/Debian

일반적인 리눅스 배포본의 기본 방화벽인 iptables를 쉽게 사용할 수 있는 ufw 를 사용해서 리눅스에 방화벽을 구축하는 방법을 기술하고 있다.

iptables

iptables로 당연히 방화벽을 관리할 수 있다.

iptables -L 플래그

방화벽 룰, 액션에 대해 INPUT, OUTPUT, FORWARD 정보를 볼 수 있다.

1
$ sudo iptables -L

-S 플래그

우리 대신 사용 하 여 각 규칙 및 정책을 사용 하는 데 필요한 명령을 반영 하는 형식으로 출력을 볼 수 있는

1
$ sudo iptables -S

규칙을 모두 리플레시 할 수 있다

1
sudo iptables -F

방화벽

모든 규칙은 DENY -> 일부 허용 순서로 한다. 그래서 TCP 로 1번부터 65526번 포트까지 다 막는 방법이다. 만약 UDP도 막고싶다면,

1
sudo iptables -A INPUT -p tcp --dport 1:65526 -j DROP

ssh 22 자리는 포트

1
2
sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT

혹은 ip address 를 기반으로 설정할 수 있다.

1
2
iptables -I INPUT -p tcp --dport 22 -s 222.222.222.222 -j ACCEPT
iptables -I OUTUT -p tcp --dport 22 -d 222.222.222.222 -j ACCEPT

8080번으로 들어오는 포트를 80 번으로 바꾸기

1
2
3
sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

iptables정보를 저장하고 재부팅 이후에도 동작하도록 설정함. <= vi 로 열어서 맨 마지막에 추가함.

1
2
3
sudo sh -c "iptables-save > /backup/iptables.rules"
sudo vi /etc/network/interfaces
pre-up iptables-restore < /etc/iptables.rules

Web

기본 httpd 사용을 위한 80번 포트 개방과, node.js, python 등 실습을 위한 8080번 포트를 열어 주기 위해서 /etc/sysconfig/iptables 에 아래와 같이 입력한다.

1
2
3
4
5
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

iptables 규칙을 만들 때는 순서가 매우 중요하다.
이 때 주의해야 할 것은 위의 4개 코드가 빨간 색의 코드보다 반드시 위에 적혀 있어야 한다.

예를 들어 만일 chain에서 로컬 192.168.100.0/24 서브넷에서 들어오는 모든 패킷을 drop하도록 지정한 후 (drop 하도록 지정된 서브넷에 포함되는) 192.168.100.13에서 들어오는 패킷을 모드 허용하는 chain (-A)을 그 후에 추가하면 뒤에 추가된 추가 규칙이 무시된다.
먼저 192.168.100.13를 허용하는 규칙을 설정한 후 서브넷을 drop하는 규칙을 설정해야한다.

이후에

service iptables restart

명령어를 실행해주면 2개의 포트가 열러서 정상적으로 외부접속이 가능해지는 것을 확인할 수 있다.

로그에 있는 IP 목록을 출력

1
egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort -u

Check blocked ip addresses

iptables 명령으로 막혀있는 ip address를 출력해 보자. [^3]

1
$ sudo iptables -L -n --line
1
2
$ sudo iptables -L INPUT -v -n
08:43:89:08:00:45:00:00:3c:97:2b:40:00:34:06:4d:8b SRC=90.202.157.25 DST=220.121.141.168 LEN=60 TOS=0x│Chain INPUT (policy DROP 48 packets, 2312 bytes

참조

[^3]: Check blocked IP in iptables

Author

Gangtai Goh

Posted on

2017-11-22

Updated on

2023-05-14

Licensed under

댓글