iptables 을 이용한 포트포워딩 문제

ikpil의 이미지

iptables-script.sh

#!/bin/bash
 
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 220.137.77.121
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
 
 
# port forward
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.3:80
 
 
# firewall
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i eth1 -j ACCEPT
 
 
iptables -P INPUT DROP
 
# save
service iptables save
service iptables restart

문제점은 외부에서 http://web.qqq.com 으로 접속하면, 192.168.0.3:80 의 웹서버에 접속 되어 잘 됩니다.
그런데 내부(192.168.0.24)에서 http://web.qqq.com 으로 하면, 192.168.0.3:80 에 접속을 못하고, 계속 없는 페이지라고 나옵니다.

환경
1. CentOS 6.5
2. eth0 - 공인 아이피(220.137.77.121)
3. eth1 - 사설 아이피(192.168.0.1),
4. iptables-script.sh 를 실행하여, 룰을 적용하고 저장하고 있습니다.
5. 이 머신으로 인터넷 공유를 하고 있으며, eth1 으로 DHCPD 데몬을 구동하고 있습니다.

chanik의 이미지

우선 6번째 줄의 규칙은 주석처리해도 되는 것 같습니다. 그 아랫줄의 MASQUERADE 규칙에서 저절로 처리될 겁니다

#iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 220.137.77.121

그리고, 원하시는 바가 이뤄지려면 port forward 규칙이 아래와 같이 바뀌면 될 것 같습니다.

# port forward
#iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.3:80
iptables -t nat -A PREROUTING -d 220.137.77.121 -p tcp --dport 80 -j DNAT --to 192.168.0.3:80

이 경우 내부PC로부터 웹서버로 가는 패킷은 CentOS 서버의 iptables를 거쳐갈 수밖에 없지만, 웹서버로부터의 응답은 아마도 CentOS 서버 거치지 않고 내부PC로 바로 가게 될 것 같네요. 모로 가도 서울만 가면 되니 별 상관 없겠죠.. 궁금하시면 패킷캡처로 확인해보시면 될 것입니다.

ikpil의 이미지

먼저 답변 주셔서 무척 감사합니다.

말씀하신데로, 6번째 줄은 주석처리해도 인터넷 공유가 정상 처리되었습니다. 감사합니다.

그리고 다음처럼 처리 했을 때, 한발 더 진전 되었으나, 원하는 바를 얻지는 못했습니다.

# port forward
#iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.3:80
iptables -t nat -A PREROUTING -d 220.137.77.121 -p tcp --dport 80 -j DNAT --to 192.168.0.3:80

이전 룰에서는 192.168.0.3:80 에 접근도 못했으나, 바꾼 후 접근은 하나 192.168.0.3 서버에서SYN_RECV 대기 합니다.
netstat -anput 하면 다음처럼 나옵니다. 192.168.0.24 유저가 192.168.0.3 서버에 접속할 때, 다음처럼 나오고 대기합니다.

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 192.168.0.3:80              192.168.0.24:26978          SYN_RECV    -

대안으로 내부 네임서버를 두어서 접속하게 하는 방법이 떠오르는데, 이렇게 하면 문제를 풀기 보다는
우회한다는 생각이 들어, 방법을 더 찾고 싶습니다.

chanik의 이미지

아마 웹서버의 응답패킷이 로컬PC로 도달했겠지만
로컬PC에서 그 응답패킷을 해당 소켓에 대응시켜주지 않는 문제인 것 같습니다.

보내는 패킷은 192.168.0.24:26978 -> 220.137.77.121:80 주소를 달고 갔는데
응답패킷은 192.168.0.3:80 -> 192.168.0.24:26978 식의 주소를 달고 오기 때문이겠고요.
거기까지는 생각을 못했네요..

아래의 SNAT 규칙을 DNAT 아래쪽에 넣으면 응답패킷도 CentOS의 iptables를 거쳐 오지 않을까 싶은데요.
제가 유사한 규칙을 쓰고 있기는 한데, 이렇게 같은 서브넷을 대상으로 SNAT를 써보지는 않아서 자신은 없네요.

iptables -t nat -A POSTROUTING -p tcp -o eth1 -d 192.168.0.3/32 -s 192.168.0.0/24 --dport 80  -j SNAT --to 192.168.0.1

ikpil의 이미지

정말 감사합니다. 테스트 완료 했습니다.

chanik의 이미지

잘 된다니 다행이네요.

그리고, 이전 답변에서 아래의 두 규칙중 첫번째 것을 제거하고 두 번째 것을 쓰시라 권했습니다만,
사실 둘 중 어떤 것을 쓰셔도 됩니다.

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 220.137.77.121
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

공인IP를 동적으로 받아 쓰신다면 MASQUERADE 말고는 선택지가 없겠지만
고정IP로 쓰시는 중이니 둘 다 무방하고, 오히려 첫 번째 것이 더 적절하겠습니다.

ikpil의 이미지

네. 현재 아무런 문제가 발견되지 않아 두번째 룰로 유지하고 있습니다.

회사에서 인터넷이 자꾸 끊어져서 매우 불편했는데, 더이상 끊어지지 않아
매우 편하게 이용하고 있습니다.

다시 한번 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.