본문 바로가기

해봐야 안다.OTL/Linux

[리눅스] iptables: NAT_2

<윈도우xp gateway>

[root@jo:~]#iptables -P INPUT ACCEPT

[root@jo:~]#iptables -P OUTPUT ACCEPT

[root@jo:~]#iptables -F

[root@jo:~]#iptables -t nat –F à nat 설정 제거

à sendmail서버가 끊겼다.

--

[root@jo:~]#service network restart

Shutting down interface eth0: [ OK ]

Shutting down interface eth1: [ OK ]

Shutting down loopback interface: [ OK ]

Disabling IPv4 packet forwarding: net.ipv4.ip_forward = 0

[ OK ]

Bringing up loopback interface: [ OK ]

Bringing up interface eth0: [ OK ]

Bringing up interface eth1: [ OK ]

전에 했던거 날리기 위해

--

<1 대 NAT >

[root@jo:~]#iptables -t nat -A POSTROUTING -o eth0 -s 192.168.100.0/24

100.대 네트워크가 전부 다 된다. 포트를 방화벽에서 하나씩 부여 받는다.

POSTROUTING à 무조건 SNAT

--

<1 대 1 NAT >

[root@jo:~]#iptables -t nat -A POSTROUTING -o eth0 -s 192.168.100.100 -j SNAT --to 192.168.10.188

 

[root@jo:~]#iptables -t nat -L POSTROUTING

Chain POSTROUTING (policy ACCEPT)

target prot opt source destination

SNAT all -- mail.cho.iss anywhere to:192.168.10.188

 

[root@jo:~]#iptables -t nat -L POSTROUTING -n

Chain POSTROUTING (policy ACCEPT)

target prot opt source destination

SNAT all -- 192.168.100.100 0.0.0.0/0 to:192.168.10.188

 

[root@jo:~]#iptables -t nat -A PREROUTING -i eth0 -d 192.168.10.188 -j DNAT --to-destination 192.168.100.100

-i à 들어오는 거

 

[root@jo:~]#iptables -t nat -L PREROUTING

Chain PREROUTING (policy ACCEPT)

target prot opt source destination

DNAT all -- anywhere 192.168.10.188 to:192.168.100.100

--

[root@jo:~]#cat /proc/sys/net/ipv4/ip_forward

1

à 항상 1인지 확인

--

[root@jo:~]#ip addr show eth0 à 아직 없다….188

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 00:0c:29:a9:92:8a brd ff:ff:ff:ff:ff:ff

inet 192.168.10.181/24 brd 192.168.10.255 scope global eth0

inet6 fe80::20c:29ff:fea9:928a/64 scope link

valid_lft forever preferred_lft forever service network restart 하면 사라진다

.--

[root@jo:~]#ip addr add 192.168.10.188/24 dev eth0

[root@jo:~]#ip addr show eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 00:0c:29:a9:92:8a brd ff:ff:ff:ff:ff:ff

inet 192.168.10.181/24 brd 192.168.10.255 scope global eth0

inet 192.168.10.188/24 scope global secondary eth0

inet6 fe80::20c:29ff:fea9:928a/64 scope link

valid_lft forever preferred_lft forever

--

만약에 추가한 ip를 지우려면

à #ip addr del 192.168.10.188/24 dev eth0

 

그럼 이제 외부에서 192.168.10.188로 접속하면 내부의 가상 사설 IP로 설정된 서버(메일서버192.168.100.100)으로 연결 된다.

--

<FORWARD 한번에 해주기>

[root@jo:~]#iptables -P FORWARD DROP

à 방화벽서버에서 내부 서버로 FORWARD하는 것을 전체 드랍한다.

à (메일서버192.168.100.100)가 팅겼다. FORWARD를 막았기 때문에

 

[root@jo:~]#iptables -A FORWARD -p tcp -s 192.168.10.26 -d 192.168.100.100 --sport 1024: --dport 22 -m state --state NEW -j ACCEPT

à 송신자 IP가 192.168.10.26(xp_IP)가 192.168.100.100을 목적지로 하는 것에 새로 연결시키는 것만 허용한다.

à FORWARD로 들어오는 거만 허용된 상태다 아직 연결 안될꺼다. 나가는 것도 해주면 되지만

좀 더 간단한 방법이 있다. 밑에…

[root@jo:~]#iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT

 

à FORWARD 체인은 이거 하나만 넣어주면 들어오는 거든 나가는 거든 다 허용한다.

"ESTABLISHED" 된 것을 허용하기 때문에

ssh로 접속하면

 

이제 (메일서버:192.168.10.188 à 192.168.100.100) 으로 연결될 것이다.

(메일서버:192.168.10.188 à 192.168.100.100)설정

 

#vi /etc/resolv.conf à namedserver=168.126.63.1로 바꿈.

#service network restart

#dig @ns.kornet.net www.daum.net

Dns test

--

방화벽서버(BIND서버)설정

#iptables –A FORWARD –p udp -s 192.168.100.0/24 --sport 1024: --dport 53 –m state --state NEW –j ACCEPT

--sport 2024: à 1024포트 이후로 , 클라이언트가 접속하는 거니깐

원래는

어딘지 모를 서버의 53번으로 나간다.

 

FORWARD체인의 INPUT, OUTPUT과는 틀리게 FORWARD는 두 개다 다 갖고 있다. 나한테 들어오는 것도 통로가 되는 거고 들어왔다 나가는 것도 통로가 되는 거다.

--

Xp>

telnet 192.168.10.181 25

--

(메일서버:192.168.10.188 à 192.168.100.100)설정

Dns 바꿈 à /etc/resolv.conf : nameserver=192.168.100.100

[root@jo:~]#iptables -A INPUT -p tcp -s 192.168.100.100 --sport 1024: -d 192.168.100.1 --dport 25 -m state --state NEW -j ACCEPT

 

[root@jo:~]#iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT

OUTPUT은 아까 ESTABLISHED해주어서 안 해줘도 된다.

 

메일은 보낼 수 있게 됐다.

[root@woo:~]#telnet mailx.cho.iss 25

Trying 192.168.100.1...

Connected to mailx.cho.iss (192.168.100.1).

Escape character is '^]'.

220 jo.cho.iss ESMTP Sendmail 8.13.8/8.13.8; Thu, 29 Oct 2009 03:42:27 +0900

quit

221 2.0.0 jo.cho.iss closing connection

Connection closed by foreign host.

--

[root@jo:~]#iptstate

TTL값이 떨어져서 사라진 상태에 세션이 들어오면 새로운 세션으로 믿는다.

새로운 세션을 물고 들어와도 기존의 연결된 세션에서 들어온 세션으로 믿고 "

#iptables –P INPUT –j DROP" 시키니깐 바로 끊어버리는 것이다.

 

[root@jo:~]#iptables -A FORWARD -p tcp -s 192.168.10.26 -d 192.168.100.100 --sport 1024: --dport 22 -m state --state NEW -j ACCEPT

앞에서 새로운 세션만 받아 들이도록 설정했기 때문에 하나의 세션이 살아있는 한

접속 시도는 불가 하다.

따라서 밑에서 처럼 RELATED도 추가해주면 "#iptables –P INPUT –j DROP"을 해도 안 끊길 것이다.

[root@jo:~]#iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

--

[root@jo:~]#iptables -A OUTPUT -p tcp --sport 1024: --dport 25 -m state --state NEW -j ACCEPT

[root@jo:~]#telnet mail.cho.iss 25

Trying 192.168.100.100...

Connected to mail.cho.iss (192.168.100.100).

Escape character is '^]'.

220 woo.cho.iss ESMTP Exchange; Thu, 29 Oct 2009 04:17:20 +0900

quit

221 2.0.0 woo.cho.iss closing connection

Connection closed by foreign host.

--

#cat /proc/net/ip_conntrack à 방화벽에서 들어오는 거 상태 보기

 

1 NAT >> SNAT, DNAT

2 DNS >> 자신이 서버인 경우 와 자신이 클라이언트인 경우

3 SMTP >> Viruswall 로서 자신이 받아주는 Queneing Mail 역할

4 SSH 에 대한 연결에 대해 >> Related를 통한 기존 연결정보에 이은 연결 허용

5 보내는 메일로서의 역할을 하기위한 룰

--

<방화벽 설정했던 거 날리자. 처음부터 다시>위치: 방화벽서버(BIND서버)

[root@jo:~]#iptables -P INPUT ACCEPT

[root@jo:~]#iptables -P FORWARD ACCEPT

[root@jo:~]#iptables -P OUTPUT ACCEPT

[root@jo:~]#iptables -F

[root@jo:~]#iptables -t nat –F

.

[root@jo:~]#service iptables save

Saving firewall rules to /etc/sysconfig/iptables: [ OK ]

.

방화벽을 설정할 때 기본적으로 loopback을 넣어야 한다.

[root@jo:~]#iptables -I INPUT -i lo -j ACCEPT

[root@jo:~]#iptables -I OUTPUT -o lo -j ACCEPT

.

[root@jo:~]#iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

[root@jo:~]#iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

[root@jo:~]#iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

.

ssh만 살리고 다 DROP 시킨다.

[root@jo:~]#iptables -A INPUT -p tcp -s 192.168.10.26 --sport 1024: --dport 22 -m state --state NEW -j ACCEPT

.

[root@jo:~]#iptables -P INPUT DROP

[root@jo:~]#iptables -P OUTPUT DROP

[root@jo:~]#iptables -P FORWARD DROP

--

[root@jo:~]#telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 jo.cho.iss ESMTP Sendmail 8.13.8/8.13.8; Thu, 29 Oct 2009 08:27:36 +0900

다 드랍 시켰는데 되는 이유는 loopback은 허용했기 때문에

[root@jo:~]#vi /etc/resolv.conf

search cho.iss

#nameserver 168.126.63.1

nameserver 192.168.100.100

 

#service network restart

--

[root@jo:~]#nslookup

> server

Default server: 192.168.100.100

Address: 192.168.100.100#53

방화벽에서 53번을 뚫어줘야 한다.

.

[root@jo:~]#nslookup

> server

Default server: 192.168.100.100

Address: 192.168.100.100#53

> mail.cho.iss

;; connection timed out; no servers could be reached

>

--

[root@jo:~]#iptables -A OUTPUT -p udp --sport 1024: -d 192.168.100.100 --dport 53 -m state --state NEW -j ACCEPT

à Dns인 192.168.100.100 에 질의할 수 있도록 나가는 것을 뚫어준다. "state"로 새 세션을 여는 것만 허용한다.

.

[root@jo:~]#nslookup

> mailx.cho.iss

Server:        192.168.100.100

Address:    192.168.100.100#53

.

Name:    mailx.cho.iss

Address: 192.168.10.181

--

[root@jo:~]#iptables -A INPUT -p tcp --sport 1024: --dport 25 -m state --state NEW -j ACCEPT

메일 들어오는 거 허용

--

xp에서 메일 되는 지 테스트

C:\>telnet 192.168.10.181 25

220 jo.cho.iss ESMTP Sendmail 8.13.8/8.13.8; Thu, 29 Oct 2009 09:05:05 +0900

quit

221 2.0.0 jo.cho.iss closing connection

.

[root@jo:~]#iptables -A OUTPUT -p tcp --sport 1024: --dport 25 -m state --state NEW -j ACCEPT

여러 메일서버에 보낼 수 있어야 하기 때문에 destination IP를 주지 않았다.

메일을 보낼 수도 있게 설정

.

[root@jo:~]#mail -v tack7001@nate.com

Subject: test mail iptables

test mail

..

Cc:

nate.com: Name server timeout

tack7001@nate.com... Transient parse error -- message queued for future delivery

tack7001@nate.com... Queued

안 된다.

.

메일서버 설정 바꿔야 한다.

#vi /etc/named.conf

acl "internal-zone" {192.168.100.0/24; 127.0.0.1;};

--

[root@jo:~]#ll /var/spool/clientmqueue/

total 16

-rw-rw---- 1 smmsp smmsp 10 Oct 29 09:10 dfn9T0A45e028173

-rw-rw---- 1 smmsp smmsp 557 Oct 29 09:10 qfn9T0A45e028173

--

[root@jo:~]#iptables -A FORWARD -p udp -s 192.168.100.100 --sport 1024: --dport 53 -m state --state NEW -j ACCEPT

방화벽 안에 있는 DNS(192.168.100.100) 에 질의 되기 위해 방화벽서버에서 FORWARD를 열어준다.

.

그리고 내부 DNS(192.168.100.100)에 질의 되기 위해 NAT를 해준다.

[root@jo:~]#iptables -A POSTROUTING -t nat -o eth0 -s 192.168.100.100 -j SNAT --to 192.168.10.179

--

[root@jo:~]#cat /proc/sys/net/ipv4/ip_forward

1

NAT 할 때는 항상 1인지 확인한다.

--

[root@jo:~]#nslookup

> www.daum.net

Server:        192.168.100.100

Address:    192.168.100.100#53

.

Non-authoritative answer:

www.daum.net    canonical name = top.g.daum.net.

Name:    top.g.daum.net

Address: 211.32.117.30

Name:    top.g.daum.net

Address: 211.115.77.211

Name:    top.g.daum.net

Address: 211.115.77.212

Name:    top.g.daum.net

Address: 211.115.77.213

Name:    top.g.daum.net

Address: 211.115.77.214

> [root@jo:~]#

[root@jo:~]#

[root@jo:~]#

[root@jo:~]#

[root@jo:~]#mail -v naruto@boanlab.com

Subject: hello

gggggggggg

ggggggggg

ggggggg

ggggg

ggg

Cc:

naruto@boanlab.com... Connecting to [127.0.0.1] via relay...

220 jo.cho.iss ESMTP Sendmail 8.13.8/8.13.8; Thu, 29 Oct 2009 09:28:17 +0900

>>> EHLO jo.cho.iss

--

 

250-jo.cho.iss Hello jo.cho.iss [127.0.0.1], pleased to meet you

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE

250-DSN

250-ETRN

250-AUTH LOGIN PLAIN

250-DELIVERBY

250 HELP

>>> MAIL From:<root@jo.cho.iss> SIZE=107 AUTH=root@jo.cho.iss

250 2.1.0 <root@jo.cho.iss>... Sender ok

>>> RCPT To:<naruto@boanlab.com>

>>> DATA

.

250 2.1.5 <naruto@boanlab.com>... Recipient ok (will queue)

354 Enter mail, end with "." on a line by itself

>>> .

250 2.0.0 n9T0SH2r028235 Message accepted for delivery

naruto@boanlab.com... Sent (n9T0SH2r028235 Message accepted for delivery)

Closing connection to [127.0.0.1]

>>> QUIT

221 2.0.0 jo.cho.iss closing connection

--

[root@jo:~]#tail -f /var/log/maillog

.

.

Oct 29 09:28:19 jo sendmail[28235]: n9T0SH2r028235: to=<naruto@boanlab.com>, delay=00:00:00, mailer=esmtp, pri=30372, dsn=4.4.3, stat=queued

Oct 29 09:28:19 jo sendmail[28234]: n9T0SHsB028234: to=naruto@boanlab.com, ctladdr=root (0/0), delay=00:00:02, xdelay=00:00:02, mailer=relay, pri=30107, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (n9T0SH2r028235 Message accepted for delivery)

.

메일 간다.

--

[root@jo:~]#iptables -t nat -A PREROUTING -i eth0 -d 192.168.10.179 -j DNAT --to 192.168.100.100

--

ssh(메일서버_192.168.100.100) 열어준다.

#iptables –A FORWARD –p tcp –s 192.168.10.26 --sport 1024: -d 192.168.100.100 --dport 53 –m state --state NEW –j ACCEPT

--

기존에 설정되어 있던 존파일을 바꿔준다.

 

(메일서버_192.168.100.100)에 있는 웹서버에 접속해보기

[root@woo:/var/named]#cat /var/named/ext.zone

$TTL 1D

@ IN SOA ns.cho.iss. woo.cho.iss. (

1

6H

30M

14D

1D )

IN NS ns.cho.iss.

IN MX 10 mailx

ns IN A 192.168.10.179

mailx IN A 192.168.10.181

www IN A 192.168.10.179

ftp IN A 192.168.10.179

.

[root@woo:/var/named]#cat /var/named/ext.rev

$TTL 1D

@ IN SOA ns.cho.iss. woo.cho.iss. (

1

6H

30M

14D

1D )

IN NS ns.cho.iss.

179 IN PTR www.cho.iss.

179 IN PTR ns.cho.iss.

181 IN PTR mailx.cho.iss.

#iptables -A FORWARD -p tcp -s 192.168.10.26 --sport 1024: -d 192.168.100.100 -m multiport --dports 80,443,110 -m state --state NEW -j ACCEPT

http(80), https(443), dovecot(110)를 방화벽서버에서 "포워드" 해주게 세팅

--