대상 포트에 따라 다양한 인터페이스로 트래픽 출력

대상 포트에 따라 다양한 인터페이스로 트래픽 출력

내 문제는 기본적으로특정 인터페이스에서는 특정 아웃바운드 트래픽만 허용.

eth1두 개의 인터페이스 (10.0.0.2)와 (192.168.0.2) 가 있습니다 wlan0. 내 기본 경로는 입니다 eth1. 모든 https 트래픽이 통과하길 원한다고 가정해 보겠습니다 wlan0. 이제 다른 질문에서 제안한 솔루션을 사용하면 https 트래픽이 통과 wlan0하지만 여전히 소스 주소는 (10.0.0.2) 입니다 eth1. 게이트웨이가 주소를 라우팅할 수 없으므로 wlan0응답이 반환되지 않습니다. 가장 쉬운 방법은 애플리케이션에서 바인딩 주소를 올바르게 설정하는 것이지만 이 경우에는 적용되지 않습니다.

내 생각에는 src-addr을 다시 작성해야 할 것 같습니다:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

이제 tcpdump는 나가는 패킷이 잘 보이고 들어오는 패킷이 192.168.0.2에 도착하는 것을 확인하지만, 내가 본 것은 SYN - ACK 수신에도 불구하고 응용 프로그램이 SYN 패킷을 다시 보내는 것이기 때문에 응용 프로그램에서 끝나지 않을 수 있습니다.

그래서 나는 수신 주소도 다시 작성해야 할 수도 있다고 생각했습니다.

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

하지만 그것도 작동하지 않습니다. 그래서 나는 여기에 갇혀 있습니다. 어떤 제안이 있으십니까?

답변1

당신은 가깝습니다.

애플리케이션이 반환 트래픽을 볼 수 없는 실제 이유는 커널에 내장된 IP 스푸핑 보호 때문입니다. 즉, 반환 트래픽이 라우팅 테이블과 일치하지 않으므로 삭제됩니다. 다음과 같이 스푸핑 방지를 꺼서 이 문제를 해결할 수 있습니다.

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

그러나 나는 그것을 추천하지 않을 것입니다. 보다 적절한 접근 방식은 대체 라우팅 인스턴스를 생성하는 것입니다.

  1. 마킹이 필요합니다. 가져.
  2. 소스 NAT도 필요합니다.
  3. 마지막 DNAT는 불필요하므로 삭제하셔도 됩니다.

iproute패키지가 설치되어 있는지 확인하십시오 . 이 명령이 있으면 ip이미 설정된 것입니다(먼저 가져오지 않고 해당 명령을 수행한 것처럼 보입니다).

/etc/iproute2/rt_tables다음 줄을 추가하여 새 테이블을 편집하고 추가합니다.

200 wlan-route

그런 다음 기본 게이트웨이 이름을 딴 새 라우팅 테이블을 구성 wlan-route하고 조건부로 트래픽을 테이블에 보내는 규칙을 생성해야 합니다. 기본 게이트웨이가 192.168.0.1이라고 가정합니다. 물론 이는 단지 내 가정이 아니라 실제 네트워크와 일치해야 합니다.

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

주석이 추가된 최종 스크립트는 다음과 같습니다.

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

답변2

바하마를 위한 솔루션맞습니다. 그러나 이 작업을 수행할 수 있는 유일한 방법은 NAT에 관련된 두 인터페이스(이 경우 eth1 및 wlan0)뿐 아니라 시스템의 모든 인터페이스에 대해 rp_filter를 비활성화하는 것이었습니다.

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(이 페이지 끝에 있는 중요 참고 사항을 참조하세요.고급 라우팅 가이드--거기에 게시된 링크는 더 이상 존재하지 않지만 반환 기계를 통해 찾았습니다.)

답변3

한 가지 제안: 항상 출력 체인에서 --sport대신 사용해야 합니다 .--dport

NAT가 변경되어 dport규칙을 사용할 수 없게 됩니다.

답변4

나는 비슷한 일을하려고 노력합니다. wwan0(메트릭 700)과 eth0(메트릭 100)의 두 가지 인터페이스가 있습니다. 모든 https(443) 트래픽이 wwan0을 통과하길 원합니다. 위에 게시된 예를 따랐고 처음 몇 개의 패킷에는 작동했지만 FIN-WAIT-1 상태가 표시되기 시작한 다음 작동이 중지되고 FIN-WAIT-1 목록이 더 커졌습니다. 무슨 일이 일어났는지 모르겠어요. 시스템이 부팅되고 약 443개의 트래픽을 eth0으로 보내기 시작한 다음 스크립트를 실행하고 트래픽이 wwan0으로 이동하지만 수백 개의 패킷 후에 무언가 포화되어 계속 FIN-WAIT-1을 제공합니다.

저는 다음과 같이 설정했습니다.

ip route add default dev wwan0 table wwan-route
ip rule add fwmark 0x1 table wwan-route
iptables -A OUTPUT -t mangle -p tcp --dport 443 -j MARK --set-mark 1
nft add table nat
nft add chain nat post { type nat hook postrouting priority 0 \; }
nft add rule ip nat post oifname wwan0 tcp dport 443 masquerade

라우팅 테이블:

default via 192.168.1.1 dev eth0 proto dhcp metric 100 
default via 10.5.1.101 dev wwan0 proto static metric 700 
10.5.1.96/29 dev wwan0 proto kernel scope link src 10.5.1.100 metric 700 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.127 metric 100 

모든 IP 라우팅 표시 테이블:

# ip route show table all
default via 192.168.1.1 dev eth0 table eth0rule 
default dev wwan0 table wwan-route scope link 
default via 192.168.1.1 dev eth0 proto dhcp metric 100 
default via 10.5.1.101 dev wwan0 proto static metric 700 
10.5.1.96/29 dev wwan0 proto kernel scope link src 10.5.1.100 metric 700 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.127 metric 100 
broadcast 10.5.1.96 dev wwan0 table local proto kernel scope link src 10.5.1.100 
local 10.5.1.100 dev wwan0 table local proto kernel scope host src 10.5.1.100 
broadcast 10.5.1.103 dev wwan0 table local proto kernel scope link src 10.5.1.100 
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1 
broadcast 192.168.1.0 dev eth0 table local proto kernel scope link src 192.168.1.127 
local 192.168.1.127 dev eth0 table local proto kernel scope host src 192.168.1.127 
broadcast 192.168.1.255 dev eth0 table local proto kernel scope link src 192.168.1.127 

IP 규칙:

 ip rule
0:      from all lookup local
0:      from all fwmark 0x1 lookup wwan-route
1:      from 192.168.1.127 lookup eth0rule
32766:  from all lookup main
32767:  from all lookup default

그리고:

cat /etc/iproute2/rt_tables 
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
210 wwan-route
200 eth0rule

거의 다 왔는데 뭔가 빠졌네요.

관련 정보