Entries filed under Networking

One Click Shadowsocks with no technical knowledge needed

Posted on 23. November 2017 Comments

Shadowsocks is a proxy that has been designed and used to circumvent censorship in China. So if it’s possible to get traffic across the Great Firewall of China it pretty much can be used anywhere, e.g. Egypt where VPNs are blocked since mid 2017.

Digital Ocean offers virtual servers for cheap with an easy to understand pricing model. Basically you pay either $5, $10, $20, $40, $80 or $160 per month, for more have a look at pricing at digitalocean.com. These server are general purpose servers, you can do everything with them, which also means, they don’t have anything installed and you need to do everything yourself.

oneclickshadowsocks.de is a service to install shadowsocks on DigitalOcean servers without having to actually login via SSH and entering lots of technical commands in the commandline. It uses the DigitalOcean API to create a Droplet (=server) with shadowsocks already set up and running. All you have to do is to enter the IP address you get via e-mail in your shadowsocks client and the password given to you on the website.

The code is open source and the website itself is hosted on GitHub Pages, which means, you can see the sourcecode of the page itself, running at that very moment. This way other people can verify they nothing shady is going on.

Commandline: Which programs are using network connection

Posted on 29. August 2017 Comments

lsof -P -i -n | cut -f 1 -d " " | uniq

lsof – list open files
-P list port numbers instead of service names
-i list all network files
-n IP addresses instead of host names

cut – cut output
-f specifies fields, separated in the input by the field delimiter character (-d)
-d delimiter

uniq – filters out repeated lines

Domain von Domain Offensive bei Heroku nutzen

Posted on 24. Januar 2015 Comments

Ich habe neulich die Domain morsecode-api.de bei Domain Offensive erworben und wollte nun diese Domain mit meiner Heroku App für Morsecode As A Service nutzen. Allerdings bietet Heroku nicht die Möglichkeit an, A Resource Records oder AAAA Resource Records (für IPv6) zu benutzen. Stattdessen empfehlen sie einen CNAME Record. Nun ist es von der IETF aber nicht empfohlen bzw. gegen den Standard CNAME Records für root Domain Namen zu verwenden und viele Hoster unterstützen dies auch nicht. Wie der Name schon andeutet sind diese Einträge für weitere anerkannte Namen der selben Domain gedacht (z.B. .net und .com für denselben Namen).

Der Workaround funktioniert bei do.de also folgendermaßen:

  1. In den do.de Domaineinstellungen wird eine Weiterleitung eingerichtet auf www.example.com/
  2. Nach einer Weile ist es möglich unter DNS (Zonen Details), die A bzw. AAAA Resource Records für *.example.com zu entfernen
  3. Außerdem muss man einen CNAME Eintrag für www.example.com anlegen, der auf example.herokuapp.com zeigt.

Der Ablauf ist dann folgender:

  1. Eine DNS Anfrage auf example.com wird gestellt
  2. Der DNS Server liefert einen A bzw. AAAA Resource Record für einen lighttpd Server von Domain Offensive zurück
  3. Dieser liefert dem Client eine HTTP Redirect 301 Message auf www.example.com/ zurück (s. 1. weiter oben)
  4. Eine DNS Anfrage auf www.example.com gestellt
  5. Auf diese antwortet ebenfalls do.de mit einem CNAME Eintrag auf example.herokuapp.com
  6. Die HTTP Anfrage wird an example.herokuapp.com gestellt.

Löscht man auch die A bzw. AAAA Resource Records, funktioniert die Domain nur über die Subdomain www.example.com.

Dies funktioniert nur für Webservices unter Port 80 via HTTP. Für andere Bereiche bleibt wohl nur übrig, auch die A bzw. AAAA Records auf example.com zu löschen und in den Anfragen nur die Subdomain www.example.com zu benutzen.

Ausprobieren kann man das nach ein bisschen Wartezeit mit z.B. cURL:

$ curl -vL example.com
$ curl -vL www.example.com

Bei meinem Beispiel sieht das wie folgt aus:

 

$ curl -vL morsecode-api.de/encode/A
* Hostname was NOT found in DNS cache
*   Trying 78.47.59.169...
* Connected to morsecode-api.de (78.47.59.169) port 80 (#0)
> GET /encode/A HTTP/1.1
> User-Agent: curl/7.35.0
> Host: morsecode-api.de
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.morsecode-api.de/encode/A
< Content-Length: 0
< Date: Sat, 24 Jan 2015 20:09:09 GMT
* Server lighttpd/1.4.28 is not blacklisted
< Server: lighttpd/1.4.28
< 
* Connection #0 to host morsecode-api.de left intact
* Issue another request to this URL: 'http://www.morsecode-api.de/encode/A'
* Hostname was NOT found in DNS cache
*   Trying 23.21.123.184...
* Connected to www.morsecode-api.de (23.21.123.184) port 80 (#1)
> GET /encode/A HTTP/1.1
> User-Agent: curl/7.35.0
> Host: www.morsecode-api.de
> Accept: */*
> 
< HTTP/1.1 200 OK
* Server Cowboy is not blacklisted
< Server: Cowboy
< Connection: keep-alive
< Content-Type: application/json
< Content-Length: 34
< Date: Sat, 24 Jan 2015 20:09:09 GMT
< Via: 1.1 vegur
< 
* Connection #1 to host www.morsecode-api.de left intact
{"plaintext":"A","morsecode":".-"}

parallel-ssh mit perl

Posted on 9. August 2013 Comments

Es gibt ja das Programm parallel-ssh auf googlecode und auch in diversen Repositories, z.B. für Ubuntu. Ich habe allerdings dieses simple Perl Skript geschrieben um ein ähnliches Ergebnis zu erzielen. Da ich das über Webmin für ein bestimmtes Subnetz benutzen möchte, habe ich es konfigurierbar gehalten und das letzte Octect einer IP angegeben. Dabei ist mein Ziel hier gewesen, mich mit dem PublicKey-Verfahren anzumelden und eine bestimmte Datei oder einen Befehl auszuführen.

#!/bin/perl
$begin  = shift @ARGV;
$end    = shift @ARGV;

# if only one parameter given, only that IP will be used in the for-loop
if ($end == "") {
  $end = $begin;
}

# check if valid IPv4 address
if ($begin > $end || $begin > 255 || $end > 255 || $begin < 0 || $end < 0) {
  die "Die erste Zahl muss groesser als die zweite Zahl sein und muss eine Zahl zwischen 0 und 255 sein.\n ";
}

for (my $i = $begin; $i <= $end; $i++) {
  $bastelstring = "ssh user\@1.2.3." . $i . " befehl";
  $return = `$bastelstring`;
  print $return . "\n";
}

 

Alternativ kann man auch z.B. fest konfiguriert ein Array definieren:

 

@IPs = ("192.168.1.2", "192.168.1.3", "192.168.1.4");

foreach $IP(@IPs) {
  $bastelstring = "ssh user\@" . $IP . " befehl";
  $return = `$bastelstring`;
  print $return . "\n";
}

OpenVPN TLS Handshake failed auf Port 443

Posted on 4. Februar 2013 Comments

Gerade habe ich den folgenden Fehler bekommen:

TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
TLS Error: TLS handshake failed

Passiert ist das, weil ich die Portsperre umgehen wollte und von Port 1194 auf Port 443(also „HTTPS“) umgestellt habe. Dabei habe ich aber vergessen, dass durch die Firewall nur TCP-Verkehr durchgelassen wird(HTTPS geht über TCP). Da OpenVPN aber standardmässig UDP benutzt, bekommt man trotz offenem Port diese Fehlermeldung.

Einfach in der client.conf und der server.conf die Zeile proto tcp einkommentieren und proto udp auskommentieren. Wenn man zusätzlich noch UDP möchte, muss man 2 OpenVPN Instanzen laufen lassen. Das geht natürlich auf die Performance, hilft aber gegen blöde Firewalls.

How to get facebook back online #facebookdown

Posted on 11. Dezember 2012 Comments

Seems like facebook has some kind of DNS-Problem right now(#facebookdown). To fix this enter the facebook IPs in your hosts-file. To get them, have a look at your DNS Cache with a tool like dig(or use the ones I provide below).

 

Linux

repat@laptop:~$ dig facebook.com

; <<>> DiG 9.8.1-P1 <<>> facebook.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11887
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;facebook.com.            IN    A

;; ANSWER SECTION:
facebook.com.        6010    IN    A    69.171.229.16
facebook.com.        6010    IN    A    173.252.100.16
facebook.com.        6010    IN    A    173.252.101.16
facebook.com.        6010    IN    A    66.220.152.16
facebook.com.        6010    IN    A    66.220.158.16
facebook.com.        6010    IN    A    69.171.224.32

 

So just enter this into your /etc/hosts file:

#vi /etc/hosts

66.220.158.16   facebook.com
66.220.158.16   www.facebook.com


Windows
Windows has a similar file, which is located in %SystemRoot%\system32\drivers\etc\hosts. Where %SystemRoot% is your Windows directory, so most likely C:\Windows.

At least in Windows 7 the file is locked by the system, so unless you have notepad++, which doesn’t care about all this, you have to open your explorer, go to C:\Windows\system32\, right-click notepad.exe and select „start with admin rights“(or something like that…). Then click File/open, go to C:\Windows\system32\drivers\etc and select „all files“ on the right side(see screenshot). Then again open the file and enter the following:

66.220.158.16   facebook.com
66.220.158.16   www.facebook.com

 

 

 

 

MacOS

1. Click on the looking glass icon in the top right corner of the screen
2. Type „Terminal“ and press Enter, a new app called „Terminal“ will appear
3. Don’t get confused by it, just follow the steps
4. Copy this text into your clipboard : echo „173.252.101.16 www.facebook.com“ | sudo tee -a /etc/hosts
5. Paste it into the „Terminal“ window and press Enter
6. You will be prompted to enter your password (it will not show up on the screen, don’t worry about it), press Enter again when you finished typing your password.
7. The line „173.252.101.16 www.facebook.com“ will appear on the screen.
8. Done!

Programme über SSH auf Display :0 starten

Posted on 25. September 2012 Comments

Um Programme über SSH auf einem Bildschirm zu starten, der über Kabel angeschlossen ist muss man bei bestimmten Konfigurationen erstmal herausbekommen, welches Display zu welchem physikalischen Bildschirm gehört. Wenn es nur einen gibt ist es meistens 0.

Der aktuelle Bildschirm ist gelockt, d.h. wenn man versuchen würde über SSH jetzt ein Programm zu starten kommt folgende Meldung:

pi@raspberrypi ~ $ leafpad
leafpad: Anzeige kann nicht geöffnet werden:

Oder über xinit:

pi@raspberrypi ~ $ xinit leafpad :0
Fatal server error:
Server is already active for display 0
If this server is no longer running, remove /tmp/.X0-lock
and start again.
Please consult the The X.Org Foundation support
at http://wiki.x.org
for help.

Um das zu lösen muss kann man folgende Befehle benutzen:

pi@raspberrypi ~ $export DISPLAY=:0
pi@raspberrypi ~ $ firefox

Das ist vor allem praktisch, falls VNC nicht auf den ersten Display vom X-Server zugreifen kann(-> x0vnc). Um einfach nur eine grafische Oberfläche zu bekommen reicht ja normalerweise das XForwarding vom SSH-Server oder normales VNC
Credits go to Oli.

Install ssl-cert-check plugin under SLES11 with Nagios 3.0.6

Posted on 26. Juli 2012 Comments

The guys at prefetch.net already wrote a script for checking if a SSL certificate is still valid: http://prefetch.net/code/ssl-cert-check

The only challenge now is to implement the script into the monitoring tool Nagios, in this case we used a SuSE Linux Enterprise Server 11 and Nagios version 3.0.6.

Nagios 1

To get the little boxes in Nagios green, yellow and red(=Nagios‘ return values) and to receive e-mails in case of an expiration you have to change these 2 parameters in the ssl-cert-check file:

NAGIOS=TRUE
ALARM=TRUE

To match the given form of Nagios plugins we renamed the file to check_ssl-cert and then moved it to /usr/lib/nagios/plugins, where the rest of the plugins are.

For Nagios to recognize the plugin it has to be defined in /etc/nagios/objects/commands.cfg (NOT /etc/nagios/commands.cfg):

define command {
command_name check_ssl-cert
command_line /usr/lib/nagios/plugins/check_ssl-cert -s $HOSTADDRESS$ -p 443 -e $ARG1$
}

The port is usually the same for the same service. If it’s not port 443 for every server, you can also define the port as the second parameter in the next step. Of course, instead of -p 443 it has to be -p $ARG2$.

You now have to add the configuration of the plugin in /etc/nagios/conf.d/services.cfg. In this case, the hostgroup „all“ is selected, but if you have different hostgroups, the admin who has to get the e-mail might be different. The parameters go after the exclamation mark, comments begin with the semicolon.

define service {
hostgroup_name all
service_description ssl-certs
check_command check_ssl-cert!mail@example.org
use generic-service
notification_interval 0 ; set > 0 if you want to be renotified
}

 

If an ssl-cert is expired, it looks like this:
Nagios 2
Credits go to the Alex and the other guys at the CentOS mailing list:

Pruefen ob ein Computer online ist mit ping und perl

Posted on 18. Mai 2012 Comments

Ich habe bei der Arbeit ein kleines Perl-Skript geschrieben, welches prüfen sollte, ob bestimmte Computer in bestimmten Räumen(also IP-Ranges) noch online sind oder schon automatisch ausgestellt wurden. Dieses Skript sendet ein Paket über ping und guckt dann, ob es ein packetloss gibt. Im Grunde wäre das in der Bash besser gewesen, aber so kann man das, wenn man es ein bisschen anpasst, auch unter anderen OS verwenden.

Code

# The string containsPacketLoss is searching for
$packetloss = "100% packet loss";
# Init
$returnval = "";

print "\nCheck if Computers are online...\n";

# Scan IP-Range
for (my $i = 1; $i <=255; $i++) {
	# c = one package, w = deadline, q = quiet
        $ipcmd = "ping -c1 -q -w1 169.254.1." . $i;
        # execute and retreive output
        $returnval = `$ipcmd`;
        if (containsPacketLoss() == 0) {
            # output
            print "Computer  with IP 169.254.1." . $i . "is still online.\n";
            # write log file
	    system("echo Computer with IP 169.254.1.". $i . localtime(time) . " ONLINE >> /home/user/log");
        }
}

sub containsPacketLoss(){
	# check by RegEx if the string specified above is in the returnvalue
	# of the ping command
	if ($returnval =~ m/$packetloss/ ){
                return 1;
        }
        return 0;
}

Download