iptables-restore
미리 설정해둔 파일의 방화벽 룰로 설정(복구)하는 명령어
ex)
iptables-restore /경로/파일명
파이썬 설치
$ sudo dnf -y install python3.12
$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A OUTPUT -d 1.1.1.1/32 -j DROP
-A OUTPUT -d 1.1.1.2/32 -j DROP
-A OUTPUT -d 1.1.1.3/32 -j DROP
룰 간략하게 보기
ip 전체를 쓰고 prefix를 지정하지 않으면 자동으로 /32가 붙는다ex) -A INPUT -s 192.168.1.0/32 -j ACCEPT
tcpdump 설치 $ sudo dnf -y install tcpdump $ sudo tcpdump -i ens160 -p icmp
ens160 모니터링 시킨뒤cmd로 ping 치자 그에 대한 내용이 실시간 출력됨
$ sudo tcpdump -i ens160 -p icmp -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
14:37:27.139804 IP 192.168.100.1 > 192.168.100.10: ICMP echo request, id 1, seq 9, length 40
14:37:27.139843 IP 192.168.100.10 > 192.168.100.1: ICMP echo reply, id 1, seq 9, length 40
-n 옵션을 추가하면 nids가 아니라 192.168.100.10 으로 표기됨
포트 제어하기
$ sudo iptables -F
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -s 192.168.100.3 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -s 192.168.100.1 -j DROP
$ sudo iptables -A INPUT -j DROP <- (policy ACCEPT) 이므로
세 개의 룰 빼고 전부 드랍
.3 에서는 ACCEPT
.1 에서는 DROP 확인
(테스트는 lynx, 웹 브라우저 등 사용)
+ 어차피 허용되는 룰 빼고는 전부 차단하고 있으므로, DROP 룰은 없애도 상관없음
그렇지만 접속시도의 경로를 확인하려면 룰이 따로 있는게 나을 수 있다고 생각...
SSH 서비스에 접근하는 방화벽 룰 설정
ssh 포트 설정
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
dport 22 또는 ssh로 사용
$ sudo dnf -y install mod_ssl
=> 기본인증서가 포함되어 있다
$ sudo systemctl restart httpd
설치하면 https로 접속
접속하면 경고메세지가 나오지만 접속가능
( 기본인증서는 안전한 인증서가 아니므로 경고메시지가 뜬다 )
$ sudo iptables -F
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.100.1 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport ssh -s 192.168.100.3 -j DROP
$ sudo iptables -A INPUT -j DROP
.3에서는 ssh로 접속 불가, .1에서는 ssh로 접속 가능.
...
20 7641 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
https 접속시 마찬가지로 카운트된다
mc 패키지 설치
레드햇 계열은 rpm, 데비안 계열은 dpkg 사용
$ sudo dnf -y install mc
$ mc
F10 눌러서 종료 가능
이 때 방화벽에 룰을 추가하고
$ sudo dnf -y remove mc
$ sudo dnf -y install mc
삭제후 재설치하면 막혀서 안됨
종료는 ctrl + c 하거나 ctrl + z 해서 kill %1로 프로세스 중단
$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 9180 packets, 18M bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
607 32792 ACCEPT tcp -- * * 192.168.100.1 0.0.0.0/0 tcp dpt:22
8 1392 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
(현재 vm웨어를 사용하고 있으므로) 호스트 os인 윈도우 쪽 192.168.100.1 패킷이 차단된 것 확인됨
이 때dns 서버 포트를 허용하면 패키지 설치가 가능해진다dns - 53번 tcp, udp 포트
$ sudo cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 168.126.63.1
nameserver 168.126.63.2
현재 등록된 dns 네임서버는 168.126.63.1 과 .2 이다 $ sudo iptables -A INPUT -s 168.126.63.1 -p udp --sport 53 -j ACCEPT
$ sudo iptables -A INPUT -s 168.126.63.2 -p udp --sport 53 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPTtcp와 udp 등록
$ sudo iptables -nvL --line
Chain INPUT (policy ACCEPT 9182 packets, 18M bytes)
num pkts bytes target prot opt in out source destination
- 생략 -
3 398 18096 ACCEPT tcp -- * * 192.168.100.1 0.0.0.0/0 tcp dpt:22
4 16 2148 ACCEPT udp -- * * 168.126.63.1 0.0.0.0/0 udp spt:53 /* KT DNS Response Traffic */
5 0 0 ACCEPT udp -- * * 168.126.63.2 0.0.0.0/0 udp spt:53 /* KT DNS Response Traffic */
6 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80 /* HTTP Traffic */
7 7693 15M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:443 /* HTTPS Traffic */
8 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
mc 패키지 설치 후 패킷 허용, 차단 현황 확인 가능
kt dns와 https가 사용되었다
iptables-services 패키지를 사용해 부팅시 자동으로 등록되게 할 수 있다
발전 : iptables > firewalld > nftables
iptables-save > 방화벽_정책_파일명
현재 방화벽 룰을 파일명으로 저장한다
# iptables-save test
저장 후 reboot하면 룰이 전부 리셋되어 있는데
# iptables-restore test
# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
12 864 ACCEPT tcp -- * * 192.168.100.1 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT udp -- * * 168.126.63.1 0.0.0.0/0 udp spt:53 /* KT DNS Response Traffic */
0 0 ACCEPT udp -- * * 168.126.63.2 0.0.0.0/0 udp spt:53 /* KT DNS Response Traffic */
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80 /* HTTP Traffic */
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:443 /* HTTPS Traffic */
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 7 packets, 1144 bytes)
pkts bytes target prot opt in out source destination
test 파일을 통해 룰이 복구되었다
+
cat 사용법을 grep으로 필터링하려는데
# cat --help | grep -n
사용법: grep [옵션]... 패턴 [파일]...
Try 'grep --help' for more information.
에러남
# cat --help | grep -- -n
-b, --number-nonblank number nonempty output lines, overrides -n
-n, --number number all output lines
-v, --show-nonprinting ^ 와 M- 표기법을 사용합니다 (LFD와 TAB 제외)
이 때는 -- 를 추가하여, -n을 옵션으로 취급하지 않고 필터링할 단어로 취급하여 필터링 할 수 있다
sudo iptables-save > /etc/sysconfig/iptables 로 방화벽 룰 저장
sudo vi /etc/sysconfig/iptables (#은 주석을 의미하고 *는 테이블명을 의미하고 : 후에는 해당 테이블에 들어있는 체인명과 정책, [] 안에는 수신된 패킷수와 바이트수가 표기된다 COMMIT은 테이블의 끝을 의미한다) # Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024 *security :INPUT ACCEPT [123:8600] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [77:12952] COMMIT # Completed on Sat Aug 31 16:47:58 2024 # Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024 *raw :PREROUTING ACCEPT [123:8600] :OUTPUT ACCEPT [77:12952] COMMIT # Completed on Sat Aug 31 16:47:58 2024 # Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024 *mangle :PREROUTING ACCEPT [123:8600] :INPUT ACCEPT [123:8600] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [77:12952] :POSTROUTING ACCEPT [77:12952] COMMIT # Completed on Sat Aug 31 16:47:58 2024 # Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024 *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A PREROUTING -d 192.168.100.10/32 -i ens160 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.11.10:80 -A PREROUTING -d 192.168.100.10/32 -i ens160 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.10.11.10:443 -A PREROUTING -d 192.168.100.11/32 -i ens160 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.11.11:80 -A PREROUTING -d 192.168.100.11/32 -i ens160 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.10.11.11:443 -A POSTROUTING -s 10.10.11.10/32 -o ens160 -j SNAT --to-source 192.168.100.10 -A POSTROUTING -s 10.10.11.11/32 -o ens160 -j SNAT --to-source 192.168.100.11 COMMIT # Completed on Sat Aug 31 16:47:58 2024 # Generated by iptables-save v1.8.5 on Sat Aug 31 16:47:58 2024 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [77:12952] -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -s 192.168.100.1/32 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -s 168.126.63.1/32 -p udp -m udp --sport 53 -m comment --comment "KT DNS Response Traffic" -j ACCEPT -A INPUT -s 168.126.63.2/32 -p udp -m udp --sport 53 -m comment --comment "KT DNS Response Traffic" -j ACCEPT -A INPUT -p tcp -m tcp --sport 80 -m comment --comment "HTTP Traffic" -j ACCEPT -A INPUT -p tcp -m tcp --sport 443 -m comment --comment "HTTPS Traffic" -j ACCEPT -A INPUT -j DROP COMMIT # Completed on Sat Aug 31 16:47:58 2024 |
ping으로 자기자신에게 쳐보면 기본적으로 막혀있는데
/etc/sysconfig/iptables 파일을 수정해서 루프백을 허용한다
-A INPUT -i lo -j ACCEPT
# iptables-restore /etc/sysconfig/iptables
restore로 저장한 후
# ping 192.168.100.6
PING 192.168.100.6 (192.168.100.6) 56(84) bytes of data.
64 bytes from 192.168.100.6: icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from 192.168.100.6: icmp_seq=2 ttl=64 time=0.082 ms
ping을 자기자신에게 쳐보면 정상적으로 작동
# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
4 336 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
iptables의 상태 모듈
방화벽 규칙을 만들 때 패킷 연결 상태를 기반으로 트래픽을 필터링 할 수 있는 기능을 제공
/usr/lib64/xtables
$ sudo mv /usr/lib64/xtables/libxt_comment.so .
$ sudo iptables -A INPUT -p icmp -j ACCEPT -m comment --comment 'ICMP 룰'
iptables v1.8.5 (nf_tables): Couldn't load match `comment':No such file or directory
Try `iptables -h' or 'iptables --help' for more information.
=> 코멘트 모듈 파일을 옮겨버리자 코멘트가 들어간 룰이 등록되지 않는다
상태 추적 모듈
-m state --state NEW : 새로운 연결
-m state --state ESTABLISHED : 기존에 연결된 상태
-m state --state RELATED : FTP 연결할때
-m state --state INVALID : 깨진 패킷
$ sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 1004 packets, 79845 bytes)
pkts bytes target prot opt in out source destination
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state NEW
ssh로 접속을 시도하자 매칭됨
처음 접속시에만 매칭이 되고 그 이후 명령어를 사용하면 집계되지 않는다
( -m state --state NEW 가 없으면 명령어를 사용할때마다 집계된다 )
로그를 남기려면
-j LOG 로 쓰면 되는데
--log-prefix "접두사" : 접두사를 설정할 수 있다
--log-level 숫자 : 로그레벨을 남길 수 있다
--log-ip-options : ip 패킷 헤더의 옵션을 로그에 기록
--log-tcp-sequence : tcp 시퀀스 번호 기록
--log-tcp-options : tcp 패킷 헤더의 옵션을 로그에 기록
이러한 다양한 옵션이 있음
$ sudo iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID LOG flags 0 level 4 prefix "INVALID PACKET: "
36 2480 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 state NEW
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state NEW
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state NEW
=> ssh로 접속시도시 NEW 에 매칭됨
웹콘솔https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/8/html-single/managing_systems_using_the_rhel_8_web_console/index
https://docs.rockylinux.org/
$ sudo systemctl start cockpit.socket
$ sudo netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 810/sshd
tcp6 0 0 :::22 :::* LISTEN 810/sshd
tcp6 0 0 :::9090 :::* LISTEN 1/systemd
웹브라우저에 뜬 화면
보안상 문제가 있을 수 있으므로 반드시 iptables 등 방화벽 등록 필요
sudo iptables -A INPUT -m state --state NEW -p tcp --dport 22 -s 192.168.100.1 -j ACCEPT
=> 호스트 os에서만 접속가능하도록 설정
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -j DROP
호스트 OS가 아닌 다른 곳에서 접속 시도시 접속되지 않는다