대상 포트를 기반으로 다른 인터페이스에서 출력 트래픽


23

내 질문은 기본적으로 특정 인터페이스에서 특정 아웃 바운드 트래픽 만 허용 과 같습니다 .

두 개의 인터페이스 eth1(10.0.0.2)와 wlan0(192.168.0.2)가 있습니다. 내 기본 경로는입니다 eth1. 모든 https-traffic이 통과하기를 원한다고 가정 해 봅시다 wlan0. 이제 다른 질문에서 제안 된 솔루션을 사용하면 https 트래픽이 통과 wlan0하지만 여전히 소스 주소는 eth1(10.0.0.2)입니다. 이 주소는 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에 도달하는 것을 보았습니다. 그러나 응용 프로그램에서 끝나지 않을 것입니다. ACK가 이미 접수되었습니다.

그래서 나는 아마도 들어오는 주소를 다시 써야한다고 생각했다.

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

그러나 그것은 작동하지 않았습니다. 그래서 나는 여기에 붙어 있습니다. 어떤 제안?

답변:


24

당신은 가까이 있습니다.

애플리케이션이 리턴 트래픽을 보지 못하는 실제 이유는 커널에 내장 된 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

시간을내어 조사해 주셔서 감사합니다. 그러나 이것은 이미 다른 질문에 설명 된대로 사용하고 있으므로 추가 경로를 설정했지만 여전히 동일합니다. SYN-ACK는 192.168.0.2로 돌아가지만 응용 프로그램에는 도달하지 않는 것 같습니다.
rumpel

돌아가서 답을 다시 읽으십시오. 나는 그것을 해결했다.
bahamat

스푸핑 보호에 관한 부분은? 시도한 후에도 변경 사항이 없습니다. 죄송합니다. 두 번 다시 읽었지만 아직 내가 잃어버린 것을 얻지 못했습니다.
rumpel

올바른 소스 주소를 지정하려면 명령에 src옵션 을 추가해야 ip route합니다.
David Schwartz

@DavidSchwartz : POSTROUTING SNAT의지가 처리합니다.
bahamat

8

바하마의 해결책 은 정확합니다. 그러나이 작업을 수행 할 수있는 유일한 방법은 NATing과 관련된 두 가지 (이 경우 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

(이 페이지의 끝에있는 중요 사항 : 고급 라우팅 하우투 (Advanced Routing Howto) -더 이상 게시 된 링크는 존재하지 않지만, 웨이 백 머신을 통해 발견했습니다)


이 답변에 감사드립니다. 저도 귀하의 답변을 고려하여 바하마 솔루션을 작동시킬 수있었습니다.
Dynalon

상당히 표준적인 우분투 12.04 LTS 상자에서 rp_filter를 비활성화하고 경로 캐시를 비우는 것 외에도 iptables 인수에서 인터페이스 이름을 제거해야했습니다. 이유를 조사 할 시간이 충분하지 않았습니다.
Costin Gușă

0

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

NAT dport가를 변경하면 규칙을 사용할 수 없게됩니다.


2
내가 얻지 못하는 것이 있습니까? 대상 포트에서와 같이 dport는 변경할 수 없습니다. 세션이 도달하려고하는 서비스의 포트입니다 (예 : http, ssh, smtp). 당신은 스포츠와 dport가 혼란스러워 지거나 분명한 것을 놓치고 있습니다. : P
누군가

0

아래가 필요하다고 생각합니다.

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.