매우 이상한 문제가 있습니다. 두 개의 네트워크 인터페이스가 있는 서버가 있습니다 eth0
. eth1
각 인터페이스는 서로 다른 네트워크에 연결되어 있습니다. 모든 네트워크에는 인터넷 게이트웨이가 있습니다. 다양한 서버가 있습니다나라를 떠나연결: http(웹사이트를 스크랩하기 위한 서버의 일부 스크립트), nfs 클라이언트, 삼바 클라이언트, dns 클라이언트 및 이메일 getter 등이 있습니다.
자세히 설명하지 않기 때문에 아웃바운드 http, nfs, samba 및 dns 트래픽만 요청하고 eth0
다른 모든 트래픽은 통과하도록 이러한 아웃바운드 클라이언트를 분할해야 합니다 eth1
.
Google 검색을 몇 개 읽었는데 그것이 iptables
나에게 필요한 것 같지만 실제로는 단서가 없습니다. 저는 인바운드 방화벽 규칙 관리에만 익숙합니다 ufw
.
누군가 몇 가지 예제 규칙으로 시작하여 시스템이 시작 시 이러한 규칙을 채택하도록 하는 방법을 말해 줄 수 있습니까? 이상적으로는 SSH 연결을 잠그지 않고(I할 수 있는물리적으로 접근할 수 있지만 원하지 않음).
편집하다하나의 계정에서 하나의 인터페이스로 모든 아웃바운드 트래픽을 제한할 수 있다면 클라이언트를 두 명의 사용자로 나눌 수 있습니다. 종이에서는 더 쉬워 보일 수도 있습니다.
답변1
별도의 라우팅 테이블과 해당 테이블을 사용하여 태그가 지정된 패킷을 라우팅하고 iptables/netfilter가 특정 패킷을 표시하도록 하는 정책을 설정했습니다.
테이블을 생성합니다:
echo 1 known >> /etc/iproute2/rt_tables
라우팅 규칙 생성( ip
다음 명령IP 경로 2):
ip rule add from all fwmark 1 table known
"알려진"이라는 테이블을 만들고 태그가 1인 모든 패킷이 "알려진" 테이블에 따라 라우팅된다는 라우팅 규칙을 만듭니다. 알려진 프로토콜 목록을 위한 것이기 때문에 알려진 이름이라고 부릅니다. 원하는 대로 이름을 지정할 수 있습니다. 이제 올바른 방식으로 라우팅되도록 알려진 테이블을 설정했습니다.
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에 추가합니다. 이는 라우팅 테이블과 다르며 변경할 수 없습니다. 맹글 테이블은 NAT 이외의 방법으로 패킷을 변경하도록 설계되었습니다.
이제 다른 인터페이스를 통해 다른 모든 것을 라우팅하기 위해 표준 라우팅 테이블에 경로를 추가합니다.
ip route add default dev eth1
이를 제대로 이해하려면 섹션 4와 섹션 11을 읽어보세요.LARTC 운영 가이드.
답변2
음,"가장 단순한"단일 프로그램에 특정 인터페이스(또는 해당 인터페이스의 IP)를 사용하도록 지시하는 방법이 있어야 합니다. 예를 들면 다음과 같습니다.
ping -I eth1 8.8.8.8
eth1을 소스 인터페이스로 사용하도록 ping에 지시하고,
wget --bind-address 10.0.0.1 http://www.google.it/
wget에게 다음을 지시하세요.경험10.0.0.1
IP 주소가 있는 인터페이스입니다.
솔직히 가능할지 모르겠네요모두절차가 필요하지만 작성해야 할 규칙 iptables
과 절차를 줄이는 것의 시작입니다 .iproute
시작하려면 다음 내용을 읽어야 합니다.이 튜토리얼존재하다여러 인터넷 연결. 잘 읽는 것도 그중 하나다수천iptables, 특히 outbound filtering
/ 및 에 대한 자습서 process
입니다 .pid filtering
port filtering
답변3
올바른 방법은 나가는 패킷에 사용하려는 인터페이스에 바인딩()하는 것입니다. 그런 다음 ip route
및 명령을 사용하여 라우팅을 설정하여 ip rule
나가는 인터페이스에 따라 패킷이 라우팅되는 방식을 제어 할 수 있습니다. 내 예에서는 다음 네트워크를 가정하겠습니다.
- eth0:
- 주소: 192.168.0.2/24
- 기본 게이트웨이: 192.168.0.1
- 이더넷 1:
- 주소: 192.168.1.2/24
- 기본 게이트웨이: 192.168.1.1
두 개의 라우팅 테이블을 생성하겠습니다. 하나는 "alternate"라는 eth0에서 나가는 트래픽용이고 다른 하나는 "main"이라는 eth1용 테이블입니다. 라우팅 테이블 main은 항상 존재하며 route
명령에 사용되는 일반 테이블 입니다 ip route
. 대부분의 사람들은 다른 테이블을 다루지 않습니다. 대체라는 테이블을 생성하려면 다음 줄을 추가합니다 /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 주소)에 대해 커널이 관리하는 특수 테이블인 table 에서 경로를 조회한다는 의미입니다 . 그런 다음 테이블 마스터와 테이블 기본값을 시도합니다. 테이블 기본값은 일반적으로 비어 있으므로 기본에 일치하는 항목이 없으면 호스트에 대한 경로가 없습니다. 먼저 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 등의 트래픽이 eth0의 기본 게이트웨이를 통과하도록 하려는 경우 대상이 eth1의 네트워크일지라도 위의 두 번째 줄을 포함하고 싶지 않을 것입니다. 다음 단계는 이 대체 라우팅 테이블을 사용할 시기에 대한 규칙을 추가하는 것입니다.
sudo ip rule add from 192.168.0.0/24 pref 10 table alternate
이 규칙은 192.168.0 네트워크의 주소에서 들어오는 모든 트래픽이 alternate
일반 테이블 대신 라우팅 테이블을 사용함을 의미합니다 main
. 마지막 단계는 모든 eth0
클라이언트가 바인딩을 사용해야 하는지 확인하는 것입니다. wget
예를 들어 --bind-address=192.168.0.2
NFS에 대한 clientaddr=192.168.0.2
마운트 옵션을 설정하려면 set을 사용합니다. Perl과 함께 LibWWW를 사용하는 경우 LWP::UserAgent에서 localaddr 옵션을 설정하여 바인딩할 로컬 인터페이스를 제어할 수 있습니다. 소스 바인딩 및 컴파일을 제어할 수 없는 클라이언트가 있는 경우 iptables 규칙을 사용하여 해당 주소를 수정할 수 있지만 이는 해킹에 가깝고 작동하지 않을 수 있습니다. nat 테이블이나 mangle 테이블의 PREROUTING 체인에서 SNAT 규칙을 설정해야 합니다. 작동하려면 위에 제공된 수정된 라우팅 테이블이 여전히 필요합니다.