세션이 시작된 네트워크 인터페이스로 모든 TCP 트래픽을 제한하는 방법은 무엇입니까?

세션이 시작된 네트워크 인터페이스로 모든 TCP 트래픽을 제한하는 방법은 무엇입니까?

동일한 서브넷으로 구성된 두 개의 네트워크 인터페이스(lan0, wlan0)가 있는 임베디드 Linux 시스템이 있습니다. 이 시스템의 서버는 두 인터페이스 모두에서 TCP 연결을 허용합니다.

세션에 대한 모든 응답이 요청이 수신된 동일한 인터페이스에서 전송되도록 어떻게 보장할 수 있습니까? 즉, TCP 세션의 모든 트래픽을 어떻게 특정 네트워크 인터페이스로 제한할 수 있습니까?

Listen() 소켓과 승인된 소켓은 setockopt(fd, BIND_TO_DEVICE)를 사용하여 인터페이스/장치에 바인딩될 수 있습니다. 서버는 두 인터페이스 모두에 대해 이 작업을 수행합니다. 이는 세션이 생성된 인터페이스를 감지하고 동일한 인터페이스로의 아웃바운드 트래픽을 제한하는 데 도움이 됩니다.

그러나 accept()가 발생하면 SYN-ACK가 클라이언트로 다시 전송되고 ARP 조회로 인해 이 초기 패킷이 다른(잘못된) 인터페이스를 통해 전송될 수 있다는 문제가 있는 것 같습니다. arp는 다른/"잘못된" 인터페이스에서도 클라이언트의 IP 주소를 찾을 수 있습니다. 왜냐하면 클라이언트도 거기에 표시되기 때문입니다.

답변1

iptables를 사용하여 인터페이스에 대한 TCP 연결을 제한할 수 있습니다.

#iptables -A INPUT -p tcp -i eth0 --syn -m limit --limit 1/s --limit-burst 3 -j RETURN

--limit 1/s: Maximum average matching rate in seconds
--limit-burst 3: Maximum initial number of packets to match

관련 정보