[질문] iptables 를 사용한 포트포워딩 설정에서 내부 클라이언트 접근 문제

hjkim14의 이미지

안녕하십니까? 질문을 좀 드리겠습니다.

공이아이피 : 100.100.100.100
사설아이피 : 10.2.7.1 - 254

100.100.100.100 으로 들어오는 웹(80) 포트에 대해 10.2.7.10 으로 포트포워딩을 설정했습니다.
외부에서 http://100.100.100.100 으로 접속하면 10.2.7.10으로 잘 붙습니다.

그런데, 내부 10.2.7.xxx 에서 http://100.100.100.100 으로 접속을 하면 접속이 되지 않습니다.
물론 http://10.2.7.10 으로 접속을 하면 접속이 되는데, 공인아이피로 접속을 하려면 접속이 되질 않습니다.

현재 100.100.100.100에 리눅스를 설치하고 iptables를 이용하여 마스커레이딩을 이용 내부 인터넷을
사용하고 있구요, 동시에 iptables를 사용하여 포트포워딩을 이용하여 내부 서버에 접속하도록 하려고 합니다.

iptables에서 추가적으로 설정해줘야 되는 것이 있는지 고수님들의 답변을 부탁드립니다.
원리 설명도 해주시면 정말 감사하겠습니다.

그럼 이만...

익명사용자의 이미지

걍 호스트파일에서 매핑해버리세요

woonuk의 이미지

iptables -t nat -A PREROUTING -p tcp -m tcp -d 100.100.100.100 --dport 80 -j DNAT --to-destination 10.2.7.10:80

사무실 내부에서 이런식으로 사용하고 있습니다.

송효진의 이미지

hjkim14 님은 아마 woonuk 님의 설정과 거의 비슷한데, -i eth0 같은것이 더 들어있는건지도 모르겠네요.

emerge money

hjkim14의 이미지

지금 제가 설정해 놓은 값들입니다.

######## IP MASQUERADE #########
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -s 10.2.7.0/24 -j SNAT --to 100.100.100.100

######## PORT FORWARDING #########
iptables -t nat -A PREROUTING -p tcp -d 100.100.100.100 --dport 443 -j DNAT --to 10.2.7.110:443
iptables -t nat -A PREROUTING -p tcp -d 100.100.100.100 --dport 80 -j DNAT --to 10.2.7.110:80

woonuk님과 설정은 비슷한 것 같은데요...
문제는 외부에서는 잘 접속이 됩니다. 그런데, 내부에서 예를 들면 10.2.7.84 컴퓨터에서는 http://100.100.100.100 으로 접속이 되지 않습니다.

마스커레이딩 설정 때문일까요? 참고로 위의 설정 서버의 아이피는 100.100.100.100 과 10.2.7.95입니다.
내부에서는 10.2.7.95을 게이트웨이로 사용합니다.

조언 좀 부탁드릴께요...

윤봉환의 이미지

패킷의 여행을 살펴 보면:

1. 호스트10.2.7.84 에서 출발 할 때 - 목적지:100.100.100.100 출발지:10.2.7.84
2. 게이트웨이 10.2.7.95 에 들어갔다가 나올 때 - 목적지:10.2.7.110 출발지:10.2.7.84
3. 웹서버 10.2.7.110의 응답패킷 - 목적지:10.2.7.84 출발지:10.2.7.110

문제는 3번입니다. 호스트 10.2.7.84는 웹서버 100.100.100.100에 패킷을 보냈지만 응답 패킷은 10.2.7.110에서 돌아오니 드랍되는 것입니다. tcpdump를 돌려 보시면 알게 될겁니다.

갈 때는 로컬 넷이 아니기 때문에 게이트웨이를 거치지만, 돌아올 때에는 같은 로컬 넷(10.0.0.0/8)이므로 ARP로 이더넷 주소만 알아낸 다음 허브를 통해 바로 보내게 되겠지요. 따라서 게이트웨이에서 주소가 변환될 틈이 없는 것입니다. 이해되시지요?

해결 방법은? 다음 가운데 하나를 선택하세요:
_1) 로컬넷에 서비스하는 DNS 서버를 따로 구성,
_2) 주소창에 10.2.7.110을 입력 (혹은 /etc/hosts 따위에 등록),
_3) 게이트웨이에서 로컬 쪽으로도 SNAT (그럼 돌아올 때에도 게이트웨이를 거치겠지요?),
_4) DNAT대신 브리지나 Proxy ARP 를 사용..

회사라면 1)을 권장합니다. 방화벽과 네트워크 장비를 손대지 않는 유일한 방법이지요. 3)은 언 발에 오줌누기 같지만 그렇다고 크게 나쁜 방법은 아니고, 4)는 전문적인 시스템 엔지니어가 없다면 추천하지 않습니다. 그러나 활용도는 가장 높은 방법입니다. 2)는 뭐 해결 방법이라 말하기도 우습네요.

放下着-----
내려놓으려는 마음도 내려놓기

放下着-----
내려놓으려는 마음도 내려놓기

woonuk의 이미지

######## IP MASQUERADE #########
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -s 10.2.7.0/24 -j SNAT --to 100.100.100.100
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.2.7.95
 
######## PORT FORWARDING #########
iptables -t nat -A PREROUTING -p tcp -d 100.100.100.100 --dport 443 -j DNAT --to 10.2.7.110:443
iptables -t nat -A PREROUTING -p tcp -d 100.100.100.100 --dport 80 -j DNAT --to 10.2.7.110:80

위에 윤봉환님 글에서 해결책 3번에 해당하겠네요.

윤봉환의 이미지

제 글과 woonuk 님 글을 비교해 보니,
woonuk 님은 동료나 선배처럼 안내해 주시는데,
저는 마치 선생처럼 말하는군요..
흠, KLDP 에서는 woonuk 님처럼 상세한 규칙을 말해주는 게 옳을 것 같습니다.

放下着-----
내려놓으려는 마음도 내려놓기

放下着-----
내려놓으려는 마음도 내려놓기

송효진의 이미지

매스커레이드 설정을
iptables -A POSTROUTING -o eth0 -j MASQUERADE
요렇게 한번 해 보세요.

아니면 아파치 httpd.conf 의 ip 를 *:80 으로 고쳐보세요.

emerge money

사랑천사의 이미지

시작점을 다시 100.100.100.100:80에서 나온 걸로... 처리 하도록 소기기를 하면. 될 것 같은데요.. 소기기 규칙을 어떻게 만들어야 할 지 전 모르겠군요.(패킷 움직이는거 보면.. 머리 아픕니다.)

제가 생각 하던 문제는 (제가 올린 글도 있었쬬 아마...) 장비 자체적인 문제로 손을 댈 수가 없게 되엇지만, 이건 어떻게 하면 될 거 같은데요.. 어디 보니까 NAT에 OUTPUT 체인에다가 뭘 넣던데 그건 어떻게 한 건지 모르겠군요. 그 문서가 어디 있나 모르겠네요.
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!

사람천사

윤봉환의 이미지

"소기기"란 아마 "속이기"의 중-고생 은어인가봐요^^ 가끔 세대공감을 떠올립니다.

그런데 문제는 웹서버에서 패킷이 출발할 때 목적지 주소가 로컬 넷이므로 이더넷에 프레임을 직접 뿌린다는 것입니다. 게이트웨이에 들어가서 출발지 주소에 손 댈 틈이 없지요. 사랑천사님 말씀대로 하려면 웹서버에 SNAT 규칙을 만들어야 하는데, 서버와 네트워크 장비 경계가 무너지고, 네트워크 규칙들이 무질서하게 흩어지므로 관리가 어려운 방법인 것 같습니다.

다시 정리하면, '사용자 -> 게이트웨이 -> 웹서버' 경로로 웹 페이지를 요청하는 패킷이 도착하면 정상적인 경우 '웹서버 -> 게이트웨이 -> 사용자' 순서로 돌아와야 하는데 이 경우 '웹서버 -> 사용자'로 게이트웨이를 거치지 않는 게 문제입니다. 게이트웨이에 돌아오지 않으므로 NAT 테이블을 검색하여 주소를 복원할 수도 없게 되는 것입니다. 원래는 속이고 어쩌구 할 필요도 없이 DNAT 룰 하나로 충분한 일이거든요.

放下着-----
내려놓으려는 마음도 내려놓기

放下着-----
내려놓으려는 마음도 내려놓기

1day1의 이미지

이번 10주년 컨퍼런스에 이런쪽 강의를 한다면 좋겠는데, 해주실 분 안계신가요?(추가로 세션이 가능한가?)
알듯 말듯. ^^ 역시 더 공부해야 겠습니다. ㅜㅜ

F/OSS 가 함께하길.. (F/OSS서포터즈 : [[FOSS/Supporters]], [[FOSS/Supporters/Group]]) - 블로그 활성화 프로젝트 : 하루에 하나씩 블로그 글 남기기 -

F/OSS 가 함께하길..

사랑천사의 이미지

'속이기'라는건 알고 있습니다. 그리고 제가 중~고등학생일지라도 제가 잘못 알고 있거나 그렇지 않은 이상 쉽게 은어를 쓰진 않습니다.(1997년 초 부터 저 스스로 만들고 지키고 있는 원칙입니다.) 다만, 얼마 전에 큰 충격을 한번 받은 이후로 그 규칙에 어느정도 완화가 이루어 졌습니다. 물론 '소기기'는 제 실수입니다. 죄송합니다.

그리고 제 표현력이 부족한 것인가는 모르겠으나, 제 말의 뜻을 잘못 이해 하고 계신거 같습니다. 그리고 돌아오는 패킷이 게이트웨이를 거치지 않기 때문에 일어나는 문제라는 것 역시 충분히 이해 합니다.

하지만, 가능하다면 서버를 격리 시킬 경우 (어떻게 하는가는 저도 잘 모르겠습니다... 어떤 식으로 특정 네트워크에 격리 키실 수 있다면...) 질문하신 분이 원하시는 결과를 얻을 수 있을 것도 같다는 겁니다. 서버가 이미 특정한 네트워크 대역에 있지만, 기존 장비들과 다른 네트워크에 혼자 격리 시키고... 그 쪽으로 오고가는 패킷을 어떻게 잘 조정하면 될 거 같다는 이야기랄까요... 정확히는 모르겠습니다. 어떤 방법이 좋을지. 저도 이전에 저런 문제가 있었습니다. 그래서 상당히 곤욕을 당했고요.

근대... 가능하면 말이죠... 커널에 보면.. VS에 대한것이 잇떤데요... Virtual Server에 대한 지원 기능... 이게 실용성이 있는 기능이라면 설정을 해서 충분히 사용 가능할 것 같은데요... iptables로 힘들게 할 필요 없이 말이죠.

솔직히 요즘 공유기들 보면 VS기능이 있는 것들이 많은 것 같습니다. 이것도 일종의 NAT인데, 이것이 동작하는 방식.. 즉 공유기등을 패킷이 어떻게 지나가고 출발점 도착점등은 어디인지등을 감지할 수 있다면 뭔가 방법이 있을 거 같네요. 분명히 뭔가 비밀이 있겠죠. 솔직히 제가 전문 네트워크 관리자이거나 그렇지 않기 때문에 여기 까지만 생각 할 수 있는 거 같군요.
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!

사람천사

윤봉환의 이미지

DMZ(혹은 서버팜)가 있다면 논의 자체가 의미 없는 일이 되겠네요. 그리고 IPVS 는 high-performance 가 목적인 기능인데 이런 일에 쓰기에는 좀.. 소잡는 칼을 쓰는 격이랄까

이미 다양한 해결 방법이 제시되었지만 만족하지 않고 창의적인 해법을 모색하는 사랑천사님의 모습이 보기 좋습니다. 계속 노력하시면 훌륭한 리눅서가 되시겠어요. 요즘은 고등학교 수업에서 리눅스 다루는 곳도 있던데 이런 열의가 바탕이 되었으리라 짐작합니다.

사랑천사님의 진지한 활약을 기대하며, Go ahead!

放下着-----
내려놓으려는 마음도 내려놓기

放下着-----
내려놓으려는 마음도 내려놓기

사랑천사의 이미지

윤봉환님 제 정체를 거의 아시는 모양이시네요. 혹시 pf.php를 읽으신건지.. 하하핫! 하지만 리눅서가 되고 싶다는 생각 보다는.. 엔지니어쪽을 꿈꾸는 사람입니다. System Engineer... 그리고 창의적인 방법을 생각한다라.. 글쎄, 그건 제가 수준이 낮기 때문이 아닐까요... 이미 어느정도의 기술로 어느정도의 일을 하고 있는 전문 기술직에 종사하고 있다면, 창의적인 방법을 찾았을 까요. 물론 그런 분들도 계신건 알고 있습니다. 제가 학생이기에 그런 의견들을 내 놓은 것이 아닐까 싶은데요. 그리고 DMZ(비무장지대!!!)라... 하지만 DMZ방식을 사용한다 해도 그런 문제는 분명히 생길 거라고 봅니다.

그리고 언제 한번 프로필 올려야 겠네요... (여담입니다만.) 지금 소개서를 여러 통 쓰고 있는데 KLDP Version으로 만들어서 하나 올리겠습니다 하하하. 정체를 숨기고 어둠속에서 살려고 했는데 KLDP에선...(사실 제가 주눅이 들어서요... 제 나이, 저 스스로에 대한 부분들이... 하하하!)

그리고... 소칼로 닭칼 역활을 시키는게 아까운 거 같다는 말씀이신거 같네요... 하기야... 제가 쓴 시에도... 소칼로 닭 잡지 말라는 시가 있습니다. (하지만, IPVS와 같은 경우하곤.. 상관이... 별로 없습니다. 물론 욱이면 끼워 마출 수도 있겠지만... 뭔가에 충격을 받아서 쓴 시였습니다.)

뭐, 하지만 확실한 처리를 하기 위해서는 커널의 VS기능을 쓰는 것이 현실적으로 좋지 않을까 싶습니다. 물론 단지 질문 하신 분의 경우와 같은 문제를 해결 하기 위해선 닭 잡는 소칼이 될 지는 모르겠습니다만...

그리고 정말 윤봉환님께서는 선생님 같으시군요.. 혹시 어디 교수신지...

전 그럼 이만... 확실한 처리를 원하신다면 저는 VS기능(IPVS 라고 하는... IP: Virtual Server 라고 나와 잇더군요.-알아보니-)을 사용 하시라고 주장 하고 싶습니다.(사실 그게 High-Level용인지는 몰랐습니다.)

추가.
오타가 많이 났군요. 수정 했습니다.
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!

사람천사

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.