Category Archives: Internet

Das Internet und seine Auswüchse

Linux iptables firewall port redirecting + preventing iptables lock out

Linux iptables firewall port redirecting

Sometimes you just want to redirect an external port to another internal port for security reasons.

I.e. you have a running mySQL server on default port 3306 and you want to access it outside from a ‘more secure’/uncommon port- let’s say 53306.

Typically you just add the following line to iptables:

/sbin/iptables -t nat -A PREROUTING -p tcp –dport 53306 -j REDIRECT –to-port 3306

However if you also want explicit firewall functionality you should close port 3306 for incoming packets and open port 53306 for them.

The basic packet flow in iptables is as follows:

Packet flow in linux iptables. Every table contains several chains/queues, where the packets are added/moved to. Incoming packets get in from top, then through mangle table PREROUTING chain, nat table PREROUTING chain, then mangle table INPUT chain, filter table INPUT chain and then to the application! Important: The default table is ‘filter’.

Typically to close port 3306 for incoming tcp packets, you move TCP packets with destination port 3306 from (table nat, chain PREROUTING) to (table filter, chain DROP). You would write:

/sbin/iptables -t nat -A PREROUTING -p tcp –dport 3306 -j DROP

However this line gives out an error, as the nat table does not allow to forward to the DROP chain.

So if you take a look at the graph above, the best table/chain to close the external port 3306 for incoming tcp packets is table/chain ‘mangle/prerouting’:

/sbin/iptables -t mangle -A PREROUTING -p tcp –dport 3306 -j DROP

Then you open the table/chain ‘filter/input’ on port 3306 (see graph above) and the firewall internally is opened:

/sbin/iptables -A INPUT -p tcp –dport 3306 -j ACCEPT
You see: iptables is quite easy if you understand the principle of packets just moving from one table/chain to another.

Preventing iptables lock out

As you can lock out yourself with iptables by adding wrong rules, it is recommended to add the following lines to crontab:

# FOR IPTABLES TESTS ONLY : flush all ip table rules every 60 minutes (in case you lock yourself out)
*/5 * * * * root /etc/firewall-emergency.sh

The firewall-emergency.sh looks as follows:

#!/bin/sh
echo 0 > /opt/psa/var/modules/firewall/ip_forward.active
chmod 644 /opt/psa/var/modules/firewall/ip_forward.active
echo 0 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
exit 0

If something goes wrong editing iptables, the firewall will be totally cleared every hour.  Then if everything works fine, simply comment the line in crontab and you are ready to go.

Another option for preventing a lock-out by a wrong iptables configuration is iptables-apply (http://manpages.ubuntu.com/manpages/xenial/man8/iptables-apply.8.html).

For backups of your iptables firewall rules, use iptables-save and iptables-restore commands (iptables gives data to stdout; i.e. iptables-save > ~/iptables_backup_24_11_2016.txt would save the data to your home).

With iptables –list you can check the current rules (default table is filter – so if you want to output all tables you have to use the -t parameter; simplier for inspescting all table rules is iptables-save).

NOTE: iptables looses all rules on process/system restart. Install iptables-persistent (apt-get install iptables-persistent) to load them every time the system/runlevel is entered (help link for German users: http://www.sysadminslife.com/linux/quicktipp-iptables-regeln-dauerhaft-speichern-mit-iptables-persistent-debian-ubuntu-linux-mint/).

Using online music services with Ruby

[Or : Streaming Rhapsody or last.fm with Ruby]

Ruby has excellent libraries (HTTP, SSL, SOAP, XML, etc.) that can be used to write your own music player for streaming music from online services like Rhapsody or last.fm – so why not use them? Here are code snippets to help you getting started! They show you…

  • …how to make a HTTPS GET or POST request using SSL (https://…)
  • …how to easily parse the XML response of such a request
  • …how to stream music data (e.g. MP3) from some HTTP URL and how to pipe that stream data to another process (e.g. mplayer) for playing it back while streaming
  • …how to use SOAP requests with custom SSL certificates (https://…)
  • …how to encrypt/decrypt 64-bit DES ECB data

My own Ruby (1.8)-based Rhapsody player has 400 lines of Ruby code, my lasm.fm player has 200 lines of Ruby code  –   Do you think other languages can do better 😉 ?

Using HTTPS POST and SSL (HTTPS GET works similar using the Net::HTTP::Get class)

require 'net/http'
require 'net/https'

dict['api_key'] = @apikey
url = "https://someurl"

uri = URI.parse(url)
sock = Net::HTTP.new(uri.host, uri.port)
sock.use_ssl = true

req = Net::HTTP::Post.new(url)
req.set_form_data(dict)
res = sock.start{|http| http.request(req) }
puts res.body

Parsing XML response data

require 'rexml/document'
res = http_post( {'method'=> 'radio.getPlaylist', 'sk' => @sk })

doc = REXML::Document.new(res)

printf("%-30s %-50s %-40sn", "title", "album", "creator")
doc.elements.each("*/*/*/track") do |element|
  title    = element.elements["title"].text
  album    = element.elements["album"].text
  creator  = element.elements["creator"].text
  location = element.elements["location"].text
  image    = element.elements["image"].text
  printf("%-30s %-50s %-40sn", title, album, creator)
end

Streaming HTTP music data  (e.g. MP3) and piping it to another process (e.g. mplayer)

    uri = URI.parse(url)
    Net::HTTP.start(uri.host) do |http|
      http.request_get(uri.path) do |resp|
        pipe = IO.popen("mplayer -cache 256 -", "w")
        resp.read_body do |segment|
          if segment.length > 0
            pipe.write(segment)
          end
        end
        pipe.close
      end
    end

Of course, you can always pipe using bash..

macbook-pro:~ nero$ lastfm.rb | mplayer -cache 64 -

...however this wouldn't allow you to write something else to STDOUT except the music data.

Using SOAP requests and custom SSL certificates

require 'openssl'
require "rubygems"
gem "httpclient", "2.1.5.2"
gem 'soap4r'
require 'soap/rpc/driver'

driverPlay = SOAP::RPC::Driver.new('https://someurl', 'urn:someurn')
driverPlay.options["protocol.http.ssl_config.verify_mode"] = nil
driverPlay.options["protocol.http.ssl_config.client_cert"] = File.join(@dir, "somefile.cert.pem")
driverPlay.options["protocol.http.ssl_config.client_key"] = File.join(@dir, "somefile.key.pem")
driverPlay.return_response_as_xml = true
# define some method
driverPlay.add_method('startPlaybackSession', 'developerKey', 'cobrandId', 'logon', 'password', 'clientType')

Using 64-bit DES ECB encryption
(the key is to use ‘cipher.padding = 0’  – it took me 2 hours to figure that out …)

  require 'openssl'
  def testDES
    puts '*** TESTDES ***'
    key         = "x01x23x45x67x89xabxcdxef"
    plain       = "x01x23x45x67x89xabxcdxe7"
    cryptdata   = "xc9x57x44x25x6ax5exd3x1d"

    puts "key      = " + key.unpack("H*").to_s
    puts "plain    = " + plain.unpack("H*").to_s
    #puts OpenSSL::Cipher.ciphers

    puts "encrypt..."
    cipher = OpenSSL::Cipher::Cipher.new('des-ecb')
    cipher.encrypt
    cipher.key = key
    cipher.padding = 0
    res = cipher.update(plain)
    puts "res      = " + res.unpack("H*").to_s
    puts "crypted  = " + cryptdata.unpack("H*").to_s

    puts "decrypt..."
    cipher.decrypt
    res = cipher.update(res) + cipher.final
    puts "res      = " + res.unpack("H*").to_s
    puts "plain    = " + plain.unpack("H*").to_s

    puts "triple..."
    cipher.decrypt
    plain = cipher.update(plain) + cipher.final
    cipher.encrypt
    cipher.key = plain
    plain = cipher.update(plain)
    cipher.decrypt
    cipher.key = key
    res = cipher.update(plain) + cipher.final
    puts "res      = " + res.unpack("H*").to_s
  end





	

Kameraposititionssteuerung via Internet

Endlich mal wieder ein kleines Projekt, welches viele Dinge der Informatik miteinander verbindet: Servos, Mikrocontroller, USB-Kamera, Mikrocontroller <-> PC-Kommunikation, HTTP-Server, Javascript, AJAX, Python …

wwwspy

Aber jetzt erstmal im Detail:

Wie der Titel schon andeutet, geht es darum, eine USB-Webcam, welche auf zwei Servos montiert wurde via einem Web-Interface fernzusteuern – und natürlich das Bild der Kamera zu übertragen.

Das Projekt ist ähnlich dem Projekt von Tobias Weis – allerdings wird hier Windows und als Skriptsprache Python (statt Linux und PHP) verwendet.

Funktionsweise

Die Servos werden über Pulsweitenmodulation (PWM) vom Mikrocontroller angesteuert, der Mikrocontroller erhält die Steuerbefehle via RS232-Schnittstelle (RS232 through USB).  Ein auf dem PC laufender und in Python geschriebener Web-Server liest regelmäßig Bilder von der USB-Kamera, nimmt Befehle vom Web-Client entgegen (Kamera nach rech/links/oben/unten) und schickt diese Befehle dann an den Mikrocontroller.

Benötigte Hardware

  • Mikrocontroller Atmel ATMEGA8L (ich verwende das myAVR Board MK2 USB von myAVR) – dieses Board enthält den Mikrocontroller sowie einen Programmer zum Übertragen der Software in den Mikrocontroller via USB.
  • 2 handelsübliche Servos (werden im Modellbau eingesetzt und gibt es teilweise recht günstig bei eBay – ansonsten beim Modellbauer, Conrad, …)
  • USB-Webcam (gibt’s überall)
  • Ein Netzteil (5V, ca. 1A) zur Energieversorgung der Servos

Benötigte Software

Schritt 1: Servos montieren und mit Mikrocontroller verbinden

Den ersten Servo auf ein Brett fixieren, den zweiten Servo auf den ersten montieren und die Kamera auf den zweiten Servo befestigen. Dann die Steuerleitungen der Servos mit den Atmel Pins PB1 (OC1A) und PB2 (OC1B) verbinden. Zuletzt die +5V und Masse-Leitung der Servos mit dem externen Netzteil verbinden und die Masse-Leitung des externen Netzteils mit der Masse des Atmels verbinden (siehe auch das Schaltbild von Tobias).

Schritt 2: Mikrocontroller programmieren

Als nächstes wird der Atmel-Mikrocontroller programmiert. Zunächst sicherstellen dass die Fuse Bits des Atmels so eingestellt sind, dass dieser mit dem externen 3.6864 Mhz Quartz arbeitet (wichtig für die RS232 Kommunikation), z.B. mit dem Tool AVROSPII. Dann die Mikrocontroller-Software (avr/test2.c bzw. Projektdatei avr/test2.aps) in den Atmel mit AVR Studio übertragen (Build->Build und danach Tool-AVR Prog). Falls das myAVR-Board nicht gefunden wird, überprüfen ob COM1 oder COM2 für den USB-Treiber (->Gerätemanager) verwendet wird.

Nach erfolgereicher Übertragung der Mikrocontroller-Software kann man die Servos mit der Batch-Datei (avr/term.bat) austesten, welche ein RS232-Terminal startet. Durch Drücken der Tasten 1, 2, 3 oder 4 kann man die Servos steuern (rechts/links/oben/unten).

Schritt 3: Web-Server starten

Die WebCam mit dem PC verbinden. Dann den Web-Server starten (im Verzeichnis control ausführen:  python start.py). Nach ein paar Sekunden läuft der Web-Server dann auf Port 8080. Im Web-Browser gibt man also “http://localhost:8080” als URL ein und mit ein bisschen Glück sieht man das Web-Interface der Steuerungssoftware.

Download der Software

Die Abzocker-Mafia!

Habe Sie sich schon einmal irgendwo angemeldet, damit Sie ein (scheinbar kostenloses) Internet-Angebot nutzen können? Haben Sie danach eine Rechnung und anschließende Mahnungen erhalten? Nein? Mir ist dies wie vielen anderen tausenden Internet-Benutzern nun passiert. Die Masche ist scheinbar seit langem bekannt und die Machart des Drahtziehers ist immer dieselbe:

  1. Man muss sich anmelden und die AGB bestätigen, um eines der vielen (scheinbar kostenlosen) Internet-Angebot des dubiosen Anbieters nutzen zu können.
  2. Die eigentlich wichtige Information, dass das Angebot gebührenpflichtig ist, findet sich unterhalb der Internet-Seite an einer Stelle (im Kleingedruckten), die man u.U. gar nicht zu Gesicht bekommt.
  3. Nach der Anmeldung erhält man keine weitere unmittelbare Mitteilung darüber, dass man soeben einen Vertrag abgeschlossen hat. Diese Information ist einzig und allein in den AGB versteckt.
  4. Nach Ablauf einer Kündigungsfrist (die einem ebenfalls nicht direkt mitgeteilt wird, sondern sich in den AGB versteckt), erhält man zunächst eine Rechnung, dann eine Mahnung, dann eine zweite Mahnung, dann ggf. ein Inkassoschreiben, dann ggf. Schreiben von Anwälten.

Man bedenke, dass dies ein vollständiges “Geschäftsmodell” für den Abzocker darstellt – falls auch nur einige “Betroffene” zahlen, ist die Kasse gefüllt, um weitere Leute zu verunsichern und abzumahnen. Da es immer einige Leute gibt, die der Zahlung nachkommen werden, geht die Rechnung leider auf und der Abzocker kann seinem Geschäft weiter nachgehen und dieses ausbauen.

Bei einem genaueren Blick sollte einem dieses Geschäftsmodell jedoch als grenzwertig kriminell auffallen. Enstprechende Urteile des Amtsgerichts München (AZ 161 C 23695/06) und des Amtsgerichts Hamm (AZ 17 C 62/08) belegen, dass man vort Gericht mit sehr hoher Wahrscheinlichkeit gewinnt, allerdings wird es in 99,9999% der Fälle gar nicht soweit kommen, da dann das Geschäftsmodell des Abzockers offiziell als rechtswidrig bestätigt werden würde.

Daher bleibt einem nur, folgende Punkte zu beachten:

  1. Auf keinen Fall zahlen.
  2. Unmittelbar der Rechnung per Brief (Einschreiben) widersprechen. Die Verbraucherzentralen bieten hierfür Musterschreiben an.
  3. Alle Beweismittel sammeln (Screenshots des Internet-Angebots, E-Mails, Briefe).
  4. Briefe von Anwälten und Inkassofirmen ignorieren.
  5. Falls es wirklich zu einem *gerichtlichen* Mahnbescheid kommt, diesem widersprechen.

Damit ist die Sache in 99,9999% der Fälle erledigt. Der dubiose Internet-Anbieter wird in keinem Fall die seine Aktivitäten fortsetzen und einen Prozess anstreben, da er diesen ggf. verlieren würde, das werden auch die Verbraucherzentralen und Anwälte bestätigen.

Ich hoffe, ich konnte ein hiermit beitragen, ein wenig Licht ins Dunkel der dubiosen Internet-Geschäftemacher zu bringen. Es bleibt zu hoffen, dass dieses Geschäftsmodell zukünftig nicht noch mehr Nachahmer finden wird bzw. dass das Internet-Dienstleistungsgeschäft durch neuere Rechtssprechnung für den Kunden transparenter und sicherer wird!

Vorsicht! Die Kreativität dieser dubiosen Internetdienstleister kennt keine Grenzen – schon morgen könnte man selbst in eine andere Falle tappen 😉