2016. 10. 21. 21:37
리눅스 iptables 방화벽 구성 스크립트 공유 합니다.

여기 스크립트 보고 신선한(?) 충격에 기존 방화벽 소스 대거 고치게 되었습니다.

베이스만 가져와서 대폭 수정하였습니다.


크게 아래 5가지 항목으로 잡았습니다.

1. INPUT PORT TCP
들어오는 TCP 포트 연결

2. INPUT PORT UDP
들어오는 UDP 포트 연결

3. OUTPUT ADDR
나가는 주소

4. OUTPUT PORT TCP
나가는 TCP 연결

5. OUTPUT PORT UDP
나가는 UDP 연결


OUTPUT 기본정책을 DROP 로 만들면 예기치 못한 상황을 겪을 수 있습니다. 처음에 ALLOW 로 설정하고 LOG 로 빠지는 놈이 있나 없나 체크 한 후에 마지막에 DROP 로 설정 합시다.

sudo iptables -L -n -v --line-numbers

이 명령어 한줄이면 아래 처럼 테이블이 나타납니다

빨간 네모 부분 LOG에 패킷, 바이트가 0 이 아니면 이쪽으로 향하는 길 잃은 영혼(패킷-_-)이 존재 한다는 겁니다.


dmesg 명령어로 LOG를 확인하고 출발지, 목적이 IP, PORT, prot 등을 확인하여 규칙을 추가하여 줍시다.


위 내역에서 숫자가 발생한 부분은 각각 패킷, 데이터가 얼마나 흘렀는지를 알 수 있는 부분이며, 0 은 아직 한번도 이 쪽 규칙을 타지 않았음을 나타냅니다. (한참 지켜보고 필요없다 싶으면 제거할 수도 있겠죠? ㅎㅎ)




현재 설정에 apt 패키지 업데이트 호스트도 추가해야 되는데 빠졌네요.
apt-get 하면 업데이트 서버에 접근 못합니다. OUTPUT도 막았으니까요.
이 부분은 OUTPUT ADDR에 업데이트 서버의 주소나 IP 추가해 주면 됩니다.

나가는 주소에 허용된 유일한 내역은 현재 서브넷 대역 (제 경우 172.17.10.0/24)을 설정하였는데 이 부분은 내부 네트워크의 주소에는 접근이 가능하게 하고자 함입니다.

그리고... NAT 부분은 VPN 때문에 설정하였습니다.
FORWARD 를 DROP 하면 NAT의 MASQUERADE 가 동작하지 않습니다. (패킷 전달을 막으면 안되는게 당연하겠죠?)
고로 여기서는 NAT 때문에 FORWARD를 막지 않습니다만, 필요없으면 DROP 이 보안상 좋겠네요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/bin/bash
 
# Haebi's iptables script
 
# based on
 
# Check iptables status
# sudo iptables -L -n -v --line-numbers
 
IPT="/sbin/iptables"
 
# Your DNS servers you use: cat /etc/resolv.conf
DNS_SERVER="
    8.8.4.4
    8.8.8.8
"
 
# Service List (TCP)
# -----------------------
# 22        SSH
# 80        Web
# 443       Web (HTTPS)
# 1194      OpenVPN #1
# 1196      OpenVPN #2
# 3306      MySQL
# 21        FTP (Command)
# 50000:51000   FTP (Data)
# 137:139   SAMBA
# 445       SAMBA
 
ALLOW_INPUT_PORT_TCP="
    22
    80
    443
    1194
    1196
    3306
    21
    50000:51000
    137:139
    445
"
 
# Service List (UDP)
# -----------------------
# 53        DNS
# 137:139   SAMBA
# 8649      ganglia
 
ALLOW_INPUT_PORT_UDP="
    53
    137:139
    8649
"
 
# Allow outgoing access
ALLOW_OUTPUT_ADDR="
    172.17.10.0/24
"
 
# Allow outgoing TCP
# 22        ssh connect other server
 
ALLOW_OUTPUT_PORT_TCP="
    22
"
 
# Allow outgoing UDP
# 123       ntp syncs
 
ALLOW_OUTPUT_PORT_UDP="
    123
"
 
$IPT -P INPUT ACCEPT
$IPT -F
 
# Allowing DNS lookups (tcp, udp port 53) to server
for ip in $DNS_SERVER
do
    $IPT -A OUTPUT -p udp -d $ip --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
    $IPT -A INPUT  -p udp -s $ip --sport 53 -m state --state ESTABLISHED     -j ACCEPT
    $IPT -A OUTPUT -p tcp -d $ip --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
    $IPT -A INPUT  -p tcp -s $ip --sport 53 -m state --state ESTABLISHED     -j ACCEPT
done
 
# Allow any connection from this host.
$IPT -A INPUT  -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
 
# Allow all broadcast traffic.
iptables -A INPUT -m pkttype --pkt-type broadcast -j ACCEPT
 
# Open Incoming TCP Ports
for PORT in $ALLOW_INPUT_PORT_TCP
do
    $IPT -A INPUT  -p tcp --dport $PORT -m state --state NEW,ESTABLISHED -j ACCEPT
    $IPT -A OUTPUT -p tcp --sport $PORT -m state --state ESTABLISHED     -j ACCEPT
done
 
# Open Incoming UDP Ports
for PORT in $ALLOW_INPUT_PORT_UDP
do
    $IPT -A INPUT  -p udp --dport $PORT -m state --state NEW,ESTABLISHED -j ACCEPT
    $IPT -A OUTPUT -p udp --sport $PORT -m state --state ESTABLISHED     -j ACCEPT
done
 
# Allow out going access
for ip in $ALLOW_OUTPUT_ADDR
do
    $IPT -A OUTPUT -d $ip -m state --state NEW,ESTABLISHED -j ACCEPT
    $IPT -A INPUT  -s $ip -m state --state ESTABLISHED     -j ACCEPT
done
 
# Allow out going TCP access
for port in $ALLOW_OUTPUT_PORT_TCP
do
    $IPT -A OUTPUT -p tcp --dport $port -m state --state NEW,ESTABLISHED -j ACCEPT
    $IPT -A INPUT  -p tcp --sport $port -m state --state ESTABLISHED     -j ACCEPT
done
 
# Allow out going UDP access
for port in $ALLOW_OUTPUT_PORT_UDP
do
    $IPT -A OUTPUT -p udp --dport $port -m state --state NEW,ESTABLISHED -j ACCEPT
    $IPT -A INPUT  -p udp --sport $port -m state --state ESTABLISHED     -j ACCEPT
done
 
#######################################################################################################
## Global iptable rules. Not IP specific
 
# Allow outgoing icmp connections (pings,...)"
$IPT -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT  -p icmp -m state --state ESTABLISHED,RELATED     -j ACCEPT
 
# Simple Service Discovery Protocol
$IPT -A INPUT -p udp --dport 1900 -d 239.255.255.250 --state NEW -j ACCEPT
 
# Multicast address
# 224.0.0.1 The All Hosts multicast group addresses all hosts on the same network segment.
$IPT -A INPUT -d 224.0.0.1 -j ACCEPT
 
# 224.0.0.22 Internet Group Management Protocol
$IPT -A OUTPUT -d 224.0.0.22 -j ACCEPT
 
# Device discovery
$IPT -A INPUT  -d 239.255.255.250 -j ACCEPT
$IPT -A OUTPUT -d 239.255.255.250 -j ACCEPT
 
# Default -----------------------------------------------------------------
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 
# Log before dropping
$IPT -A INPUT  -j LOG  -m limit --limit 5/min --log-level 7 --log-prefix 'IP INPUT drop: '
$IPT -A OUTPUT -j LOG  -m limit --limit 5/min --log-level 7 --log-prefix 'IP OUTPUT drop: '
 
# If forward drop then NAT Masquerade will not work.
$IPT -P INPUT DROP
#$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
$IPT -nL
 
# NAT ---------------------------------------------------------------------
$IPT -t nat -F
$IPT -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
$IPT -t nat -A POSTROUTING -s 10.8.2.0/24 -d 172.17.10.0/24 -o eth0 -j MASQUERADE
$IPT -t nat -nL






Posted by 해비