OpenWrt (Backfire 10.03) and TL-WR1043ND
I forget to publish this article almost a year ago So now it’s a good time before I’ll write another one…
It’s OUTDATED and INCOMPLETE, but it can still bring some light…
Few days ago I bought WiFi router TP-Link TL-WR1043ND. The main reason was the USB, Gigabit Ethernet ports, 802.11n and support in latest OpenWrt.
OpenWrt is amazing project which can create really powerful device from the wifi routers.
I spent many days with collecting various information about OpenWrt, because I want to use web camera, USB hub, external USB storage and later few thermometers.
I decided to compile it from scratch (using Fedora 13), because squashfs can’t work with block-extroot without building an image (see https://forum.openwrt.org/viewtopic.php?pid=108642).
I prefer to use squashfs, because some people say it’s better than jffs2.
Here you can find my notes…
Download necessary packages to compile OpenWrt:
Download OpenWrt Backfire from svn:
svn co svn://svn.openwrt.org/openwrt/branches/backfire
or use the standard way:
wget http://downloads.openwrt.org/backfire/10.03/backfire_10.03_source.tar.bz2
tar xvjf backfire_10.03_source.tar.bz2
mv backfire_10.03 backfire
Start configuring it:
./scripts/feeds update
./scripts/feeds install xxx
make menuconfig
Select following items in the menuconfig and the items from the command below:
Target Profile (TP-LINK TL-WR1043ND v1)
Kernel modules ---> Filesystems ---> kmod-fs-ext2
Kernel modules ---> USB Support ---> kmod-usb-core
Kernel modules ---> USB Support ---> kmod-usb-storage
Kernel modules ---> USB Support ---> kmod-usb-video
Kernel modules ---> USB Support ---> kmod-usb-serial
Kernel modules ---> USB Support ---> kmod-usb-serial-pl2303
Kernel modules ---> Video Support ---> kmod-video-core
Kernel modules ---> Video Support ---> kmod-video-uvc
Utilities ---> disc ---> block-extroot
#Base system ---> block-extroot
and all the packages you installed before
Run “make V=99″ to compile it.
I’ll put all the root files to the USB disk and I formated my 500MB USB stick this way:
Model: Generic STORAGE DEVICE (scsi)
Disk /dev/sda: 492MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 16.4kB 450MB 450MB primary ext2
2 450MB 492MB 41.9MB primary linux-swap(v1)
Connect router to your desktop/laptop and flash it form the webgui using this file: /var/tmp/backfire/bin/ar71xx/openwrt-ar71xx-tl-wr1043nd-v1-squashfs-factory.bin or use these commands if you already have OpenWrt installed:
sysupgrade openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin
#scp ./backfire/bin/ar71xx/openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin root@192.168.0.2:/tmp
#mtd -e firmware -r write /tmp/openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin firmware
Set your password using telnet command and setup up block-extroot (Rootfs on External Storage) – use my USB stick as root partition to have more space:
telnet 192.168.1.1
uci set fstab.@mount[0].fstype=ext2
uci set fstab.@mount[0].device=/dev/sda1
uci set fstab.@mount[0].is_rootfs=1
uci set fstab.@mount[0].enabled_fsck=1
uci set fstab.@mount[0].target=/mnt
uci set fstab.@mount[0].enabled=1
uci commit fstab
passwd
reboot
Turn on the swap:
uci set fstab.@swap[0].enabled=1
Add option force_space in /etc/opkg.conf to allow installation of packets bigger than your /rom partitions free space:
Setup the ssh key to enable autologin:
ssh root@192.168.0.2
cp /tmp/authorized_keys /etc/dropbear/authorized_keys
chmod 600 /etc/dropbear/authorized_keys
Configure getting DHCP requests from WAN (Internet) port, wifi and firewall:
uci set network.lan.netmask=255.255.255.192
uci set network.wan.ifname=eth0.2
uci set network.wan.proto=static
uci set network.wan.type=bridge
uci set network.wan.ipaddr=192.168.0.2
uci set network.wan.netmask=255.255.255.192
uci set network.wan.dns="192.168.0.1 8.8.8.8"
uci set network.wan.gateway=192.168.0.1
uci set network.wifi_open=interface
uci set network.wifi_open.ifname=eth0.3
uci set network.wifi_open.type=bridge
uci set network.wifi_open.proto=static
uci set network.wifi_open.ipaddr=192.168.0.129
uci set network.wifi_open.netmask=255.255.255.192
uci set network.wifi_priv=interface
uci set network.wifi_priv.ifname=eth0.1
uci set network.wifi_priv.type=bridge
uci set network.wifi_priv.proto=static
uci set network.wifi_priv.ipaddr=192.168.0.65
uci set network.wifi_priv.netmask=255.255.255.192
uci add network switch_vlan
uci set network.@switch_vlan[-1].device=rtl8366rb
uci set network.@switch_vlan[-1].vlan=3
uci set network.@switch_vlan[-1].ports=5
uci set wireless.@wifi-iface[0].ssid=test123
uci set wireless.@wifi-iface[0].network=wifi_open
uci set wireless.@wifi-iface[0].encryption=psk2
uci set wireless.@wifi-iface[0].key=yyyyyyyy
uci set wireless.@wifi-iface[0].isolate=1
uci add wireless wifi-iface
uci set wireless.@wifi-iface[-1].device=radio0
uci set wireless.@wifi-iface[-1].network=wifi_priv
uci set wireless.@wifi-iface[-1].mode=ap
uci set wireless.@wifi-iface[-1].ssid=test345
uci set wireless.@wifi-iface[-1].encryption=psk2
uci set wireless.@wifi-iface[-1].key=yyyyyyyy
uci set wireless.radio0.channel=8
uci set wireless.radio0.country=CZ
uci set wireless.radio0.hwmode=11ng
uci del wireless.@wifi-device[0].disabled
uci set firewall.@zone[1].conntrack=1
uci set firewall.@zone[1].forward=ACCEPT
uci set firewall.@zone[1].input=ACCEPT
uci add firewall zone
uci set firewall.@zone[-1].name=wifi_open
uci set firewall.@zone[-1].input=REJECT
uci set firewall.@zone[-1].output=ACCEPT
uci set firewall.@zone[-1].forward=REJECT
uci set firewall.@zone[-1].conntrack=1
uci add firewall zone
uci set firewall.@zone[-1].name=wifi_priv
uci set firewall.@zone[-1].input=ACCEPT
uci set firewall.@zone[-1].output=ACCEPT
uci set firewall.@zone[-1].forward=REJECT
uci add firewall forwarding
uci set firewall.@forwarding[-1].src=wifi_open
uci set firewall.@forwarding[-1].dst=wan
uci add firewall forwarding
uci set firewall.@forwarding[-1].src=wifi_priv
uci set firewall.@forwarding[-1].dst=wan
uci add firewall rule
uci set firewall.@rule[-1].name=icmp-echo-request
uci set firewall.@rule[-1].src=wifi_open
uci set firewall.@rule[-1].target=ACCEPT
uci set firewall.@rule[-1].proto=icmp
uci set firewall.@rule[-1].icmp_type=echo-request
uci add firewall rule
uci set firewall.@rule[-1].name=dhcp
uci set firewall.@rule[-1].src=wifi_open
uci set firewall.@rule[-1].target=ACCEPT
uci set firewall.@rule[-1].proto=udp
uci set firewall.@rule[-1].src_port=68
uci set dhcp.@dnsmasq[0].domain=xvx.cz
uci set dhcp.@dnsmasq[0].port=0
uci set dhcp.@dnsmasq[0].cachelocal=0
uci set dhcp.@dnsmasq[0].dhcpscript=/etc/dnsmasq.script
uci set dhcp.wifi_open=dhcp
uci set dhcp.wifi_open.interface=wifi_open
uci set dhcp.wifi_open.start=130
uci set dhcp.wifi_open.limit=60
uci set dhcp.wifi_open.dhcp_option=6,192.168.0.1
uci set dhcp.wifi_priv=dhcp
uci set dhcp.wifi_priv.interface=wifi_priv
uci set dhcp.wifi_priv.start=70
uci set dhcp.wifi_priv.limit=60
uci set dhcp.wifi_priv.dhcp_option=6,192.168.0.1
uci set dhcp.lan.start=194
uci set dhcp.lan.limit=60
uci set dhcp.lan.dhcp_option=6,192.168.0.1
uci add dhcp host
uci set dhcp.@host[-1].name=peru-nb-work
uci set dhcp.@host[-1].ip=192.168.0.66
uci set dhcp.@host[-1].mac=00:1C:65:38:7C:F6
uci add dhcp host
uci set dhcp.@host[-1].name=peru-nb
uci set dhcp.@host[-1].ip=192.168.0.67
uci set dhcp.@host[-1].mac=00:15:00:11:48:5a
uci add dhcp host
uci set dhcp.@host[-1].name=phone
uci set dhcp.@host[-1].ip=192.168.0.68
uci set dhcp.@host[-1].mac=00:23:76:d6:42:c7
uci add dhcp host
uci set dhcp.@host[-1].name=palm
uci set dhcp.@host[-1].ip=192.168.0.69
uci set dhcp.@host[-1].mac=00:0b:6c:57:da:9a
wget http://rpc.one.pl/pliki/openwrt/backfire/10.03.x/dnsmasq/dnsmasq -O /etc/init.d/dnsmasq
Set the hostname, timezone and configure syslogd:
uci set system.@system[0].timezone=CET-1CEST,M3.5.0,M10.5.0/3
uci set system.@system[0].log_size=64
uci set system.@system[0].log_ip=192.168.0.1
Configure certificate details for https:
uci set uhttpd.px5g.country=CZ
uci set uhttpd.px5g.state="Czech Republic"
uci set uhttpd.px5g.location=Brno
rm /etc/uhttpd.crt /etc/uhttpd.key
Configure darkstat, snmpd and vnstat.
uci set mini_snmpd.@mini_snmpd[0].interfaces=lo,br-wan,br-wifi_open,br-wifi_private
uci set mini_snmpd.@mini_snmpd[0].community=OpenWrt
uci set mini_snmpd.@mini_snmpd[0].location='V Ujezdech 1, Brno'
uci set mini_snmpd.@mini_snmpd[0].contact='PeRu'
Few more commands to configure “non-uci” files:
sed -i 's/\(^GatewayInterface\).*/\1 br-wifi_open/;s/^# \(GatewayName\).*/\1 Medlanky/;s/^\([[:space:]]*FirewallRule allow tcp port 80\)/#\1/;s/\(.*FirewallRule allow tcp port 22\)/#\1/;s/\(.*FirewallRule allow tcp port 443\)/#\1/;/^FirewallRuleSet authenticated-users/a\ FirewallRule allow' /etc/nodogsplash/nodogsplash.conf
sed -i 's@\(\)@\1\n
<h3>For Internet access - click the dog</h3>
\n
<h3>Pro pristup na Internet klikni na psa.</h3>
@' /etc/nodogsplash/htdocs/splash.html
cat > /etc/dnsmasq.script << \EOF #!/bin/sh /bin/echo `/bin/date +"%F %T"` $* >> /tmp/dnsmasq.script.log
case $1 in
"add")
#grep -q $2 /etc/config/dhcp || /usr/bin/nmap -T4 -A $3 | ssmtp petr.ruzicka@gmail.com
#echo "Subject: New connection to `hostname` ($2 $3)\n\n`/usr/bin/nmap -T4 -A $3`" | ssmtp petr.ruzicka@gmail.com
echo "ADD: MAC: $MAC; DNSMASQ_LEASE_LENGTH: $DNSMASQ_LEASE_LENGTH; DNSMASQ_LEASE_EXPIRES: $DNSMASQ_LEASE_EXPIRES; DNSMASQ_TIME_REMAINING: $DNSMASQ_TIME_REMAINING; DNSMASQ_TAGS: $DNSMASQ_TAGS" >> /tmp/dnsmasq.script.log
;;
"old")
echo "OLD: MAC: $MAC; DNSMASQ_LEASE_LENGTH: $DNSMASQ_LEASE_LENGTH; DNSMASQ_LEASE_EXPIRES: $DNSMASQ_LEASE_EXPIRES; DNSMASQ_TIME_REMAINING: $DNSMASQ_TIME_REMAINING; DNSMASQ_TAGS: $DNSMASQ_TAGS" >> /tmp/dnsmasq.script.log
;;
"del")
echo "DEL: MAC: $MAC; DNSMASQ_LEASE_LENGTH: $DNSMASQ_LEASE_LENGTH; DNSMASQ_LEASE_EXPIRES: $DNSMASQ_LEASE_EXPIRES; DNSMASQ_TIME_REMAINING: $DNSMASQ_TIME_REMAINING; DNSMASQ_TAGS: $DNSMASQ_TAGS" >> /tmp/dnsmasq.script.log
;;
esac
EOF
chmod a+x /etc/dnsmasq.script
cat >> /etc/digitemp.script << \EOF
#!/bin/sh /usr/bin/digitemp_DS9097 -c/etc/digitemp.conf -a -n0 -d10 -q -s/dev/ttyUSB0 -o"PUTVAL OpenWrt/temp/temperature-%s interval=10 %N:%.2C"
EOF
chmod a+x /etc/digitemp.script
mkdir /root/.ssh/
dropbearkey -t rsa -f /root/.ssh/id_rsa
# Save the public key to the ~/.ssh/authorized_keys on the server cat > /etc/fswebcam.script << \EOF
#!/bin/sh
OUTPUT_FILE="/tmp/webcam/`date +%F_%H-%M`.png" OUTPUT_DIR=`dirname
$OUTPUT_FILE` date > /tmp/fswebcam.script.log
if [ `pgrep -f fswebcam | wc -l` -ge 4 ]; then
BAD_STATE=1
echo -e "*** fswebcam already running [`pgrep -f fswebcam | wc -l`] !!!\n*** ps -ef | grep -E '(fswebcam|scp)':\n`ps -ef | grep -E '(fswebcam|scp)'`\n*** killall fswebcam:\n`killall fswebcam`\n" | tee -a /tmp/fswebcam.script.log
fi
test -d $OUTPUT_DIR || mkdir -p $OUTPUT_DIR
fswebcam --no-banner --rotate 180 --resolution 640x480 --fps 15 --png 7 --save $OUTPUT_FILE 2>&1 | tee -a /tmp/fswebcam.script.log
if scp -B -p -i /root/.ssh/id_rsa $OUTPUT_FILE ruzickap@gate.xvx.cz:/home/ftp/ 2>&1 >> /tmp/fswebcam.script.log; then
rm $OUTPUT_FILE
else
BAD_STATE=1
test -d /root/webcam_medlanky || mkdir -p /root/webcam_medlanky
mv $OUTPUT_FILE /root/webcam_medlanky/
echo -e "*** ls -la /root/webcam_medlanky/:\n`ls -la /root/webcam_medlanky/`\n" | tee -a /tmp/fswebcam.script.log
fi
if [ "$BAD_STATE" -eq 1 ]; then
echo -e "Subject: Webcam script failed!\n\n`cat /tmp/fswebcam.script.log`\n" | ssmtp petr.ruzicka@gmail.com
fi
EOF
chmod a+x /etc/fswebcam.script
echo "*/30 * * * * /etc/fswebcam.script" >> /etc/crontabs/root
/etc/init.d/cron enable
/etc/init.d/cron start
Collectd configuration:
mkdir -p /etc/collectd/conf.d
cat >> /etc/collectd/conf.d/my_collectd.conf << \EOF
LoadPlugin contextswitch
LoadPlugin memory
LoadPlugin uptime
LoadPlugin vmem
LoadPlugin users
LoadPlugin protocols
Value "/^Tcp:/"
IgnoreSelected false
LoadPlugin syslog
LogLevel "info"
EOF
uci set luci_statistics.collectd_ping.enable=1
uci set luci_statistics.collectd_ping.Hosts=www.google.com
uci set luci_statistics.collectd_df.enable=1
uci set luci_statistics.collectd_df.Devices=/dev/sda1
uci set luci_statistics.collectd_df.MountPoints=/mnt/sda1
uci set luci_statistics.collectd_df.FSTypes=fuseblk
uci set luci_statistics.collectd_disk.enable=1
uci set luci_statistics.collectd_disk.Disks=sda
uci set luci_statistics.collectd_dns.enable=1
uci set luci_statistics.collectd_dns.Interfaces="br-wan br-wifi_open br-wifi_private"
uci set luci_statistics.collectd_interface.Interfaces="br-wan br-wifi_open br-wifi_private"
uci set luci_statistics.collectd_irq.enable=1
uci set luci_statistics.collectd_netlink.enable=1
uci set luci_statistics.collectd_netlink.VerboseInterfaces="br-wan br-wifi_open br-wifi_private"
uci set luci_statistics.collectd_netlink.QDisc="br-wan br-wifi_open br-wifi_private"
uci set luci_statistics.collectd_network.enable=1
uci set luci_statistics.@collectd_network_server[0].host="\"collectd.xvx.cz\""
uci set luci_statistics.collectd_tcpconns.LocalPorts="22 80 443 667"
uci set luci_statistics.@collectd_exec_input[0].cmdline="/etc/digitemp.script"
/etc/init.d/luci_statistics enable
Useful commands:
swconfig dev rtl8366rb vlan 1 show
cat /proc/net/vlan/config
snmpwalk -v2c -c public_wifi 192.168.0.2
logread
Useful links:
http://rpc.one.pl/ (in Polish)
http://josefsson.org/openwrt/
Serial Port Temperature Sensors:
http://www.linuxfocus.org/English/November2003/article315.shtml
http://martybugs.net/electronics/tempsensor/hardware.cgi
Dnsmasq script “hack” (I hope it will not be necessary to do this in the future):
http://openrouter.info/index.php?option=com_content&view=article&id=138:zapobieganie-przed-zmian-ip-przez-uytkownika-w-openwrt&catid=47:artykuy&Itemid=61 (in Polish)
Serial cable:
http://halfface.se/wiki/index.php/Openwrt
Excellent article. Just got my TL-WR1043ND router going with Openwrt latest stable. Your instructions are useful but I am not so bold to compile just yet. I am looking to expand the use of mine with external usb hard drive. I was going through some of your notes. I am not sure if I understood but it seemed you stated you could put a usb hub off the port and run several devices. Is that correct. Also I have an external USB hard drive and I am trying to get the filesystem to mount. I am still researching but any info you have on this would be helpful. Unless it doesnt have enough power to drive the external drive or I have to get an external drive that has a case which takes its own power source. Hope to hear from you as I am still in the research phase of learning about this wonderful router.
Thanks
Julian
@julian
Yes you are right. Actually I used USB Hub containing 4 ports. To these ports I connected thermometer, USB stick and webcam.
Actually I have no experiences with connecting USB hard drive to to this devices – especially how it is with it’s power source. I’m using USB stick and it’s working fine.
Regards
PetrR
Great article. If I implemented your network, dhcp, dns, firewall setup, what do you think Luci would display in the GUI. Any chance of it working?
Mark
I guess almost all the commands done using “uci” will show up in the Luci WebGUI. If you will do the changes in these “sections”: network, dhcp, dns, firewall – it should be in Luci for sure.
I am dumbing down your configuration a bit as I am a newbie at this. I am removing the open wifi stuff for now (although a guest network is a really neat idea that I want to implement later) but can you tell me what is in your /etc/dnsmasq.script?
And thanks for getting back to me so quickly. Have you thought of putting your config on the openwrt forum or wiki? It is really good stuff for us learners.
Mark
Hi Petrův blog, you has lot of good informations in your blog, I just subscribed on RSS
So, can you help me, after the step: make V=99
Was generated those files:
/opt/openwrt/backfire_10.03.1/bin/ar71xx
kernel-debug.tar.bz2
md5sums
openwrt-ar71xx-rootfs.tar.gz
openwrt-ar71xx-root.jffs2-128k
openwrt-ar71xx-root.jffs2-64k
openwrt-ar71xx-root.squashfs
openwrt-ar71xx-root.squashfs-4k
openwrt-ar71xx-uImage-gzip.bin
openwrt-ar71xx-uImage-lzma.bin
openwrt-ar71xx-vmlinux.bin
openwrt-ar71xx-vmlinux.elf
openwrt-ar71xx-vmlinux.gz
openwrt-ar71xx-vmlinux.lzma
OpenWrt-ImageBuilder-ar71xx-for-Linux-x86_64.tar.bz2
OpenWrt-SDK-ar71xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2
OpenWrt-Toolchain-ar71xx-for-mips_r2-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2
packages
But where is: openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin
Can I use some of those file to upgrade openwrt?
Thanks