iptables 를 사용해서 리눅스 방화벽 설정하기 (접근 제어)
옵션) 방화벽 적용하기.
* 접속자의 IP 가 고정되어 있으면 아래와 같이 방화벽 세팅을,
웹호스팅 서비스와 같이 접속자의 IP를 특정할 수 없으면 fail2ban 을 (https://blog.lael.be/post/858#fail2ban) 사용하세요.
클라우드 방화벽을 사용할 수 있다면(Amazon Security Group, KSCLOUD 방화벽등) 클라우드 방화벽을 이용하세요.
저의 경우 몇대의 단독 VPN 서버가 있으며(즉 어느 위치에 있든지 고정IP 로 활동할 수 있음) 해당 IP 를 방화벽 예외로 설정해 두곤 합니다.
당연한 이야기지만 Ubuntu 에도 방화벽이 있습니다.
무척 당연한 이야기지만 방화벽을 사용하면 서버 보안이 매우 많이 향상됩니다.
현재 방화벽 설정 보기. (List)
#iptables -nL
INPUT (서버로 들어오는 것 관리), FORWARD (서버에서 내부망으로 연결관리;잘 안씀), OUTPUT (서버에서 나가는 것 관리)
로 이루어져 있다.
보통 FORWARD와 OUTPUT은 건들이지 않고 INPUT 만 수정한다.
policy ACCEPT 라는 뜻은 아무 조건도 해당하지 않았을 때 ACCEPT 하라는 것이다.
먼저 현재 방화벽 설정을 파일로 저장한다. 언제든 현재의 상태로 되돌릴 수 있기 위해서 이다.
#cd ~
#mkdir firewall_rules
#cd firewall_rules
#iptables-save > 190309.rules 현재 날짜 쓰세요.
이제 방화벽을 복구해 보자.
#iptables-restore < 190309.rules
#iptables -nL
>>설정 시작.
규칙 : 아이피 111.222.111.222 에 대해서 destination port 가 22 이면 ACCEPT 하여라.
#iptables -A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
아이피 바꾸지 마시고 위의 예시 (111.222.111.222) 그대로 입력하세요.
#iptables -nL
이제 현재 상태에 대해서 방화벽 설정파일을 다시 생성해보도록 하자.
#iptables-save > 190309.rules
FTP나 vi, cat 으로 해당 190309.rules 를 열어보자.
열고나서 코드의 뜻을 대충 해석해보아라. (간단하다.)
하단 *filter 부분에
-A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
가 보이는가?
여러분은 이곳에 아래의 코드를 집어넣어야 한다.
순서가 중요하다. IF-ELSE 같이 동작하기 때문에 조건에 맞으면 바로 지정된 동작을 한다.
211.105.192.168 아이피만 지정하고 싶을 때 -> -s 211.105.192.168/32
211.105.192.* 아이피 그룹을 지정하고 싶을 때 -> -s 211.105.192.0/24
211.105.*.* 아이피 그룹을 지정하고 싶을 때 -> -s 211.105.0.0/16
목적지 포트가 22번(ssh) 포트일 때 -> -dport 22
목적지 포트가 80번(http) 포트일 때 -> -dport 80
목적지 포트가 443번(https) 포트일 때 -> -dport 443
아래는
1. 이미 연결된 것은 허용
2. ping 허용
3. loopback 허용
4. 111.222.111.222 의 22번 포트 접근 허용
5. 123.111.123.111 의 22번 포트 접근 허용
6. 80 포트 접근 허용 (-s 옵션이 없으므로 누구나 허용)
7. 차단
8. FORWARD 차단
의 코드이다.
아까 생성한 .rules 파일을 열어서 아래의 코드를 그림과 같이 코드를 추가하여라. 이때 반드시 당신의 아이피를 추가하여라.
추가가 잘못되어도 어차피 1번의 조건에 의해서 당신의 연결이 끊기지는 않겠지만 새로운 연결은 차단될 것이다.
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -s 123.111.123.111/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited
#iptables-restore < 190309.rules
#iptables -nL
!!!반드시 현재 쉘 연결을 끊지 말고!!!
현재 연결은 1번 조건에 의해서 반드시 허용이기 때문에 괜찮다.
새로 연결창 띄워서 테스트해 보아라.
만약 원하는대로 동작하지 않는다면 다시 .rules 파일을 수정하고 iptables-restore 하여라.
방화벽 설정이 머리가 아프다면
# iptables -F
로 초기화 하고 내일 다시 시도해 보아라.
이 설정은 재부팅이 되면 초기화 된다.
설정을 지속시키도록 하자.
iptables-persistent 설치
#apt-get install iptables-persistent
Yes (엔터), Yes (엔터)
/etc/iptables 라는 폴더가 생성되고
rules.v4, rules.v6 가 생성된다.
부팅시 실행되는 파일을 갱신하자. 아래의 작업은 방화벽 수정할 때마다 해주어야 한다.
#iptables-save > /etc/iptables/rules.v4
ipv6 차단하기
#vi /etc/sysctl.conf
맨 밑에
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
추가.
설정파일 적용
#sysctl -p
검사
#cat /proc/sys/net/ipv6/conf/all/disable_ipv6
1 이면 disable 된 상태이다.
재부팅
#reboot
재부팅 후에 방화벽 규칙이 유지가 되면 성공이다.
#iptables -nL
끝.
혹시, 위 코드에서 아래 2라인 삭제하면 어떤 아이피에서는 SSH 접근 가능한가요?
-A INPUT -s 111.222.111.222/32 -p tcp -m state –state NEW -m tcp –dport 22 -j ACCEPT
-A INPUT -s 123.111.123.111/32 -p tcp -m state –state NEW -m tcp –dport 22 -j ACCEPT
카페24 방화벽에서 이미 특정 아이피만 접근 허용 설정 사용하고 있는 터라,
iptables에서는 SSH 접근 제한을 안 하려고 합니다.
변동 아이피라서 어느 날 아이피 바뀌면 본인도 접근이 불가능하더라구요.
고정아이피 VPN 을 하나 구축해두시는게 좋아요. 저도 집이 유동IP라서 개인 고정아이피 몇개 가지고 있어요.
감사합니다. 공부하는데 많은 도움이 되었습니다~~