게이트웨이 머신이 2대 있습니다. 1개의 debian(기본 - 192.168.1.1), 1개의 centos(백업 192.168.1.2). "메인 네트워크"를 통해 2개의 네트워크, 즉 1개의 LAN과 1개의 WAN이 있으며 LAN에 있는 ISP1과 PPP(기본적으로 3G 스틱을 통해)를 통해 ISP2로 "백업"됩니다.
문제는 ISP1이 악천후나 다른 이유로 인해 "죽거나" 패킷이 손실될 때 수동으로 설정할 수 있기를 원한다는 것입니다.확증하다LAN 스테이션의 인터넷 트래픽은 ISP2를 통과하고 나머지 트래픽은 ISP1에 남습니다. 따라서 192.168.1.3이 GW1/ISP1을 통해 정상적으로 온라인 상태가 되도록 하고 어느 시점에 수동으로 GW2/ISP2로 전환하고 싶다고 가정해 보겠습니다. 사이트 네트워크 설정을 최대한 "접촉"하지 않고 이 작업을 수행해야 합니다. 이렇게 하면 로컬 네트워크 연결이 끊어지고, 이로 인해캔트발생하다.
192.168.1.3(WinXP) 기본 게이트웨이가 192.168.1.1인 DNS 서버 및 DHCP를 통해 ISP1로 설정된 2개의 DNS 서버
DNAT(외부 IP를 192.168.1.2로 대체하는 것으로 보이므로 통신이 중단됨)와 IP 라우팅(로컬 네트워크 트래픽을 엉망으로 만듭니다)을 사용하여 다양한 솔루션을 시도했습니다.
나는 iptables DNAT 솔루션에서 명백한 것을 볼 수 없다고 생각하지만 손가락질할 수는 없습니다. 참고로 줄은 다음과 같습니다.
iptables -t nat -A PREROUTING -s 192.168.1.3 ! -d 192.168.1.0/8 -j DNAT --to 192.168.1.2
IP 라우팅은 다음과 같이 수행됩니다.
ip route add 192.168.1.3 via 192.168.1.2
GW1(192.168.1.1)에서 모두 완료되었습니다.
GW2에서 IP 전달이 활성화되었습니다(분명히 GW1의 라우팅 및 NAT 자체에는 모든 것이 정상입니다).
GW2의 iptables 규칙은 이것이 정상적인지 확실하지 않기 때문에 (iptables-save에서) 다음과 같습니다.
*nat
:PREROUTING ACCEPT [21038:1379326]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [302:19015]
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [61306:4073979]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [27660:3745654]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A FORWARD -s 192.168.1.3/32 -j ACCEPT
-A FORWARD -d 192.168.1.3/32 -j ACCEPT
COMMIT
감사해요.
답변1
Debian 라우터(기본 라우터 - 192.168.1.1)는 NAT 트래픽을 백업 라우터로 리디렉션하기 위해 시도해서는 안 됩니다. 기껏해야 이중 NAT가 발생하고(백업 라우터가 ppp0
해당 규칙에 따라 다시 NAT를 수행하므로 MASQUERADE
) 최악의 경우 반환 트래픽이 폴백을 얻을 수 없도록 IP 주소를 다시 작성하게 됩니다.
가장 쉬운 옵션은 VRRP를 사용하는 것입니다. 두 라우터 간에 공유되는 가상 게이트웨이 주소를 설정합니다. 마스터 라우터가 기본적으로 마스터 라우터 역할을 수행하지만 자체 인터넷 연결을 사용할 수 없는 경우 종료되도록 우선순위를 설정합니다. Linux에서는 다음을 사용하십시오.VRRPDVRRP를 구현합니다. 그런 다음 전환하려는 워크스테이션의 기본 게이트웨이를 가상 게이트웨이 주소로 설정하고 나머지는 기본 라우터의 실제 IP 주소를 가리키도록 둡니다.
실제로 이 작업을 수동으로 수행하려면 VRRP도 필요하지 않습니다. 가상 게이트웨이 주소를 수동으로 관리하고 이를 기본 라우터( ip addr del x.y.z.w/qq dev eth?
)에서 제거한 후 다른 라우터( )에 추가하면 됩니다 ip addr add x.y.z.w/qq dev eth?
. 그러나 실제 VRRP는 IP 주소 외에 MAC 주소도 관리하므로 수동으로 라우팅하는 경우(말장난 의도 없이) 일부 ARP 문제가 발생할 수 있습니다.
또 다른 방법은 대체 라우터를 가리키는 데비안 라우터에 정적 기본 경로를 설치하는 것입니다. 정책 라우팅( 사용 ip rule
)을 사용하여 특정 소스 IP 주소가 있는 패킷에만 이 경로를 적용할 수 있습니다. 이 경로는 WAN 외부의 기본 경로보다 더 높은 메트릭을 가져야 합니다. 따라서 WAN 외부의 기본 경로가 존재하는 경우 해당 경로는 독점적으로 사용되며, 그렇지 않은 경우 트래픽은 대체 기본 경로를 따릅니다. 이 기본 경로로 인해 ICMP 리디렉션이 워크스테이션으로 전송될 수도 있고 그렇지 않을 수도 있습니다. 기본 라우터가 들어오고 나가는 트래픽을 다른 라우터로 리디렉션하는 작업을 처리할 수 있다는 가정하에 워크스테이션이 돌아올 때 즉시 기본 경로로 폴백되도록 이러한 기능을 비활성화할 수 있습니다. ( /proc/sys/net/ipv4/conf/<intf>/send_redirects
)
답변2
제가 답장하는 것을 잊어버린 것 같습니다. 그래서 최종적으로 해결한 방법은 다음과 같습니다.
- 전달 DNS 서버도 호스팅하도록 LAN1을 설정했습니다.
- DHCP 설정을 변경하고 DNS 서버를 ISP 서버에서 로컬 서버(LAN1)로 변경했습니다.
- 나는 네트워크 정보를 얻고, 자신을 로컬 게이트웨이로 구성하고, 기본적으로 다음과 같이 LAN 게이트웨이가 자신을 가리키도록 변경하는 스크립트를 3g 라우터에 작성했습니다(vwdial을 통해 3g 연결이 설정된 직후에 실행해야 합니다(저는 A가 있습니다). 성공적인 연결과 네트워크 문제를 관찰하기 위해 이를 유지하고 싶기 때문에 다른 스크립트)):
#!/bin/sh
# get info
LOCAL_IP=`tail -n 20 /var/log/messages | grep pppd | grep local | sed "s/.*IP address \(.*\)/\1/"`
REMOTE_IP=`tail -n 20 /var/log/messages | grep pppd | grep ": remote" | sed "s/.*IP address \(.*\)/\1/"`
DNS1=`tail -n 20 /var/log/messages | grep pppd | grep ": primary" | sed "s/.*DNS address \(.*\)/\1/"`
DNS2=`tail -n 20 /var/log/messages | grep pppd | grep ": secondary" | sed "s/.*DNS address \(.*\)/\1/"`
echo got info LOCAL_IP=$LOCAL_IP REMOTE_IP=$REMOTE_IP DNS1=$DNS1 DNS2=$DNS2
# setup self as gateway
echo nameserver $DNS1>/etc/resolv.conf
echo nameserver $DNS2>>/etc/resolv.conf
route del default gw 192.168.1.1 eth0
route add default gw $REMOTE_IP ppp0
echo done setting up self with new params
# setup old gateway to forward to self
echo changing dplug routes
ssh [email protected] 'route del default gw X.Y.Z.W eth0'
ssh [email protected] 'route add default gw 192.168.1.7 eth1'
echo removing dplug LAN SNAT
ssh [email protected] 'iptables -t nat -D POSTROUTING -o eth0 -j SNAT --to-source A.B.C.D'
echo deleting WIFI SNAT
ssh [email protected] 'eval "$(cat firewall/iptables | grep "\-A POSTR" | grep -v "\#" | sed "s/-A/iptables -t nat -D/")"'
echo adding new WIFI SNAT
ssh [email protected] 'eval "$(cat firewall/iptables | grep "\-A POSTR" | grep -v "\#" | grep 192.168.2 | sed "s/\(-A .*\) -o .*/iptables -t nat \1 -o eth1 -j SNAT --to-source 192.168.1.1/")"'
echo setting up dnsmasq DHCP for new values
ssh [email protected] 'echo "# this dnsmasq config file is generated by 3g router. do not edit.">/etc/dnsmasq.3g.conf'
ssh [email protected] "echo server=$DNS1>>/etc/dnsmasq.3g.conf"
ssh [email protected] "echo server=$DNS2>>/etc/dnsmasq.3g.conf"
ssh [email protected] "echo dhcp-option=net:wlan,6,$DNS1,$DNS2>>/etc/dnsmasq.3g.conf"
ssh [email protected] "echo dhcp-option=net:lan,6,$DNS1,$DNS2>>/etc/dnsmasq.3g.conf"
echo restarting dnsmasq
ssh [email protected] '/etc/init.d/dnsmasq restart'
echo all done
/etc/dnsmasq.3g.conf는 원래 비어 있는 dnsmasq.conf에 포함되어 있습니다. 최소한의 방법으로 위의 작업을 실행 취소하는 스크립트가 있습니다. 그런 다음 3g 라우터 VM을 종료하기 때문에(3g USB 스틱을 당기면 커널 패닉이 발생합니다...) 실제로는 신경 쓰지 않습니다.
이 스크립트는 인터넷 액세스용으로 구성된 WAN IP만 인터넷에 계속 액세스할 수 있고 다른 IP는 액세스할 수 없도록 보장합니다. 인터넷 접속에 사용되는 LAN IP는 3g 라우터의 iptables에 수동으로 추가됩니다. (그건 변하지 않을 거야)