31
Network Device Development PART 2 – Firewall 101 SEAN

2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Embed Size (px)

Citation preview

Page 1: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Network Device Development

PART 2 – Firewall 101

SEAN

Page 2: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Sean

• Developer

[email protected]

• https://www.facebook.com/erinus

Page 3: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

GitHub

https://github.com/erinus/NetworkDeviceDevelopment

Page 4: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

First Firewall

Page 5: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

VMnet2

192.168.102.?

VMnet3

192.168.103.?

CLIENTUbuntu Desktop192.168.102.128

CLIENTUbuntu Desktop192.168.103.128

SWITCHDebian

VMnet1

NAT

eth1 eth2

eth0

PING (ICMP)

HTTP (TCP + Port 80)

Page 6: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Socket Buffer

struct sk_buff *skb;

Page 7: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Ethernet Header

struct ethhdr *eth_header = eth_hdr(skb);

Page 8: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

IPv4 Header

struct iphdr *ip_header = ip_hdr(skb);

Page 9: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

ICMP Header

struct icmphdr *icmp_header = icmp_hdr(skb);

Page 10: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

TCP Header

struct tcphdr *tcp_header = tcp_hdr(skb);

Page 11: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

UDP Header

struct udphdr *udp_header = udp_hdr(skb);

Page 12: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Important Constants

IPPROTO_TCP

IPPROTO_UDP

Page 13: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Important Functions

skb_pull(skb, length)

skb_push(skb, length)

skb_reset_mac_header(skb)

skb_reset_network_header(skb)

skb_reset_transport_header(skb)

Page 14: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Socket Buffer Has A Data Pointer

The pointer skb->data must point at current position.

When packet enters into forward hook, skb->data points at the beginning of layer 3.

Layer 3

Layer 2

skb->data

Page 15: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Move Among Layers

Layer 3

Layer 2 skb_push

Layer 4

skb_pull

Page 16: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Move To Layer 2

When skb->data points at the beginning of layer 2, you must call skb_reset_mac_header(skb) to set

right address of mac header.

Layer 3

Layer 2

skb->data

Layer 4

Page 17: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Move To Layer 2

skb_reset_mac_header(skb);

struct ethhdr *eth_header = eth_hdr(skb);

Page 18: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Layer 3

Layer 2

skb->data

Layer 4

Move To Layer 3

When skb->data points at the beginning of layer 3, you must call skb_reset_transport_header(skb) to

set right address of mac header.

Page 19: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Move To Layer 3

skb_reset_network_header(skb);

struct iphdr *ip_header = ip_hdr(skb);

Page 20: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Move To Layer 4

When skb->data points at the beginning of layer 4, you must call skb_reset_transport_header(skb) to

set right address of mac header.

Layer 3

Layer 2

skb->data

Layer 4

Page 21: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Move To Layer 4

skb_reset_transport_header(skb);

struct tcphdr *tcp_header = tcp_hdr(skb);

struct udphdr *udp_header = udp_hdr(skb);

struct icmphdr *icmp_header = icmp_hdr(skb);

Page 22: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Modify main.c

Page 23: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Modify main.c

IP Protocol ?TCP Protocol ?Move To Layer 4

Back To Layer 3

Port 80 ?

Page 24: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Install

$ make

$ make install

$ dmesg

Page 25: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Test your Firewall

Page 26: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

CLIENT of VMnet2

$ sudo ip route add 192.168.103.0/24 via 192.168.102.128

Page 27: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

CLIENT of VMnet3

$ sudo ip route add 192.168.102.0/24 via 192.168.103.128

Page 28: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Create HTTP Server on CLIENT of VMnet3

$ sudo python server-80.py

$ sudo python server-8080.py

Page 29: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Test on CLIENT of VMnet2

Open Web Browser and connect:

1. http://192.168.103.128:80/ Failure

2. http://192.168.103.128:8080/ Success

$ ping 192.168.103.128 Success

Page 30: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Next Part

Page 31: 2015.10.05 Updated > Network Device Development - Part 2: Firewall 101

Firewall 102