WvStreams
wvipfirewall.h
00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  *
00005  * WvIPFirewall is an extremely simple hackish class that handles the Linux
00006  * 2.4 "iptables" firewall.  It's okay to create more than one instance
00007  * of this class; they'll co-operate.
00008  * 
00009  * They need you to have created the appropriate firewall tables already,
00010  * however, and call them from the right places in the Input and/or Forward
00011  * firewalls.
00012  */
00013 #ifndef __WVIPFIREWALL_H
00014 #define __WVIPFIREWALL_H
00015 
00016 #include "wvinterface.h"
00017 #include "wvstringlist.h"
00018 #include "wvaddr.h"
00019 
00020 
00021 DeclareWvList(WvIPPortAddr);
00022 class IWvIPFirewall
00023 {
00024 public:
00025     virtual ~IWvIPFirewall() { }
00026     virtual void zap() = 0;
00027     virtual void add_port(const WvIPPortAddr &addr) = 0;
00028     virtual void add_redir(const WvIPPortAddr &src, int dstport) = 0;
00029     virtual void add_redir_all(int dstport) = 0;
00030     virtual void add_redir_port_range(const WvIPPortAddr &src_min,
00031             const WvIPPortAddr &src_max, int dstport) = 0;
00032     virtual void add_proto(WvStringParm proto) = 0;
00033     virtual void add_forward(const WvIPPortAddr &src, const WvIPPortAddr &dst,
00034             bool snat) = 0;
00035     
00036     virtual void del_port(const WvIPPortAddr &addr) = 0;
00037     virtual void del_redir(const WvIPPortAddr &src, int dstport) = 0;
00038     virtual void del_redir_all(int dstport) = 0;
00039     virtual void del_redir_port_range(const WvIPPortAddr &src_min,
00040             const WvIPPortAddr &src_max, int dstport) = 0;
00041     virtual void del_proto(WvStringParm proto) = 0;
00042     virtual void del_forward(const WvIPPortAddr &src, const WvIPPortAddr &dst,
00043             bool snat) = 0;
00044 };
00045 
00047 class WvIPFirewall : public IWvIPFirewall
00048 {
00049     class FFwd
00050     {
00051     public:
00052         WvIPPortAddr src;
00053         WvIPPortAddr dst;
00054         bool snat;
00055 
00056         FFwd(const WvIPPortAddr &_src, const WvIPPortAddr &_dst, bool _snat) : src(_src), dst(_dst) 
00057             { snat = _snat; } 
00058     };
00059     
00060     class Redir
00061     {
00062     public:
00063         WvIPPortAddr src;
00064         int dstport;
00065         
00066         Redir(const WvIPPortAddr &_src, int _dstport) : src(_src)
00067             { dstport = _dstport; }
00068     };
00069 
00070     class RedirAll
00071     {
00072     public:
00073         int dstport;
00074         
00075         RedirAll(int _dstport) 
00076             { dstport = _dstport; }
00077     };
00078 
00079     class RedirPortRange
00080     {
00081     public:
00082         WvIPPortAddr src_min;
00083         WvIPPortAddr src_max;
00084         int dstport;
00085         
00086         RedirPortRange(const WvIPPortAddr &_src_min,
00087                 const WvIPPortAddr &_src_max, int _dstport)
00088             : src_min(_src_min), src_max(_src_max)
00089             { dstport = _dstport; }
00090     };
00091 
00092     DeclareWvList(FFwd);
00093     DeclareWvList(Redir);
00094     DeclareWvList(RedirAll);
00095     DeclareWvList(RedirPortRange);
00096 
00097     FFwdList ffwds;
00098     RedirList redirs;
00099     RedirAllList redir_alls;
00100     RedirPortRangeList redir_port_ranges;
00101 
00102     WvIPPortAddrList addrs;
00103     WvStringList protos;
00104     
00105     WvString port_command(const char *cmd, const char *proto,
00106                           const WvIPPortAddr &addr);
00107     WvString redir_command(const char *cmd,
00108                            const WvIPPortAddr &src, int dstport);
00109     WvString redir_port_range_command(const char *cmd,
00110         const WvIPPortAddr &src_min, const WvIPPortAddr &src_max, int dstport);
00111     WvString redir_all_command(const char *cmd, int dstport);
00112     WvString proto_command(const char *cmd, const char *proto);
00113     WvString forward_command(const char *cmd, const char *proto,
00114                              const WvIPPortAddr &src,
00115                              const WvIPPortAddr &dst, bool snat);
00116     WvLog log;
00117     const char *shutup() const
00118         { return ignore_errors ? " >/dev/null 2>/dev/null " : ""; }
00119     
00120 public:
00121     WvIPFirewall();
00122     virtual ~WvIPFirewall();
00123     
00124     static bool enable, ignore_errors;
00125     
00126     virtual void zap();
00127     virtual void add_port(const WvIPPortAddr &addr);
00128     virtual void add_redir(const WvIPPortAddr &src, int dstport);
00129     virtual void add_redir_all(int dstport);
00130     virtual void add_redir_port_range(const WvIPPortAddr &src_min,
00131             const WvIPPortAddr &src_max, int dstport);
00132     virtual void add_proto(WvStringParm proto);
00133     virtual void add_forward(const WvIPPortAddr &src, const WvIPPortAddr &dst,
00134             bool snat);
00135     virtual void del_proto(WvStringParm proto);
00136     virtual void del_port(const WvIPPortAddr &addr);
00137     virtual void del_redir(const WvIPPortAddr &src, int dstport);
00138     virtual void del_forward(const WvIPPortAddr &src, const WvIPPortAddr &dst,
00139             bool snat);
00140     virtual void del_redir_all(int dstport);
00141     virtual void del_redir_port_range(const WvIPPortAddr &src_min,
00142             const WvIPPortAddr &src_max, int dstport);
00143 };
00144 
00145 #endif // __WVIPFIREWALL_H