Простая программа пересылки IPIP, поддерживающая пакеты UDP, TCP и ICMP. Эта программа использует необработанные сокеты AF_PACKET. Когда клиент отправляет пакет на пересылающую машину с IP-адресом назначения в качестве IP-адреса прослушивания программы и портом выше 1024, он создает пакет IPIP, добавляя внешний заголовок IP, и отправляет его на IP-адрес назначения вместе с выполнением NAT для туннель конечной точки IPIP. Когда программа получает пакеты IPIP, она отправляет их обратно клиенту.
Примечание . На данный момент он отправляет пакеты только в том случае, если порт UDP/TCP превышает 1024. Я знаю, что это неудобно, но я планирую реализовать функцию, которая исключает только определенные порты через файл конфигурации в будущей программе, которую я планирую. сделать. Я публикую код этой программы, чтобы просто показать, как осуществляется пересылка IPIP.
Примечание . При этом используются сокеты AF_PACKET, и ядро копирует пакет в пространство пользователя. Я планирую в будущем рассмотреть возможность использования DPDK, что должно привести к повышению производительности.
Вот использование программы:
./IPIPForward <Listen IP> <Listen Port> <Destination IP> <Nat IP> <Nat Port> <Interface> [<Thread Count>]
Вот пример:
./IPIPForward 10.50.0.3 27015 10.50.0.4 10.2.0.5 27015 ens18 4
Я скомпилировал эту программу, используя GCC 7.
Вот что я использовал для создания программы:
gcc-7 -g IPIPForward.c -g common.c -o IPIPForward -lpthread
Я также включил предупреждения, чтобы ничего не упустить. Однако это основная команда сборки.