]> git.llucax.com Git - personal/website.git/blob - source/blog/posts/2012/11/25-securitykiss---dante----bye-bye-censorship.rst
Move eventxx submodule to the repo subdir
[personal/website.git] / source / blog / posts / 2012 / 11 / 25-securitykiss---dante----bye-bye-censorship.rst
1 Title: SecurityKiss + Dante == bye bye censorship
2 Tags: en, securitykiss, dante, danted, dante-server, foxyproxy, gema, censorship, socks, proxy, germany
3
4 I live in Germany, and unfortunately there is something in Germany called
5 GEMA_, which basically censor any content that "might have copyrighted
6 music".
7
8 Among the sites being censored are Grooveshark_ (completely banned) and
9 YouTube_ (only banned if the video **might** have copyrighted music according
10 to some algorithm made by Google_). Basically this is because GEMA_ want these
11 company to pay royalties for each time some copyrighted song get streamed).
12 AFAIK Grooveshark_ don't want to pay at all, and Google want to pay a fixed fee
13 (which is what it does in every other country), because it makes no sense to do
14 otherwise, since anyone can just endlessly get a song streamed over and over
15 again just to be paid.
16
17 Even when the model is debatable, there is a key aspect and why I call this
18 censorship: **not all the banned content is copyrighted or protected by GEMA**.
19
20 * In Grooveshark_ there are plenty of bands that release their music using more
21   friendly license, like CC__.
22 * There are **official videos** posted in YouTube_ by the bands themselves and
23   embedded in the band **official website** that is banned by GEMA_.
24 * There are videos in YouTube_ that doesn't have copyrighted music at all, but
25   they have to cover their asses and ban everything suspicious just in case.
26 * The personal videos that do have copyrighted music get banned completely, not
27   only muted.
28
29 __ https://creativecommons.org/
30
31 These are just the examples that pop on my mind now.
32
33 There are plenty of ways to bypass this censorship and they are the only way to
34 access legal content in Germany that gets unfairly banned, not only harming the
35 consumers, but also the artists, because most of the time having their music
36 exposed in YouTube_ only spreads the word and do more good than harm.
37
38 HideMyAss__ is a popular choice for a web proxy. But I like SecurityKiss_,
39 a free VPN (up to 300MB per day), because it gives a more comprehensive
40 solution.
41
42 __ https://hidemyass.com/proxy/
43
44 But here comes the **technical chalenge**! :) I don't want to route all my
45 traffic through the VPN, or to have to turn the VPN on and off again each time
46 I want to see the censored content. What I want is to see some websites through
47 the VPN. A challenge that proved to be harder than I initially thought and why
48 I'm posting it here.
49
50 So the final setup I got working is:
51
52 * OpenVPN_ to use SecurityKiss_ free VPN service.
53 * Dante_ Socks Server to route any application capable of using a socks server
54   through the VPN.
55 * FoxyProxy_ Firefox_ extension to selectively route YouTube_ and Grooveshark_
56   through the Socks proxy.
57
58 And here is how I did it (in Ubuntu_ 12.10):
59
60
61 OpenVPN_ server
62 ---------------
63
64 Install the package::
65
66    sudo apt-get install openvpn
67
68 Get the configuration bundle generated for you account in the control panel and
69 then create a ``/etc/openvpn/sk.conf`` file with this content::
70
71    client
72    dev tunsk
73    proto udp
74
75    # VPN server IP : PORT
76    # (pick the server you want from the README file in the bundle)
77    remote 178.238.142.243 123
78    nobind
79
80    ca   /etc/ssl/private/openvpn-sk/ca.crt
81    cert /etc/ssl/private/openvpn-sk/client.crt
82    key  /etc/ssl/private/openvpn-sk/client.key
83
84    comp-lzo yes
85    persist-key
86    persist-tun
87
88    user openvpn
89    group nogroup
90
91    auth-nocache
92    script-security 2
93
94    route-noexec
95    route-up "/etc/openvpn/sk.setup.sh up"
96
97    down "/usr/bin/sudo /etc/openvpn/sk.setup.sh down"
98
99 Install the certificate and key files from the bundle in
100 ``/etc/ssl/private/openvpn-sk/`` with the names specified in the ``sk.conf``
101 file.
102
103 Create the tun device::
104
105    mknod /dev/net/tunsk c 10 200
106
107 Start the VPN at system start (optional)::
108
109    echo 'AUTOSTART="sk"' >> /etc/default/openvpn
110
111 Add the openvpn system user::
112
113    adduser --system --home /etc/openvpn openvpn
114
115 Now we need to route some specific traffic only through the VPN. I choose to
116 discriminate traffic by the uid/gid of the application that generated it. So
117 with the ``route-up`` and ``down`` script we will do all the special routing.
118 I also want my default route table to be untouched, that's why I used
119 ``route-noexec``. Here is how the ``/etc/openvpn/sk.setup.sh`` script looks for
120 me::
121
122    #!/bin/sh
123    # Based on:
124    # http://serverfault.com/questions/345111/iptables-target-to-route-packet-to-specific-interface
125
126    #exec >> /tmp/log
127    #exec 2>> /tmp/log.err
128    #set -x
129
130    # Config
131    uid=skvpn
132    gid=skvpn
133    mark=100
134    table=$mark
135    priv_dev=br-priv
136
137    env_file="/var/run/openvpn.sk.env"
138    umark_rule="OUTPUT -t mangle -m owner --uid-owner $uid -j MARK --set-mark $mark"
139    gmark_rule="OUTPUT -t mangle -m owner --gid-owner $gid -j MARK --set-mark $mark"
140    masq_rule="POSTROUTING -t nat -o $dev -j SNAT --to-source $ifconfig_local"
141
142    up()
143    {
144            # Save environment
145            env > $env_file
146
147            # Route all traffic marked with $mark through route table $table
148            ip rule add fwmark $mark table $table
149
150            # Make all traffic go through the VPN gateway in route table $table
151            ip route add table $table default via $route_vpn_gateway dev $dev
152
153            # Except for the internal traffic
154            ip route | grep "dev $priv_dev" | \
155                            xargs -n1 -d'\n' echo ip route add table $table | sh
156
157            # Flush route tables cache
158            ip route flush cache
159
160            # Mark packets originated by processes with owner $uid/$gid with $mark
161            iptables -A $umark_rule
162            iptables -A $gmark_rule
163
164            # Prevent the packets sent over $dev getting the LAN addr as source IP
165            iptables -A $masq_rule
166
167            # Relax the reverse path source validation
168            sysctl -w "net.ipv4.conf.$dev.rp_filter=2"
169    }
170
171    down()
172    {
173            # Restore and remove environment
174            . $env_file
175            rm $env_file
176
177            # Since the device is already removed, there is no need to clean
178            # anything that was referencing the device because it was already
179            # removed by the kernel.
180
181            # Delete iptable rules
182            iptables -D $umark_rule
183            iptables -D $gmark_rule
184
185            # Delete route table and rules for lookup
186            ip rule del fwmark $mark table $table
187
188            # Flush route tables cache
189            ip route flush cache
190    }
191
192    if test "$1" = "up"
193    then
194            up
195    elif test "$1" = "down"
196    then
197            down
198    else
199            echo "Usage: $0 (up|down)" >&2
200            exit 1
201    fi
202
203 I hope this is clear enough. Finally we need to add the skvpn user/group (for
204 which all the traffic will be routed via the VPN) and let the openvpn user run
205 the setup script::
206
207    sudo adduser --system --home /etc/openvpn --group skvpn
208    sudo visudo
209
210 In the editor, add this line::
211
212    openvpn ALL=(ALL:ALL) NOPASSWD: /etc/openvpn/sk.setup.sh
213
214 Now if you do::
215
216    sudo service openvpn start
217
218 You should get a working VPN that is only used for processes that runs using the
219 user/group skvpn. You can try it with::
220
221    sudo -u skvpn wget -qO- http://www.securitykiss.com | grep YOUR.IP
222
223 Besides some HTML, you should see the VPN IP there instead of your own (you can
224 check your own by running the same without ``sudo -u skvpn``).
225
226
227 Dante_ Socks Server
228 -------------------
229
230 This should be pretty easy to configure, if it weren't for Ubuntu_ coming with
231 an ancient (1.x when there is a 1.4 beta already) BROKEN__ package. So to make
232 it work you have to compile it yourself. The easiest way is to get a `sightly
233 more updated package`__ from Debian *experimental*. Here is the quick recipe to
234 build the package, if you want to learn more about the details behind this,
235 there is always Google_::
236
237    cd /tmp
238    for suffix in .orig.tar.gz -3.dsc -3.debian.tar.bz2
239    do
240       wget http://ftp.de.debian.org/debian/pool/main/d/dante/dante_1.2.2+dfsg$suffix
241    done
242    sudo apt-get build-dep dante-server
243    dpkg-source -x dante_1.2.2+dfsg-3.dsc
244    cd dante_1.2.2+dfsg
245    dpkg-buildpackage -rfakeroot
246    cd ..
247    dpkg -i /tmp/dante-server_1.2.2+dfsg-3_amd64.deb
248
249 __ https://bugs.launchpad.net/ubuntu/+source/dante/+bug/816153
250 __ http://packages.debian.org/experimental/dante-server
251
252 Now you can configure Dante_, this is my configuration file as an example, it
253 just allow unauthenticated access to all clients in the private network::
254
255    logoutput: syslog
256
257    internal: 10.1.1.1 port = 1080
258    external: tunsk
259
260    clientmethod: none
261    method: none
262
263    user.privileged: skvpn
264    user.unprivileged: skvpn
265    user.libwrap: skvpn
266
267    client pass {
268            from: 10.1.1.0/24 port 1-65535 to: 0.0.0.0/0
269            log: error # connect disconnect
270    }
271    client pass {
272            from: 10.1.1.0/24 port 1-65535 to: 0.0.0.0/0
273    }
274
275    #generic pass statement - bind/outgoing traffic
276    pass {
277            from: 0.0.0.0/0 to: 0.0.0.0/0
278            command: bind connect udpassociate
279            log: error # connect disconnect iooperation
280    }
281    #generic pass statement for incoming connections/packets
282    pass {
283            from: 0.0.0.0/0 to: 0.0.0.0/0
284            command: bindreply udpreply
285            log: error # connect disconnect iooperation
286    }
287
288 I hope you get the idea...
289
290 Now just start dante::
291
292    sudo service danted start
293
294 And now you have a socks proxy that output all his traffic through the VPN while
295 any other network traffic goes through the normal channels!
296
297
298 FoxyProxy_ Addon
299 ----------------
300
301 Setting up FoxyProxy_ should be trivial at this point (just create a new proxy
302 server pointing to dante and set it as SOCKS v5), but just as a pointer, here
303 are some example rules (set them as *Whitelist* and *Regular Expression*)::
304
305    ^https?://(.*\.)?youtube\.com/.*$
306    ^https?://(.*\.)?grooveshark\.com/.*$
307
308
309 .. _Dante: http://www.inet.no/dante/
310 .. _Firefox: https://www.mozilla.org/firefox
311 .. _FoxyProxy: http://getfoxyproxy.org/
312 .. _GEMA: https://en.wikipedia.org/wiki/Gesellschaft_f%C3%BCr_musikalische_Auff%C3%BChrungs-_und_mechanische_Vervielf%C3%A4ltigungsrechte
313 .. _Grooveshark: http://grooveshark.com/
314 .. _OpenVPN: http://openvpn.net/
315 .. _SecurityKiss: http://www.securitykiss.com/
316 .. _Ubuntu: http://www.ubuntu.com/
317 .. _YouTube: https://www.youtube.com/
318 .. _Google: https://www.google.com/
319
320
321 .. vim: set et sw=3 sts=3 tw=80 fo+=lt1n: