I try to develop poc code for postfix content filtering. All i need is read
the 10025/tcp and send all data which i can read to 10026/tcp. Below is my
poc code. But i try to send email it doesn't work and postfix show me "451
4.3.0 Error: queue file write error".
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include <fcntl.h>
#define PORT 10025
#define REMOTE_PORT 10026
#define REMOTE_IP "0.0.0.0"
int main(int argc, const char **argv)
{
int addr_len, result, yes = 1;
int server_sock = 0, client_sock = 0, sock_fd = 0;
char buff[1025];
struct sockaddr_in serv_addr, client_addr, remote_addr;
if ((server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
if (setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &yes,
sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
memset(buff, 0x0, sizeof(buff));
memset(&serv_addr, 0x0, sizeof(serv_addr));
memset(&client_addr, 0x0, sizeof(client_addr));
memset(&remote_addr, 0x0, sizeof(remote_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(REMOTE_PORT);
if ((bind(server_sock, (struct sockaddr*)&serv_addr,
sizeof(serv_addr))) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
if (listen(server_sock, 8) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
fcntl(server_sock, F_SETFL, O_NONBLOCK);
fcntl(client_sock, F_SETFL, O_NONBLOCK);
addr_len = sizeof(client_addr);
client_sock = accept(server_sock, (struct sockaddr
*)&client_addr, &addr_len);
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
while(1) {
result = recv(client_sock, buff, sizeof(buff),0 );
inet_pton(AF_INET, REMOTE_IP, &remote_addr.sin_addr);
connect(sock_fd, (struct sockaddr *)&remote_addr,
sizeof(remote_addr));
send(sock_fd, buff, (sizeof(buff)-1), 0);
}
shutdown(client_sock, SHUT_RDWR);
close(server_sock);
close(client_sock);
close(sock_fd);
return 0;
}
And here is my postfix master.cf configuration.
smtp inet n - n - 20 smtpd -o smtpd_proxy_filter=0.0.0.0:10025 -o
smtpd_client_connection_count_limit=10
0.0.0.0:10026 inet n - n - - smtpd -o smtpd_authorized_xforward_hosts=
127.0.0.0/8 -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o
smtpd_sender_restrictions= -o
smtpd_recipient_restrictions=permit_mynetworks,reject -o
smtpd_data_restrictions= -o mynetworks=127.0.0.0/8 -o
receive_override_options=no_unknown_recipient_checks