두 개의 라우터를 사용한 포트 전달

두 개의 라우터를 사용한 포트 전달

두 개의 다른 공용 IP 뒤에 서버가 있고 DNAT를 수행하여 포트에 따라 다른 내부 서버로 트래픽을 보냅니다.


-------------------------                  -----------------------
| server a (port 80/tcp)|                  |       router A      |
|   (eth0) 192.168.1.123|..................|192.168.1.1 (eth1)   |
-------------------------         :        |       (eth0) 1.2.3.4|............
                                  :        -----------------------           :
                                  :                                          :
                                  :        -----------------------           :.... INTERNET
-------------------------         :        |       router B      |           :
| server a (port 25/tcp)|         :        |       (eth0) 2.3.4.5|...........:
|   (eth0) 192.168.1.234|..................|192.168.1.2 (eth1)   |
-------------------------                  -----------------------

라우터 A 및 BI에서 전달 및 다음 iptables를 활성화했습니다.

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123

실제로 서버 A와 B에 다음 경로가 추가되었습니다.

route add default gw 192.168.1.1

따라서 인터넷으로의 모든 내부 트래픽은 라우터 A를 통과하고 포트 25와 80으로의 모든 트래픽은 서버 A와 B로 올바르게 전송되지만 트래픽이 라우터 A를 통해 들어온 경우에만 연결이 작동합니다. 실제로 라우터 B를 통한 트래픽은 도착합니다. 서버로 전송되지만 B 대신 라우터 A를 통해 반환되므로 연결이 작동하지 않습니다.

서버에 새 경로를 추가했습니다.

route add default fw 192.168.1.2

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
0.0.0.0         192.168.1.2     0.0.0.0         UG    0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

그러나 연결이 여전히 작동하지 않습니다.

어떻게 관리할 수 있나요?

내부 -> 외부 트래픽의 균형을 맞추는 것은 중요하지 않지만 외부 IP에 대해 인터넷에서 들어오는 모든 연결이 올바르게 설정되기를 원합니다.

참고: 또한 다른 라우터의 외부 IP에 대해 라우터 중 하나에서 DNAT를 수행하려고 시도했지만 서로 다른 네트워크에 있어서 작동하지 않았습니다.

iptables -t nat -I PREROUTING -p tcp --dport 25 -d ${ExternalIPA} -i eth0 -j DNAT --to ${ExternalIPB}

답변1

현재 설정이 의도한 대로 작동하지 않습니다. Router-A및 에 떠 있는 가상 IP가 필요합니다 Router-B. 이는 또한 간단하게 두 라우터 간의 로드 밸런싱을 수행합니다. 이 예에서는 업계 표준을 사용하겠습니다.VRRPLinux 라우터(Ubuntu-16)에서.

절차는 다음과 같습니다.

Linux Router-A및 에서 Router-B다음 명령을 실행합니다.

$ sudo echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
$ sudo sysctl -p

두 라우터 모두에 연결 유지 설치

$ sudo apt-get update
$ sudo apt-get install keepalived -y

그런 다음 Router-A해당 역할로 이동합니다 MASTER. 다음 항목을 사용하여 새 구성 파일을 만듭니다 /etc/keepalived/keepalived.conf.

vrrp_instance VI_1 {
    interface eth1
    state MASTER
    virtual_router_id 50
    priority 101

    authentication {
        auth_type AH
        auth_pass pass123
    }

    virtual_ipaddress {
        192.168.1.99
    }
}

Router-B그런 다음 해당 역할로 이동하여 BACKUP새 구성 파일에 대해 동일한 작업을 수행합니다 /etc/keepalived/keepalived.conf.

vrrp_instance VI_1 {
    interface eth1
    state BACKUP
    virtual_router_id 50
    priority 100

    authentication {
        auth_type AH
        auth_pass pass123
    }

    virtual_ipaddress {
        192.168.1.99
    }
}

설명:

net.ipv4.ip_nonlocal_bind=1가상 IP가 물리적 인터페이스에 바인딩되어서는 안 된다는 것을 커널에 알려줍니다.

vrrp_instance VI_1두 라우터 모두에서 일치해야 합니다. 동일한 라우터에서 여러 VRRP를 실행할 수 있으므로 이는 식별자입니다.

interface eth1LAN을 향하는(내부 서버를 향하는) 인터페이스입니다.

state MASTER계속 Router-A해서 설명이 필요합니다 state BACKUP.Router-B

virtual_router_id 50두 라우터 모두에서 일치해야 합니다. 이것은 식별자입니다.

priority 101on Router-Apriority 100on Router-B(이 경우 라우터 A의 우선순위가 더 높습니다).

authentication두 라우터 모두에서 일치해야 합니다. 이 경우에는 사전 공유 키를 사용했습니다.passw123

virtual_ipaddressVRRP가 사용할 유동 IP 주소입니다. 이 IP는 두 라우터 모두에서 일치해야 합니다. 이 IP는 LAN 세그먼트의 어떤 장치에서도 사용되어서는 안 됩니다. 이 경우에는 내가 선택했다192.168.1.99

연결 유지 서비스 활성화

$ sudo systemctl enable keepalived

연결 유지 서비스 시작

$ sudo systemctl start keepalived

두 라우터 모두에서 iptables 규칙을 조작할 시간입니다.

두 라우터 모두에서 모든 NAT 규칙을 삭제합니다(깨진 NAT 규칙 제거).

$ sudo iptables -t nat -F
$ sudo iptables -t mangle -F

그런 다음 올바른 NAT 규칙을 추가합니다.

라우터-A

$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234

라우터-B

$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123

이것이 라우터 측에서 필요한 전부입니다. 이제 서버(Server-A 및 Server-B)로 이동하여 기존 기본 게이트웨이( 192.168.1.1)를 삭제하고 새 게이트웨이( 192.168.1.99)를 할당합니다.

$ sudo ip route del 0/0
$ sudo route add default gw 192.168.1.99

인터넷에서 연결이 설정되면 두 서버(Server-A 및 Server-B)는 위에 떠 있는 가상 IP( )로 트래픽을 반환 192.168.1.99하고Router-ARouter-B

참조:https://www.keepalived.org/manpage.html

답변2

마지막으로 가상 IP를 사용하지 않고 기본적으로 CONNNMARK를 사용하고 다른 경로를 추가하여 작동하도록 했습니다.

메모:

  • 라우터 A eth1 MAC = AA:AA:AA:AA:AA:AA
  • 라우터 B eth1 MAC = BB:BB:BB:BB:BB:BB

비대칭 경로를 사용하는 모든 서버에 다음 경로와 iptable을 추가해야 합니다.

# add the two routing tables
ip route add to default table 11 via 192.168.1.1 dev eth0
ip route add to default table 33 via 192.168.1.2 dev eth0

# add the mark to the routing tables
ip rule add priority 99 table 11 fwmark 11
ip rule add priority 99 table 33 fwmark 33

# mark the packets that came from the different routes
iptables -t mangle -A OUTPUT ! -d 192.168.1.0/24 -m addrtype --dst-type UNICAST -j CONNMARK --restore-mark
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source AA:AA:AA:AA:AA:AA -j CONNMARK --set-mark 33
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source BB:BB:BB:BB:BB:BB -j CONNMARK --set-mark 11

이제 모든 것이 잘 작동하고 있습니다. 인터넷에서 외부 IP 주소로의 모든 연결은 DNAT 연결을 관리하는 라우터를 통해 라우팅됩니다.

관련 정보