Browse Source

mesh firewall

Bob Mottram 9 years ago
parent
commit
5099ec9143
2 changed files with 105 additions and 31 deletions
  1. 2
    2
      src/freedombone
  2. 103
    29
      src/freedombone-image-customise

+ 2
- 2
src/freedombone View File

@@ -432,7 +432,7 @@ TOX_COMMIT='73b2144edcfd1ca617e9054479b66ab0c0361a14'
432 432
 TOX_BOOTSTRAP_ID_FILE=/var/lib/tox-bootstrapd/pubkey.txt
433 433
 # These are some default nodes, but you can replace them with trusted nodes
434 434
 # as you prefer. See https://wiki.tox.im/Nodes
435
-TOX_NODE=
435
+TOX_NODES=
436 436
 #TOX_NODES=(
437 437
 #  '192.254.75.102,2607:5600:284::2,33445,951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F,Tox RELENG,US'
438 438
 #  '144.76.60.215,2a01:4f8:191:64d6::1,33445,04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F,sonOfRa,DE'
@@ -1235,7 +1235,7 @@ function read_configuration {
1235 1235
             TLS_TIME_SOURCE2=$(grep "TLS_TIME_SOURCE2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
1236 1236
         fi
1237 1237
     fi
1238
-	echo "System type: $SYSTEM_TYPE"
1238
+    echo "System type: $SYSTEM_TYPE"
1239 1239
 }
1240 1240
 
1241 1241
 function set_default_onion_domains {

+ 103
- 29
src/freedombone-image-customise View File

@@ -69,6 +69,8 @@ SSH_PORT=2222
69 69
 # Whether sites are accessible only within a Tor browser
70 70
 ONION_ONLY="no"
71 71
 
72
+WIFI_INTERFACE='wlan0'
73
+
72 74
 enable_eatmydata_override() {
73 75
     chroot $rootdir apt-get install --no-install-recommends -y eatmydata
74 76
     if [ -x $rootdir/usr/bin/eatmydata ] && \
@@ -391,7 +393,7 @@ mesh_avahi() {
391 393
     echo '</service-group>' >> $rootdir/etc/avahi/services/ssh.service
392 394
 
393 395
     # keep the daemon running
394
-	WATCHDOG_SCRIPT_NAME="keepon"
396
+    WATCHDOG_SCRIPT_NAME="keepon"
395 397
     echo '' >> $rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME
396 398
     echo '# keep avahi daemon running' >> $rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME
397 399
     echo 'AVAHI_RUNNING=$(pgrep avahi-daemon > /dev/null && echo Running)' >> $rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME
@@ -400,10 +402,10 @@ mesh_avahi() {
400 402
     echo '  echo -n $CURRENT_DATE >> $LOGFILE' >> $rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME
401 403
     echo '  echo " Avahi daemon restarted" >> $LOGFILE' >> $rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME
402 404
     echo 'fi' >> $rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME
403
-	chmod +x $rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME
405
+    chmod +x $rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME
404 406
 }
405 407
 
406
-function mesh_batman {
408
+mesh_batman() {
407 409
     chroot "$rootdir" apt-get -y install iproute bridge-utils libnetfilter-conntrack3 batctl
408 410
     chroot "$rootdir" apt-get -y install python-dev libevent-dev ebtables python-pip git
409 411
     chroot "$rootdir" apt-get -y install wireless-tools rfkill
@@ -412,11 +414,11 @@ function mesh_batman {
412 414
         echo 'batman_adv' >> $rootdir/etc/modules
413 415
     fi
414 416
 
415
-	if [ -f /usr/local/bin/${PROJECT_NAME}-mesh-batman ]; then
417
+    if [ -f /usr/local/bin/${PROJECT_NAME}-mesh-batman ]; then
416 418
         cp /usr/local/bin/${PROJECT_NAME}-mesh-batman $rootdir/var/lib/batman
417
-	else
419
+    else
418 420
         cp /usr/bin/${PROJECT_NAME}-mesh-batman $rootdir/var/lib/batman
419
-	fi
421
+    fi
420 422
 
421 423
     echo '[Unit]' > $rootdir/etc/systemd/system/batman.service
422 424
     echo 'Description=B.A.T.M.A.N. Advanced' >> $rootdir/etc/systemd/system/batman.service
@@ -435,7 +437,78 @@ function mesh_batman {
435 437
     chroot "$rootdir" systemctl enable batman
436 438
 }
437 439
 
438
-function mesh_tox_node {
440
+mesh_firewall() {
441
+    TOX_PORT=33445
442
+    ZERONET_PORT=15441
443
+    TRACKER_PORT=6969
444
+    FIREWALL_FILENAME=$rootdir/etc/systemd/system/meshfirewall.service
445
+    MESH_FIREWALL_SCRIPT=/usr/bin/mesh-firewall
446
+
447
+    echo '#!/bin/bash' > $rootdir/$MESH_FIREWALL_SCRIPT
448
+    echo 'iptables -P INPUT ACCEPT' >> $rootdir/$MESH_FIREWALL_SCRIPT
449
+    echo 'ip6tables -P INPUT ACCEPT' >> $rootdir/$MESH_FIREWALL_SCRIPT
450
+    echo 'iptables -F' >> $rootdir/$MESH_FIREWALL_SCRIPT
451
+    echo 'ip6tables -F' >> $rootdir/$MESH_FIREWALL_SCRIPT
452
+    echo 'iptables -t nat -F' >> $rootdir/$MESH_FIREWALL_SCRIPT
453
+    echo 'ip6tables -t nat -F' >> $rootdir/$MESH_FIREWALL_SCRIPT
454
+    echo 'iptables -X' >> $rootdir/$MESH_FIREWALL_SCRIPT
455
+    echo 'ip6tables -X' >> $rootdir/$MESH_FIREWALL_SCRIPT
456
+    echo 'iptables -P INPUT DROP' >> $rootdir/$MESH_FIREWALL_SCRIPT
457
+    echo 'ip6tables -P INPUT DROP' >> $rootdir/$MESH_FIREWALL_SCRIPT
458
+    echo 'iptables -A INPUT -i lo -j ACCEPT' >> $rootdir/$MESH_FIREWALL_SCRIPT
459
+    echo 'iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT' >> $rootdir/$MESH_FIREWALL_SCRIPT
460
+    echo '' >> $rootdir/$MESH_FIREWALL_SCRIPT
461
+    echo '# Make sure incoming tcp connections are SYN packets' >> $rootdir/$MESH_FIREWALL_SCRIPT
462
+    echo 'iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP' >> $rootdir/$MESH_FIREWALL_SCRIPT
463
+    echo '' >> $rootdir/$MESH_FIREWALL_SCRIPT
464
+    echo '# Drop packets with incoming fragments' >> $rootdir/$MESH_FIREWALL_SCRIPT
465
+    echo 'iptables -A INPUT -f -j DROP' >> $rootdir/$MESH_FIREWALL_SCRIPT
466
+    echo '' >> $rootdir/$MESH_FIREWALL_SCRIPT
467
+    echo '# Drop bogons' >> $rootdir/$MESH_FIREWALL_SCRIPT
468
+    echo 'iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP' >> $rootdir/$MESH_FIREWALL_SCRIPT
469
+    echo 'iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP' >> $rootdir/$MESH_FIREWALL_SCRIPT
470
+    echo 'iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP' >> $rootdir/$MESH_FIREWALL_SCRIPT
471
+    echo '' >> $rootdir/$MESH_FIREWALL_SCRIPT
472
+    echo '# Incoming malformed NULL packets:' >> $rootdir/$MESH_FIREWALL_SCRIPT
473
+    echo 'iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP' >> $rootdir/$MESH_FIREWALL_SCRIPT
474
+    echo '' >> $rootdir/$MESH_FIREWALL_SCRIPT
475
+    echo "iptables -A INPUT -p tcp --dport $TOX_PORT -j ACCEPT" >> $rootdir/$MESH_FIREWALL_SCRIPT
476
+    echo "iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $ZERONET_PORT -j ACCEPT" >> $rootdir/$MESH_FIREWALL_SCRIPT
477
+    echo "iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $ZERONET_PORT -j ACCEPT" >> $rootdir/$MESH_FIREWALL_SCRIPT
478
+    echo "iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $TRACKER_PORT -j ACCEPT" >> $rootdir/$MESH_FIREWALL_SCRIPT
479
+    echo "iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $TRACKER_PORT -j ACCEPT" >> $rootdir/$MESH_FIREWALL_SCRIPT
480
+    echo "iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport 1900 -j ACCEPT" >> $rootdir/$MESH_FIREWALL_SCRIPT
481
+    chmod +x $rootdir/$MESH_FIREWALL_SCRIPT
482
+
483
+    echo '[Unit]' > $FIREWALL_FILENAME
484
+    echo 'Description=Mesh Firewall' >> $FIREWALL_FILENAME
485
+    echo '' >> $FIREWALL_FILENAME
486
+    echo '[Service]' >> $FIREWALL_FILENAME
487
+    echo 'Type=oneshot' >> $FIREWALL_FILENAME
488
+    echo "ExecStart=$MESH_FIREWALL_SCRIPT" >> $FIREWALL_FILENAME
489
+    echo 'RemainAfterExit=no' >> $FIREWALL_FILENAME
490
+    echo '' >> $FIREWALL_FILENAME
491
+    echo 'TimeoutSec=30' >> $FIREWALL_FILENAME
492
+    echo '' >> $FIREWALL_FILENAME
493
+    echo '[Install]' >> $FIREWALL_FILENAME
494
+    echo 'WantedBy=multi-user.target' >> $FIREWALL_FILENAME
495
+    chroot "$rootdir" systemctl enable meshfirewall
496
+}
497
+
498
+mesh_tox_node() {
499
+    TOX_REPO='git://github.com/irungentoo/toxcore.git'
500
+    TOX_COMMIT='73b2144edcfd1ca617e9054479b66ab0c0361a14'
501
+    TOX_BOOTSTRAP_ID_FILE=/var/lib/tox-bootstrapd/pubkey.txt
502
+    # These are some default nodes, but you can replace them with trusted nodes
503
+    # as you prefer. See https://wiki.tox.im/Nodes
504
+    TOX_NODES=
505
+    #TOX_NODES=(
506
+    #  '192.254.75.102,2607:5600:284::2,33445,951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F,Tox RELENG,US'
507
+    #  '144.76.60.215,2a01:4f8:191:64d6::1,33445,04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F,sonOfRa,DE'
508
+    #)
509
+    iptables -A INPUT -p tcp --dport $TOX_PORT -j ACCEPT
510
+    save_firewall_settings
511
+
439 512
     chroot "$rootdir" apt-get -y install build-essential libtool autotools-dev
440 513
     chroot "$rootdir" apt-get -y install automake checkinstall check git yasm
441 514
     chroot "$rootdir" apt-get -y install libsodium13 libsodium-dev libcap2-bin
@@ -543,29 +616,30 @@ initialise_mesh() {
543 616
     if [[ $VARIANT != "mesh" ]]; then
544 617
         return
545 618
     fi
619
+    mesh_firewall
546 620
     mesh_avahi
547
-	mesh_batman
548
-
549
-	#MESH_SERVICE='mesh-setup.service'
550
-    #MESH_SETUP_DAEMON=$rootdir/etc/systemd/system/$MESH_SERVICE
551
-
552
-    #echo '[Unit]' > $MESH_SETUP_DAEMON
553
-    #echo 'Description=Initial mesh router configuration' >> $MESH_SETUP_DAEMON
554
-    #echo 'After=syslog.target' >> $MESH_SETUP_DAEMON
555
-    #echo 'After=network.target' >> $MESH_SETUP_DAEMON
556
-    #echo '[Service]' >> $MESH_SETUP_DAEMON
557
-    #echo 'Type=simple' >> $MESH_SETUP_DAEMON
558
-    #echo 'User=root' >> $MESH_SETUP_DAEMON
559
-    #echo 'Group=root' >> $MESH_SETUP_DAEMON
560
-    #echo 'WorkingDirectory=/root' >> $MESH_SETUP_DAEMON
561
-    #echo "ExecStart=/usr/local/bin/${PROJECT_NAME}-image-mesh > /var/log/mesh-setup.log" >> $MESH_SETUP_DAEMON
562
-    #echo '' >> $MESH_SETUP_DAEMON
563
-    #echo 'TimeoutSec=99999' >> $MESH_SETUP_DAEMON
564
-    #echo '' >> $MESH_SETUP_DAEMON
565
-    #echo '[Install]' >> $MESH_SETUP_DAEMON
566
-    #echo 'WantedBy=multi-user.target' >> $MESH_SETUP_DAEMON
567
-
568
-    #chroot "$rootdir" systemctl enable $MESH_SERVICE
621
+    mesh_batman
622
+    #mesh_tox_node
623
+
624
+    MESH_SERVICE='mesh-setup.service'
625
+    MESH_SETUP_DAEMON=$rootdir/etc/systemd/system/$MESH_SERVICE
626
+
627
+    echo '[Unit]' > $MESH_SETUP_DAEMON
628
+    echo 'Description=Initial mesh router configuration' >> $MESH_SETUP_DAEMON
629
+    echo 'After=syslog.target' >> $MESH_SETUP_DAEMON
630
+    echo 'After=network.target' >> $MESH_SETUP_DAEMON
631
+    echo '[Service]' >> $MESH_SETUP_DAEMON
632
+    echo 'Type=simple' >> $MESH_SETUP_DAEMON
633
+    echo 'User=root' >> $MESH_SETUP_DAEMON
634
+    echo 'Group=root' >> $MESH_SETUP_DAEMON
635
+    echo 'WorkingDirectory=/root' >> $MESH_SETUP_DAEMON
636
+    echo "ExecStart=/usr/local/bin/${PROJECT_NAME}-image-mesh > /var/log/mesh-setup.log" >> $MESH_SETUP_DAEMON
637
+    echo '' >> $MESH_SETUP_DAEMON
638
+    echo 'TimeoutSec=99999' >> $MESH_SETUP_DAEMON
639
+    echo '' >> $MESH_SETUP_DAEMON
640
+    echo '[Install]' >> $MESH_SETUP_DAEMON
641
+    echo 'WantedBy=multi-user.target' >> $MESH_SETUP_DAEMON
642
+    chroot "$rootdir" systemctl enable $MESH_SERVICE
569 643
 }
570 644
 
571 645
 # Set to true/false to control if eatmydata is used during build