모든 트래픽이 인터페이스를 통과하길 원합니다 TUN
.
따라서 보시다시피 트래픽은 모든 프로그램의 주소 TUN
에 있는 iface 로 라우팅됩니다. 10.0.0.1
그런 다음 에 첨부된 프로그램이 TUN
패킷에 대해 작업을 수행한 다음 에 있는 내 라우터로 전송됩니다 192.168.1.1
. 그런 다음 인터넷을 통해 라우팅됩니다(예를 들어 내 프록시 서버로 라우팅되지만 실제로 내 문제에는 그다지 중요하지 않습니다).
그래서 내 목표는 다음과 같은 방식으로 트래픽을 라우팅하는 것입니다. $any_program
<--> tunX
<--> 192.168.1.1 (the router)
( <-->
트래픽이 들어오고 나가는 것을 의미합니다).
지금까지 내가 한 일:
- 먼저
tunX
다음 기능을 사용하여 장치를 초기화했습니다.
int tun_open(char *device)
{
struct ifreq ifr;
int fd, err;
fd = open("/dev/net/tun", O_RDWR);
if (fd == -1)
{
perror("opening /dev/net/tun");
exit(1);
}
memset(&ifr, 0, sizeof (ifr));
ifr.ifr_flags = IFF_TUN;
strncpy(ifr.ifr_ifrn.ifrn_name, device, IFNAMSIZ);
err = ioctl(fd, TUNSETIFF, (void *) &ifr);
if (err == -1)
{
perror("ioctl TUNSETIFF");
close(fd);
exit(1);
}
return fd;
}
그런 다음:
tunfd = tun_open("tun6");
또한 다음을 활성화했습니다 TUNSETPERSIST
.
ioctl(tunfd, TUNSETPERSIST, 1) < 0);
- 그런 다음 다음 명령을 사용하여 장치를 설정했습니다.
$ sudo ip addr add 10.0.0.1/24 dev tun6
$ sudo ip link set tun6 up
프로그램은 tunfd
내용을 읽고 출력합니다. 지금까지 읽은 유일한 내용은 다음과 같습니다.
:B\{k
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 1
ST: urn:dial-multiscreen-org:service:dial:1
USER-AGENT: Google Chrome/86.0.4240.198 Linux
% N%*.%K%M%P%M%M%M%HP%,%M%*K%(aP%>O%M%LqP%@K%`P%P%Ҵ u@=U繤湤}=UoK%0=U
SSDP:발견? 이것이 내 tun 인터페이스를 통과하는 이유는 무엇입니까?
출력 route -n
:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 600 0 0 wlp2s0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun6
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp2s0
192.168.1.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp2s0
iptables
나는 여러 가지 프로그램을 가지고 놀았 ip route
지만 이 모든 것에는 초보자입니다. 내가 이해하는 한, iptables
실제로 패킷을 라우팅하는 것이 아니라 필터링합니다(매우 틀릴 수 있음). 그렇다면 패킷을 라우팅하는 방법이 있습니까 ip route
?
답변1
일반 라우팅은 인터페이스가 아닌 대상을 기반으로 하므로(정책 기반 라우팅을 구성하지 않는 한) 모든 아웃바운드 트래픽을 네트워크로 라우팅해야 합니다 10.0.0.0/24
.
ip route del default
ip route add default via 10.0.0.254
실제로 어떤 주소를 통해 보내는지는 중요하지 않습니다. 10.0.0.0/24
프로그램에 도달해야 합니다.