This repository was archived by the owner on Jul 9, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathIPSet.java
More file actions
197 lines (147 loc) · 5.6 KB
/
Copy pathIPSet.java
File metadata and controls
197 lines (147 loc) · 5.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package profile;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Vector;
import core.StringUtils;
import core.iface.IUnit;
import core.model.AModel;
import core.model.DeviceModel;
import core.model.NetworkModel;
import core.model.ServerModel;
import core.unit.SimpleUnit;
import core.unit.fs.DirUnit;
import core.unit.fs.FilePermsUnit;
import core.unit.fs.FileUnit;
import core.unit.pkg.InstalledUnit;
public class IPSet extends AModel {
private HashMap<String, Vector<InetAddress>> ipsets;
private HashMap<String, Integer> cidrs;
public IPSet(NetworkModel networkModel) {
super("ipset", networkModel);
ipsets = new HashMap<String, Vector<InetAddress>>();
cidrs = new HashMap<String, Integer>();
}
public void init() {
//Add users
for (DeviceModel user : networkModel.getUserDevices()) {
addToSet("user", 32, user.getAddresses());
}
//Add external-only devices
for (DeviceModel device : networkModel.getExternalOnlyDevices()) {
addToSet("externalonly", 32, device.getAddresses());
}
//Add internal-only devices
for (DeviceModel device : networkModel.getInternalOnlyDevices()) {
addToSet("internalonly", 32, device.getAddresses());
}
//Add admins for each server
for (ServerModel server : networkModel.getAllServers()) {
String[] admins = networkModel.getData().getAdmins(server.getLabel());
for (String admin : admins) {
addToSet(server.getLabel() + "_admins", 32, networkModel.getDeviceModel(admin).getAddresses());
}
}
//Managed devicen need admins, too
for (DeviceModel device : networkModel.getAllDevices()) {
if (!device.isManaged()) { continue; }
String[] admins = networkModel.getData().getAdmins(device.getLabel());
for (String admin : admins) {
addToSet(device.getLabel() + "_admins", 32, networkModel.getDeviceModel(admin).getAddresses());
}
}
//Now add all our servers
for (ServerModel server : networkModel.getAllServers()) {
addToSet("servers", 32, server.getAddresses());
}
if (networkModel.getData().getAutoGuest()) {
addToSet("autoguest", 22, networkModel.stringToIP("10.250.0.0"));
}
}
private Vector<IUnit> getInstalled() {
Vector<IUnit> units = new Vector<IUnit>();
units.addElement(new InstalledUnit("ipset", "proceed", "ipset", "I was unable to install your firewall. This is bad."));
return units;
}
private Vector<IUnit> getPersistentConfig() {
Vector<IUnit> units = new Vector<IUnit>();
return units;
}
public Vector<IUnit> getLiveConfig() {
Vector<IUnit> units = new Vector<IUnit>();
units.addElement(new DirUnit("ipsets_dir", "ipset_installed",
"/etc/ipsets",
"Couldn't create the directory for your ipsets. Your firewall will not work, and you will get all sorts of errors."
+ " Please try rebooting the machine and re-running this configuration."));
for (String set : ipsets.keySet()) {
units.addAll(getSet(set));
}
String ipsetsConfSh = "";
ipsetsConfSh += "#!/bin/bash\n";
ipsetsConfSh += "cd /etc/ipsets/\n";
ipsetsConfSh += "{\n";
for (String set : ipsets.keySet()) {
ipsetsConfSh += " cat ipset." + set + ".conf | awk /./;\n";
}
ipsetsConfSh += "}";
units.addElement(new FileUnit("ipsets_conf_shell_script", "ipsets_dir_created", ipsetsConfSh, "/etc/ipsets/ipsets.up.sh"));
units.addElement(new FilePermsUnit("ipsets_conf_shell_script", "ipsets_conf_shell_script", "/etc/ipsets/ipsets.up.sh", "750"));
units.addElement(new SimpleUnit("ipset_applied", "ipsets_conf_shell_script_chmoded",
"", //This is a forced ipset update.
"sudo /etc/ipsets/ipsets.up.sh | sudo ipset -! restore", "", "pass"));
return units;
}
private Vector<IUnit> getSet(String set) {
Vector<IUnit> units = new Vector<IUnit>();
Vector<InetAddress> addresses = ipsets.get(set);
String conf = "";
conf += "create " + set + " hash:net family inet hashsize 1024 maxelem 65536";
for (InetAddress address : addresses) {
if (address == null) {
continue;
}
else if (address.getHostAddress().equals("255.255.255.255")) {
conf += "\nadd " + set + " 255.255.255.255";
break; //We've hit wildcard, zero point in continuing!
}
conf += "\nadd " + set + " " + address.getHostAddress() + "/" + this.cidrs.get(set);
}
units.addElement(new FileUnit("ipset_" + set, "ipsets_dir_created", conf, "/etc/ipsets/ipset." + set + ".conf"));
return units;
}
void addToSet(String set, Integer cidr, Vector<InetAddress> addresses) {
for (InetAddress address : addresses) {
addToSet(set, cidr, address);
}
}
void addToSet(String set, Integer cidr, InetAddress address) {
set = StringUtils.stringToAlphaNumeric(set, "_");
Vector<InetAddress> extant = ipsets.get(set);
Vector<InetAddress> addresses = new Vector<InetAddress>();
if (extant != null) {
addresses.addAll(extant);
}
addresses.add(address);
addresses = new Vector<InetAddress>(new LinkedHashSet<InetAddress>(addresses)); //enforce uniqueness
this.ipsets.put(set, addresses);
this.cidrs.put(set, cidr);
}
public Vector<IUnit> getUnits() {
Vector<IUnit> units = new Vector<IUnit>();
units.addAll(this.getInstalled());
units.addAll(this.getLiveConfig());
units.addAll(this.getPersistentConfig());
return units;
}
//ipsets will only allow a set name which is <= 30 chars
public String getSetName(String name) {
name = StringUtils.stringToAlphaNumeric(name.toLowerCase(), "_");
if (name.length() > 25) {
name = name.substring(0, 25);
}
return name;
}
public boolean isEmpty(String set) {
return ( this.ipsets.containsKey(set) && this.ipsets.get(set).isEmpty() );
}
}