[컴][리눅스] 방화벽 iptables 사용법

iptables / iptable / table / firewall / 방화벽
정리중…
vi 로 /etc/sysconfig/iptables 를 수정해도 된다. 하지만 좋은 방법인지는 모르겠다.

iptables 현재 상태 확인

iptables -S

-S 는 specification 을 뜻한다.
iptables -S 를 하면 어떤 식으로 iptables 이 설정됐는지 보인다.
$ iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 22 -j DROP
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 21 -j DROP
-A INPUT -i eth1 -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -s 192.168.21.1/32 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 203.133.167.16/24 -j ACCEPT

iptables -L -n --line-numbers

아래처럼 간략하게 볼 수 있다.
$ iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source destination
1    DROP       tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:22
2    DROP       tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:21
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     all  --  203.133.167.16/24    0.0.0.0/0
27   DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT)
num  target     prot opt source destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source destination

-P 옵션

iptables -P INPUT ACCEPT
policy 설정 , target 은 INPUT, FORWARD, OUTPUT 등 의 built-in chain 만이 가능하다. 자세한 것은 ref.1 을 보자.

-A 옵션

append 이다. 현재 있는 rule 들 뒤에 추가(append) 하는 것이다. -A INPUT 하면 INPUT chain 에 append 하는 것이다.
# INPUT chain 에 다음 rule 을 append 해라 - interface eth1 을 ACCEPT 로 jump 해라.
iptables -A INPUT -i eth1 -j ACCEPT

-j 옵션

jum 를 뜻한다. 정해놓은 rule 에 대해 target(ACCEPT, DROP) 을 정해준다. “target 으로 jump 해라.” 정도로 기억하면 된다.
iptables -A INPUT -s 192.168.21.1/32 -j ACCEPT

-D 옵션

특정 rule 을 지울 때 사용한다.
# INPUT chain 에 있는 녀석을 지워라 - 10 번째 있는 rule
iptables -D INPUT 10

-I 옵션

rule 들이 정해진 순서대로 적용된다. 그래서 먼저 적용돼야 하는 것들은 위쪽에 넣어야 한다.
# INPUT 1 위치에 다음 rule을 insert 한다. - protocol 이 tcp 이고 port 가 80 인 녀석을 ACCEPT 로 jump 한다.
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT


DB 연결관련 iptable 설정

db 연결에 있어서 iptables 를 사용할 때 만약 아래와 같은 경우라면, 그냥 MySQL 의 inbound 만 열어주면 된다. (?)

Apache ---> MySQL
  • 모든 OUTPUT 은 열고,
  • INPUT 에서 DB쪽은 server 의 ipaddress 를 추가
  • INPUT 에서 server 쪽은 DB 의 ipaddress 를 추가


참고 예제

아래는 ref. 4 에서 가져온 내용이다. 참고하자.


#!/bin/bash

# setup basic chains and allow all or we might get locked out while the rules are running...
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# clear rules
iptables -F

# allow HTTP inbound and replies
iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

# allow HTTPS inbound and replies
iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

# limit ssh connects to 10 every 10 seconds
# change the port 22 if ssh is listening on a different port (which it should be)
# in the instance's AWS Security Group, you should limit SSH access to just your IP
# however, this will severely impede a password crack attempt should the SG rule be misconfigured
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 -j DROP

# allow SSH inbound and replies
# change the port 22 if ssh is listening on a different port (which it should be)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# root can initiate HTTP outbound (for yum)
iptables -A OUTPUT -p tcp --dport 80 -m owner --uid-owner root -m state --state NEW,ESTABLISHED -j ACCEPT
# anyone can receive replies (ok since connections can't be initiated)
iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

# root can do DNS searches (if your Subnet is 10.0.0.0/24 AWS DNS seems to be on 10.0.0.2)
# if your subnet is different, change 10.0.0.2 to your value (eg a 172.31.1.0/24 Subnet would be 172.31.1.2)
# see http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-dns.html
# DNS = start subnet range "plus two"
iptables -A OUTPUT -p udp --dport 53 -m owner --uid-owner root -d 10.0.0.2/32 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -s 10.0.0.2/32 -j ACCEPT

# apache user can talk to rds server on 10.0.0.200:3306
iptables -A OUTPUT -p tcp --dport 3306 -m owner --uid-owner apache -d 10.0.0.200 -j ACCEPT
iptables -A INPUT -p tcp --sport 3306 -s 10.0.0.200 -j ACCEPT

# now drop everything else
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# save config
/sbin/service iptables save

See Aslo

  1. linux - Using iptables to redirect traffic to a dynamic DNS name instead of an IP address? - Super User : iptables 에서 DNS 설정이 안되는 이유

References

  1. iptables(8) - Linux man page
  2. How to list all iptables rules with line numbers on Linux - nixCraft
  3. How to edit iptables rules - Fedora Project Wiki
  4. How to Configure iptables on an AWS Instance | QuickStepApps

댓글 없음:

댓글 쓰기