특정 인터페이스에서 특정 아웃 바운드 트래픽 만 허용


15

다소 이상한 문제가 있습니다. 나는 두 개의 네트워크 인터페이스가있는 서버가 eth0eth1. 각각 다른 네트워크에 연결되어 있습니다. 각 네트워크에는 인터넷 게이트웨이가 있습니다. 서버에는 http (서버 스크랩 웹 사이트의 일부 스크립트), nfs 클라이언트, samba 클라이언트, dns 클라이언트 및 이메일 가져 오기 도구 등 다양한 아웃 바운드 연결이 있습니다.

내가 들어 가지 않는 이유로 인해 아웃 바운드 클라이언트를 분할해야 아웃 바운드 http, nfs, samba 및 dns 트래픽이 요청되고 eth0다른 모든 항목은 종료됩니다 eth1.

몇 가지 Google 검색을 읽었으며 iptables필요한 것 같습니다. 하지만 실마리가 없습니다. 나는를 통해 인바운드 방화벽 규칙을 관리하는 데만 사용됩니다 ufw.

누군가가 몇 가지 예제 규칙으로 시작하여 시스템이 부팅시 이러한 규칙을 채택하도록하는 방법을 알려줄 수 있습니까? SSH 연결에서 나를 잠그지 않는 것이 이상적입니다 ( 물리적 액세스 권한 얻을 있지만 오히려 그렇지는 않습니다).

편집 계정의 모든 아웃 바운드 트래픽을 하나의 인터페이스로 제한 할 수 있으면 클라이언트를 두 명의 사용자로 분할 할 수 있습니다. 더 쉬운 것처럼 보이는 종이에.

답변:


12

별도의 라우팅 테이블과 해당 테이블을 사용하여 표시된 패킷을 라우팅하는 정책을 설정하고 iptables / netfilter가 특정 패킷을 표시하도록합니다.

테이블을 작성하십시오. echo 1 known >> /etc/iproute2/rt_tables

라우팅 규칙을 작성하십시오 ( ip명령은 iproute2 의 명령 임). ip rule add from all fwmark 1 table known

"known"이라는 테이블을 만들고 마크가 1 인 패킷이 "known"테이블에 따라 라우팅된다는 라우팅 규칙을 만들었습니다. 알려진 프로토콜 목록이기 때문에 알려진 것으로 만 불렀습니다. 원하는 이름을 지정할 수 있습니다. 이제 알려진 테이블을 설정하여 올바른 방법으로 라우팅합니다.

ip route add default dev eth0 table known

iptables 규칙을 작성하십시오.

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

이 예제는 NFS 포트 (111, 2049)의 패킷을 1로 표시합니다.이 규칙을 'mangle'iptable에 추가합니다. 이것은 라우팅 테이블과 다르며 변경할 수 없습니다. mangle 테이블은 NAT 이외의 방식으로 패킷을 변경하기위한 것입니다.

이제 다른 인터페이스를 통해 다른 모든 것을 라우팅하기 위해 표준 라우팅 테이블에 경로를 추가합니다.

ip route add default dev eth1

이것을 실제로 이해하려면 LARTC howto 의 섹션 4와 11을 읽으십시오 .


사실 그것은 내가 생각했던 것보다 훨씬 간단합니다. 리눅스 네트워킹 스택은 정말 아름다운 짐승입니까? 나는 이것을 빠른 테스트를 받았고 모든 것이 예상대로 작동하는 것으로 보입니다. 각 인터페이스를 모니터링 iftop하고 있으며 각각 올바른 트래픽을 보여줍니다. 정말 고맙습니다.
Oli

iptables 또는 iproute2가 구성을 저장하는 방법을 모르겠습니다. 부팅 할 때마다이 규칙을 해제해야합니까?
Oli

@Oli 재부팅하면 지워집니다. 당신은 저장과 규칙을 복원 할 수 있습니다 iptables-saveiptables-restore. NetworkManager를 사용하는 경우 디스패처 스크립트를 설정하여 프로세스를 자동화 할 수 있습니다. 불행히도 공식 NM 페이지에는 기능에 대한 설명서가 없지만 UbuntuArch Linux 설명서에 언급되어 있습니다.
Shawn J. Goff

5

" 가장 쉬운 "방법은 단일 프로그램에 특정 인터페이스 (또는 인터페이스의 IP)를 사용하도록 지시하는 것입니다.

ping -I eth1 8.8.8.8

eth1을 소스 인터페이스로 사용하도록 핑 명령

wget --bind-address 10.0.0.1 http://www.google.it/

wget에게 IP 주소 가있는 인터페이스 를 통과 하도록 지시 10.0.0.1합니다.

솔직히 나는 당신이 필요한 모든 프로그램 에서 가능한지 알지 못하지만 작성해야 할 규칙 iptablesiproute프로그램 을 정리하기 시작했습니다 .

처음 에는 여러 인터넷 연결 에서이 자습서 를 읽어야 합니다 . 잘 읽어 보면 , / 및 에 대한 수천 개의 iptables 튜토리얼 중 하나입니다 .outbound filteringprocesspid filteringport filtering


4

이에 대한 올바른 방법은 나가는 패킷에 사용하려는 인터페이스에 bind ()하는 것입니다. 그런 다음 ip routeip rule명령으로 경로를 설정하여 발신 인터페이스를 기반으로 패킷이 라우팅되는 방법을 제어 할 수 있습니다 . 내 예에서는 다음 네트워크를 가정합니다.

  • eth0 :
    • 주소 : 192.168.0.2/24
    • 기본 게이트웨이 : 192.168.0.1
  • eth1 :
    • 주소 : 192.168.1.2/24
    • 기본 게이트웨이 : 192.168.1.1

대체라는 eth0에 대한 트래픽 발신과 main이라고하는 eth1에 대한 하나의 테이블을 생성합니다. 라우팅 테이블 main은 항상 존재하며 routeand ip route명령에 사용되는 일반 테이블입니다 . 대부분의 사람들은 다른 테이블을 다루지 않습니다. alternate라는 테이블을 만들려면 다음 행을 추가합니다 /etc/iproute2/rt_tables.

10    alternate

기본 테이블의 기본 우선 순위는 254입니다. 라우팅 테이블이 적용되는 규칙은 ip rule명령에 의해 제어됩니다 . 기본적으로이 명령은 다음과 같은 기존 규칙 목록을 인쇄합니다.

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

이것은 기본적 local으로 내 자신의 IP 주소와 같은 로컬 경로에 대해 커널이 유지 관리하는 특수 테이블 인 테이블에서 경로를 찾습니다 . 그런 다음 테이블 기본 및 테이블 기본값을 시도합니다. 테이블 기본값은 일반적으로 비어 있으므로 기본 항목과 일치하지 않으면 호스트에 대한 경로가 없습니다. 먼저, 테이블을 eth0 규칙으로 채우십시오.

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

일반적으로 alternate테이블 이 테이블과 유사하게 보이기를 원할 것 main입니다. 라우팅이 달라야 할 때만 차이점이 있습니다. 문자 그대로 모든 NFS, HTTP 등의 트래픽이 eth1의 네트워크로 향하는 경우에도 eth0의 기본 게이트웨이를 통해 전송되도록하려면 위의 두 번째 행을 포함하지 않을 수 있습니다. 다음 단계는이 대체 라우팅 테이블 사용시기에 대한 규칙을 추가하는 것입니다.

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

이 규칙에 따르면 192.168.0 네트워크의 주소에서 들어오는 모든 트래픽 alternate은 일반 main테이블 대신 라우팅 테이블을 사용 합니다. 마지막 단계는 사용해야하는 모든 클라이언트가 eth0이를 바인드해야합니다. wget예를 들어 set을 사용하면 --bind-address=192.168.0.2NFS의 경우clientaddr=192.168.0.2마운트 옵션. Perl과 함께 LibWWW를 사용하는 경우 LWP :: UserAgent에서 localaddr 옵션을 설정하여 바인딩 된 로컬 인터페이스를 제어 할 수 있습니다. 클라이언트가있는 경우 바인딩을 제어 할 수 없으며 컴파일 소스는 옵션이 아니며 iptables 규칙을 사용하여 주소를 수정할 수는 있지만 해킹이 많고 작동하지 않을 수 있습니다. nat 테이블 또는 mangle 테이블의 PREROUTING 체인에 SNAT 규칙을 설정해야합니다. 이 작업을 수행하려면 위에 제공된 수정 된 라우팅 테이블이 여전히 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.