Ce que je veux implémenter ressemble à ce qui suit.
192.168.1.1 192.168.1.2
+--------+ +----------+ +-----------+ +---------+ +---------+
| APP0 +<---->+ tap0 +<------->+ myapp +<--------->+ tap1 +<----->+ APP1 |
+--------+ +----------+ +-----------+ +---------+ +---------+
- Lancer
myapp
, qui créera deux périphériques tap,tap0
ettap1
.myapp
transmettra les paquets entre ces deux périphériques tap. APP0
etAPP1
communiqueront avec l'API de socket tcp standard.- Toutes ces applications et périphériques tap se trouvent dans un seul système Linux (Centos7.5).
Mais après avoir créé deux périphériques tap, ping -I tap0 192.168.1.2
n'a pas réussi.
Je trouve d'abord qu'il y a un problème d'ARP, et je les résous en définissant les fichiers accept_local
et rp_filter
.
echo 1 > /proc/sys/net/ipv4/conf/tap0/accept_local
echo 1 > /proc/sys/net/ipv4/conf/tap1/accept_local
echo 2 > /proc/sys/net/ipv4/conf/tap0/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/tap1/rp_filter;
Avec l'outil tcpdump
, j'ai constaté que la requête ICMP arrivait à tap1
, mais la réponse ICMP de tap1
allait au périphérique lo
. Linux routera tout le trafic local à travers le périphérique lo
.
Comment puis-je faire en sorte que le trafic local évite le périphérique lo
et arrive aux périphériques tap ?
J'ai fait des recherches et trouvé quelques solutions qui nécessitent une configuration de la politique NAT. Je pense qu'elles sont compliquées.