내 LAN에서 게이트웨이 역할을 하는 Linux 시스템에서 iproute2를 사용하여 트래픽을 라우팅하려고 했습니다. 또한, 라우팅하기 전에 NAT를 수행해야 합니다. Linux 시스템은 인터넷 연결이 가능한 장치에 연결되어 있고 2개의 IP 주소 172.16.61.1
와172.16.62.100
다음 구성의 네트워크 카드가 2개 있습니다.
DEVICE=eth3
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=192.168.1.150
USERCTL=no
IPV6INIT=no
PEERDNS=yes
DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes
GATEWAY=172.16.61.1
iptables를 통한 IP 번역에는 다음 지침을 사용합니다.
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -j SNAT --to-source 172.16.61.2
앞서 언급한 구성을 사용하면 192.168.1.150을 게이트웨이로 사용하는 192.168.1.0/24 네트워크에 속한 모든 컴퓨터가 인터넷에 연결할 수 있습니다.
iproute2를 사용하여 게이트웨이를 구성하려고 하면 다음 구성을 가정하는 eth4에서 기본 게이트웨이를 제거합니다.
DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes
그리고 다음 단계를 수행했습니다.
1. In /etc/iproute2/rt_tables I have added the line
1개 루트61
2. /sbin/ip route add 172.16.61.0/24 via 172.16.61.1 table route61 proto static
3. /sbin/ip route add default via 172.16.61.1 table route61 proto static
4. /sbin/ip rule add from 172.16.61.0/24 pref 15000 table route61
의 출력은 /sbin/ip route show table route61
다음과 같습니다
172.16.61.0/24 via 172.16.61.1 dev eth4 proto static
default via 172.16.61.1 dev eth4 proto static
의 출력은 /sbin/ip rule show
다음과 같습니다
0: from all lookup local
15000: from 172.16.61.0/24 lookup route61
32766: from all lookup main
32767: from all lookup default
그런데 이 경우에는 작동하지 않습니다. 제가 뭘 잘못한 걸까요?
/etc/sysconfig/network-scripts/ifup-routes eth4
나는 또한 성공하지 못하고 사용하려고 시도했습니다.
나에게 필요한 것은 여러 게이트웨이가 있는 컨텍스트에서 사용해야 하는 "테이블 기반 라우팅"이 작동하지 않는 이유를 이해하는 것입니다.
업데이트
dirkt가 제안한 것을 시도하기 위해 기본 게이트웨이를 제거했습니다.
route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
그리고 나는 다음을 사용했습니다 :
ip rule add from 192.168.1.0/24 pref 15000 table route61
무슨 일이 일어나는지
- 이 게시물의 PC 개체인 192.168.1.150을 GW로 사용하는 PC는 인터넷에 연결할 수 있습니다.
- 지침을 제거하지 않으면 더 이상 GW에 연결할 수 없습니다.
ip rule add from 192.168.1.0/24 pref 15000 table route61
포스트라우팅을 사용하면 192.168.1.0/24에서 오는 패킷이 172.16.61.2를 소스 주소로 가정하면 안 됩니까?
route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
OR을 사용하여 기본 GW를 사용하거나 제거하는 경우 route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
다음을 수행합니다.
ip route get 216.58.205.78 from 192.168.1.5
나는 가지고있다RTNETLINK answers: Invalid argument
내가 사용한다면 ip route get 216.58.205.78 from 172.16.61.2
나는 가지고있다216.58.205.78 from 172.16.61.2 via 172.16.61.1 dev eth4
내가 할 경우 route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
:
nc -v 216.58.205.78 443
나는 가지고있다
Connection to 216.58.205.78 443 port [tcp/https] succeeded!
기본 GW nc를 제거하면 route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4
소스 IP를 지정한 경우에만 연결됩니다.
nc -v 216.58.205.78 443 -s 172.16.61.2
답변1
내가 올바르게 이해했다면, 당신은 192.168.1.0/24
켜져 있고 eth3
그것을 뒤에 있는 것으로 라우팅하고 NAT하기를 원하며 eth4
, 뒤에 있는 것이 정확히 무엇인지 지정되지 않았는지 eth4
, DHCP를 사용하는지, 고정 주소가 필요한지 여부를 알 수 있습니다.
eth4
(일반적인 경우는 DHCP를 실행하고 주소를 제공하는 일종의 라우터가 뒤에 있다는 것입니다 .)
따라서 먼저 이를 달성하는 일반적인 방법은 전달을 활성화하고 다음을 수행하는 것입니다.
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
$EXTIF
외부 인터페이스( eth4
) 는 어디에 있나요? 는 어떤 주소가 켜져 있든 관계가 MASQUERADE
있으므로 주소 재할당에 대해 탄력적입니다. 그리고 프로토콜을 언급하지 않으면 모든 것이 NAT로 연결됩니다. 이는 일반적으로 원하는 것입니다.SNAT
eth4
둘째, 테이블 기반 라우팅을 수행할 이유가 없습니다(설명하지 않은 추가 세부 정보가 없는 한). 따라서 테이블은 잊어버리고 eth4
기본 경로에 대한 게이트웨이 정보를 배포하는 DHCP가 없는 경우 다음을 수행하십시오.
ip route default via 172.16.61.1
eth4
에 이미 주소가 있다고 가정하면 172.16.61.*/24
이것으로 충분합니다( 172.16.61.0/24
IP 주소를 설정할 때 경로가 설정됩니다).
그러나 가장 좋은 방법은 라우터에서 활성화된 경우 이를 DHCP에 그대로 두는 것입니다( BOOTPROTO=dhcp
Red Hat이라면 그럴 것 같습니다).
문제가 정책 라우팅인 경우: 192.168.1.0/24
table의 기본 경로를 통해 들어오는 나가는 패킷을 라우팅하려고 하므로 route61
다음을 수행해야 합니다.
ip rule add from 192.168.1.0/24 pref 15000 table route61
그리고 from 172.16.61.0/24
.
즉, 실제로 NAT가 정책 라우팅과 어떻게 상호 작용하는지 잘 모르겠습니다. ID추정하다반환되는 패킷이 먼저 deNAT된 다음 기본 테이블의 규칙이 패킷을 올바르게 라우팅하지만 직접 시도한 적은 없습니다.
언급한 다른 질문에서 이미 했던 것처럼 두 인터페이스 모두에서 디버그하는 ip route get X.X.X.X from Y.Y.Y.Y
것이 도움이 될 수 있습니다 .tcpdump
또한 테이블 없이 먼저 이 작업을 시도하는 것이 더 쉬울 것입니다. 일단 작동하면 다른 어떤 것도 방해가 되지 않는다는 것을 알고 테이블을 사용해 볼 수 있습니다.
답변2
새로운 라우팅 테이블을 사용하면 연결된 경로도 추가해야 합니다. 대신 지정된 소스 IP를 사용해야 하며 192.168.1.0/24 경로를 놓쳤습니다. 라우팅 결정은 출력/포스트 라우팅 NAT 전에 수행되므로 172.16.61.0/24 via 172.16.61.1 dev eth4 proto static
원래 소스 IP를 사용해야 합니다. .
proto scope link
ip rule add from
# Configure tables
echo '2 table61' >> /etc/iproute2/rt_tables
echo '3 table62' >> /etc/iproute2/rt_tables
# routing decision is performed before output / post routing nat
ip rule add from 192.168.1.5 lookup table62
ip rule add from 192.168.1.0/24 lookup table61
ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table61
ip route add 172.16.61.0/24 dev eth4 proto kernel scope link src 172.16.61.2 table table61
ip route add default via 172.16.61.1 table table61
ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table62
ip route add 172.16.62.0/24 dev eth4 proto kernel scope link src 172.16.62.100 table table62
ip route add default via 172.16.62.254 table table62
또한 내 머릿속에서 귀하의 질문이 혼합되었을 수 있습니다. 즉시 작동하지 않으면 질문에 다음을 추가해 주시겠습니까?
ip a
ip r show table table61
ip r show table table62
ip rule show
iptables -L -n -v
iptables -t nat -L -n -v