00001
00002
00003
00004
00005
00006
00007
00008
#include "wvipfirewall.h"
00009
#include "wvinterface.h"
00010
#include <unistd.h>
00011
00012
00013 bool WvIPFirewall::enable =
false,
WvIPFirewall::ignore_errors =
true;
00014
00015
00016 WvIPFirewall::WvIPFirewall()
00017 {
00018
00019
00020 }
00021
00022
00023 WvIPFirewall::~WvIPFirewall()
00024 {
00025
zap();
00026 }
00027
00028
00029
WvString WvIPFirewall::port_command(
const char *cmd,
const char *proto,
00030
const WvIPPortAddr &addr)
00031 {
00032
WvIPAddr ad(addr), none;
00033
00034
return WvString(
"iptables %s Services -j ACCEPT -p %s "
00035
"%s --dport %s "
00036
"%s",
00037 cmd, proto,
00038 ad == none ?
WvString(
"") :
WvString(
"-d %s", ad),
00039 addr.
port,
00040 shutup());
00041 }
00042
00043
00044
WvString WvIPFirewall::redir_command(
const char *cmd,
const WvIPPortAddr &src,
00045
int dstport)
00046 {
00047
WvIPAddr ad(src), none;
00048
00049
return WvString(
"iptables -t nat %s TProxy "
00050
"-p tcp %s --dport %s "
00051
"-j REDIRECT --to-ports %s "
00052
"%s",
00053 cmd,
00054 ad == none ?
WvString(
"") :
WvString(
"-d %s", ad),
00055 src.
port, dstport,
00056 shutup());
00057 }
00058
00059
00060
WvString WvIPFirewall::proto_command(
const char *cmd,
const char *proto)
00061 {
00062
return WvString(
"iptables %s Services -p %s -j ACCEPT "
00063
"%s",
00064 cmd, proto, shutup());
00065 }
00066
00067
00068 void WvIPFirewall::add_port(
const WvIPPortAddr &addr)
00069 {
00070 addrs.append(
new WvIPPortAddr(addr),
true);
00071
WvString s(port_command(
"-A",
"tcp", addr)),
00072 s2(port_command(
"-A",
"udp", addr));
00073
if (
enable)
00074 {
00075 system(s);
00076 system(s2);
00077 }
00078 }
00079
00080
00081
00082 void WvIPFirewall::del_port(
const WvIPPortAddr &addr)
00083 {
00084 WvIPPortAddrList::Iter i(addrs);
00085
for (i.rewind(); i.next(); )
00086 {
00087
if (*i == addr)
00088 {
00089
WvString s(port_command(
"-D",
"tcp", addr)),
00090 s2(port_command(
"-D",
"udp", addr));
00091
if (
enable)
00092 {
00093 system(s);
00094 system(s2);
00095 }
00096
return;
00097 }
00098 }
00099 }
00100
00101
00102 void WvIPFirewall::add_redir(
const WvIPPortAddr &src,
int dstport)
00103 {
00104 redirs.append(
new Redir(src, dstport),
true);
00105
WvString s(redir_command(
"-A", src, dstport));
00106
if (
enable) system(s);
00107 }
00108
00109
00110 void WvIPFirewall::del_redir(
const WvIPPortAddr &src,
int dstport)
00111 {
00112 RedirList::Iter i(redirs);
00113
for (i.rewind(); i.next(); )
00114 {
00115
if (i->src == src && i->dstport == dstport)
00116 {
00117
WvString s(redir_command(
"-D", src, dstport));
00118
if (
enable) system(s);
00119
return;
00120 }
00121 }
00122 }
00123
00124
00125 void WvIPFirewall::add_proto(
WvStringParm proto)
00126 {
00127 protos.append(
new WvString(proto),
true);
00128
WvString s(proto_command(
"-A", proto));
00129
if (
enable) system(s);
00130 }
00131
00132
00133 void WvIPFirewall::del_proto(
WvStringParm proto)
00134 {
00135 WvStringList::Iter i(protos);
00136
for (i.rewind(); i.next(); )
00137 {
00138
if (*i == proto)
00139 {
00140
WvString s(proto_command(
"-D", proto));
00141
if (
enable) system(s);
00142
return;
00143 }
00144 }
00145 }
00146
00147
00148
00149 void WvIPFirewall::zap()
00150 {
00151 WvIPPortAddrList::Iter i(addrs);
00152
for (i.rewind(); i.next(); )
00153 {
00154
del_port(*i);
00155 i.xunlink();
00156 }
00157
00158 RedirList::Iter i2(redirs);
00159
for (i2.rewind(); i2.next(); )
00160 {
00161
del_redir(i2->src, i2->dstport);
00162 i2.xunlink();
00163 }
00164
00165 WvStringList::Iter i3(protos);
00166
for (i3.rewind(); i3.next(); )
00167 {
00168
del_proto(*i3);
00169 i3.xunlink();
00170 }
00171 }