다음 이전 차례

6. 패킷을 어떻게 조작할지를 알려주기

이제 조작할려는 패킷을 어떻게 선택하는지를 알아보았습니다. 규칙을 완성할려면 패킷을 어떻게 할 것인지를 커널에게 알려주어야 합니다.

6.1 시작점 NAT

시작점 NAT를 사고싶다면 ; 접속의 시작점 주소를 다른 것으로 바꿉니다. 이것은 POSTROUTING 체인에서 바깥으로 내보내 지기 바로 직전에 이루어 집니다. 이것은 아주 중요한 세부사항으로 이것은 리눅스 박스 자체에서는 바뀌기 전의 패킷을 인식한다는 것을 의미합니다. 이것은 또한 '-o' (밖으로 나가는 인터페이서) 옵션을 사용할 수 있다는 것을 의미합니다.

시작점 NAT 는 '-j SNAT'를 사용함으로 지정되고 '--to-source' 옵션으로 IP 주소, IP 주소의 범위, 포트, 포트의 범위 (UDP 와 TCP 프로토콜에서만) 를 지정할 수 있습니다.

## 시작점 주소를 1.2.3.4로 바꾸기
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

## 시작점 주소를 1.2.3.4 나 1.2.3.5 또는 1.2.3.6으로 바꾸기
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6

## 시작점 주소를 1.2.3.4 포트 1-1023 으로 바꾸기
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023

마스쿼레이딩

시작점 NAT의 특별한 경우로 마스쿼레이딩이라는게 있습니다. 이것은 표준 전화접속처럼 동적으로 할당되는 IP 주로를 사용할때만 사용해야 합니다. ( 정적인 IP 주소를 사용할때에는 위의 SNAT를 사용하세요.)

마스쿼레이딩할때 시작점 주소를 정확히 적어줄 필요는 없습니다. 이것은 밖으로 나가는 패킷이 이용하는 인터페이서를 이용할 것입니다. 그러나 더욱 중요한 것은, 그 연결이 끊어지면 그 접속은 잃어버리게 됩니다. 즉, 새로운 IP 주소를 받게되면 드문 돌연한 이상이 생길 수 있음을 의미합니다.

## ppp0 로 나가는 모든 패킷을 마스쿼래이드 하기
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

6.2 목적지 NAT

이것은 PREROUTING 체인에서 패킷이 들어오기 바로 직전에 이루어 집니다. 이것은 리눅스 박스 자체에서는 들어오는 패킷의 '실제' 목적지를 알게 된다는 것을 의미합니다. 이것은 또한 '-I' (들어오는 인터페이서) 옵션을 사용할 수 있음을 의미합니다.

지역 네트워크에서 생성된 패킷의 목적지를 조작할려면 출력 체인을 이용하면 가능한데, 이것은 거의 사용되지 않습니다.

목적지 NAT 는 '-j DNAT' 를 사용함으로 지정할 수 있고 '--to-destination' 옵션으로 IP 주소, IP 주소의 범위, 포트나 포트의 범위(UDP 와 TCP 프로토콜에서만)를 지정할수 있습니다.

## 목적지 주소를 5.6.7.8로 바꾸기
# iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8

## 목적지 주소를 5.6.7.8 이나 5.6.7.9 또는 5.6.7.10으로 바꾸기
# iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8-5.6.7.10

## 웹 트래픽의 목적지 주소를 5.6.7.8의 8080 포트로 바꾸기
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 \
        -j DNAT --to 5.6.7.8:8080

## 1.2.3.4로 가는 지역 패킷을 loopback으로 재설정 하기
# iptables -t nat -A OUTPUT -d 1.2.3.4 -j DNAT --to 127.0.0.1

방향 재설정

목적지 NAT 중의 특수한 경우로 마스쿼레이딩이 있습니다. 이것은 들어오는 인터페이스의 주소로 DNAT를 이용하는 것과 정확히 일치하는 것으로 단순한 편의성을 위한 것입니다.

## 들어오는 80 포트의 웹 정보를 squid (투명한) 프록시로 보내기
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
        -j REDIRECT --to-port 3128

6.3 Mappings In Depth

대부분의 사람이 다루지 않을 내용주 NAT를 사용하는데 미묘한 내용이 좀 있습니다. 이상하게 여기는 사람을 위하여 이곳에 그것들에 대한 내용을 씁니다.

범위로 다수의 주소를 선택하기

IP 주소의 범위가 주어지면 최근에 가장 사용되지 않았던 IP 로 접속을 하도록 합니다. 이렇게 함으로 기본적인 부하균형을 이룹니다.

Creating Null NAT Mappings

'-j ACCEPT' 를 타겟으로 사용함으로 접속이 어떠한 NAT도 커치지 않고 되도록 할 수 있습니다.

기본적인 NAT 행동양식

기본적인 행동양식은 사용자가 설정한 규칙의 한도내에서 가능한 최소한의 접속만 하도록 합니다. 이것은 꼭 필요하지 않는 경우에 포트들을 재 설정할 필요가 없다는 것을 의미합니다.

Implicit Source Port Mapping

접속을 하는데 NAT 를 요구하지 않더라도 이전의 접속에 겹쳐서 접속을 시도하려하면 시작점 포트는 강제로 변경되도록 합니다. 좀 자주 사용되는 경우로 마스쿼레이딩의 경우를 봅시다.

  1. 192.1.1.1의 1024 포트로부터 www.netscape.com의 포트 80으로 웹 접속을 하는 경우를 가정해 봅니다.
  2. 그리고 이것은 시작점 IP 주소(1.2.3.4)를 가진 것으로 마스퀘레이더 된다고 가정합니다.
  3. 마스쿼레이딩 박스는 1.2.3.4(이것의 외부 인터페이서 주소)의 1024 포트로부터 www.netscape.com의 80 포트로 웹 접속을 이룩합니다.
  4. NAT 코드는 그 다음의 접속은 1025포트로 시작점 주소를 바꾸어 이 둘이 서로 충돌하지 않도록 합니다.

이러한 강제적인 시작점 설정이 이루어질때 포드는 다음의 세가지 클래서로 나누어 집니다.

서로 다른 클래스로 포트가 설정되는 일은 없을 것입니다.

NAT 가 실패했을 경우 어떤일이 생길까요 ?

사용자가 요구한데로 접속을 유일하게 설정 할 방법이 없는 경우 이것은 DROP 됩니다. 이것은 잘못된 패킷의 경우처럼 어떠한 접속의 형태로도 구분되지 않을때, 그리고 메모리 제한을 벗어났을때 등의 경우에도 DROP 됩니다.

복수의 설정, 중복, 충돌

NAT 규칙에서 그 대상 패킷이 같은 범위를 가질 수 있습니다. 이 경우 충돌을 피할 정도로 NAT 코드는 똘똘합니다. 그러므로 두개의 규칙을 1.2.3.4로의 접속에 적용하면서 그 시작점 주소를 같이 192.168.1.1과 192.168.1.2로 정하는 것도 가능합니다.

더군다나, 그 주소가 주소설정을 하고있는 컴퓨터를 지난다면, 사용하고있는 실제 IP 주소도 겹쳐 쓸수가 있습니다. 그래서, 여러분이 설정된 네트워크(1.2.3.0/24)를 가지고 있지만 이러한 주소중 하나를 내부의 네트워크로 사용하고있고 하나는 기초적인 인터넷 주소인 192.168.1.0/24를 사용할 경우 여러분은 단순히 1.2.3.0 네트워그로 192.168.1.0/24를 시작점 주소로하는 NAT를 아무런 충돌에 대한 두려움 없이 사용할 수 있습니다.

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
        -j SNAT --to 1.2.3.0/24

같은 논리가 NAT 컴퓨터 자신이 사용하는 주소에도 해당됩니다. 이것이 마스쿼레이딩이 작동하는 방식입니다. (마스쿼래이더하는 컴퓨터 자신으로부터 오는 실제의 패킷과 마스쿼레이더 되는 패킷이 인터페이서의 주소를 공유함으로 작동하죠.)

더더욱, 많은 다른 타겟을 같은 패킷에 설정할 수도 있다. 그러면 이들은 공유될 것이다. 예를 들어 여러분이 1.2.3.5로는 아무것도 설정되지 않기를 바란다면 그렇게 할 수 있다.

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
        -j SNAT --to 1.2.3.0-1.2.3.4 --to 1.2.3.6-1.2.3.254

지역적으로 생성된 접속의 목적지를 변경하기

지역적으로 생성된 패킷의 목적지가 변경된다면 (출력 체인을 통해서) 그래서 그 패킷이 다른 인터페이서를 통해서 나가도록 한다면, 시작점 주소도 그 인터페이서의 주소로 바꿀 수가 있다. 예를 들어, 루프백 패킷의 목적지를 eth0로 향하도록 변경한다면 그 시작점도 127.0.0.1 에서 eth0의 주소로 바뀌게 된다. 다른 시작점 설정과는 달리 이것은 즉각 시행된다. 자연적으로 이 설정은 응답패킷이 왔을때 역전된다.


다음 이전 차례