unixmarkwg 发表于 2015-08-09 22:52

TPROY代理失败问题

首先描述我的做法:
1.拓扑图

2.在防火墙上添加策略
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
iptables -t mangle -A PREROUTING -p tcp --dport 110 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 10110

3.在防火墙上启动一个server,代码如下:
int main (int argc, char **argv)
{
      int                     s;
      int                     c;
      short int               port;
      struct sockaddr_in      servaddr;
      struct sockaddr_in      clntaddr;
      int                     n;
      int                     ret;
      struct msghdr         msg;
      char                  cntrlbuf;
      struct iovec            iov;
      char                  *endptr;

      

      if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0)
      {
                fprintf (stderr, "error creating listening socket.\n");
                return -3;
      }

      n=1;
      setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n));
      setsockopt(s, SOL_SOCKET, SO_BROADCAST, &n, sizeof(n));

      /* Enable TPROXY IP preservation */
      n=1;
      ret = setsockopt (s, SOL_IP, IP_TRANSPARENT, &n, sizeof(int));
      if (ret != 0)
      {
                fprintf (stderr, "error setting transparency for listening socket. err (#%d %s)\n", errno, strerror(errno));
                close (s);
                return -4;
      }

      memset (&servaddr, 0, sizeof (servaddr));
      servaddr.sin_family = AF_INET;
      servaddr.sin_addr.s_addr = htonl (INADDR_ANY);
      servaddr.sin_port = htons (10110);


      if (bind (s, (struct sockaddr *) &servaddr, sizeof (servaddr)) < 0)
      {
                fprintf (stderr, "error calling bind()\n");
                return -6;
      }

      listen (s, 1024);

      while (1)
      {
                n=sizeof(clntaddr);
                if ((c = accept (s, (struct sockaddr *)&clntaddr, &n)) < 0)
                {
                        fprintf (stderr, "error calling accept()\n");
                        break;
                }

               。。。。。。。。。。//handle(这个不是重点)
      }

      close (s);

      return 0;
}

4.在192.168.221.95上配置一个foxmail用来收邮件pop3(110),用自己的邮箱就行,比如说123@163.com
5.从外网给123@163.com发邮件
6.启动防火墙的server程序
7.在192.168.221.95上收邮件,但是防火墙的server程序没有收到连接,也就是说透明代理失败,数据包没有转到防火墙本地的10110端口?
8.有哪位大神知道原因?跟我联系qq:3030639229或者跟帖留言

unixmarkwg 发表于 2015-08-10 21:33

中国这么多搞linux的就站出来一位大神,解决一下这个问题吧
页: [1]
查看完整版本: TPROY代理失败问题