<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=872&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / Gentoo伯克利子系统之六:使用bpf实现xdp的例子]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=872</link>
		<description><![CDATA[Gentoo伯克利子系统之六:使用bpf实现xdp的例子 最近发表的帖子。]]></description>
		<lastBuildDate>Sat, 13 Jul 2024 03:55:52 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[Gentoo伯克利子系统之六:使用bpf实现xdp的例子]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=992#p992</link>
			<description><![CDATA[<p>本篇文章参考《Linux&#160; Observability with BPF》中第7章的例子，主要功能是借助于ip命令作为前端，对其他主机访问tcp的8000端口进行限制，这里需要使用较新版本的iproute2软件工具包. </p><p>1. 下载编译iproute2 工具包，使用最新的ip命令，支持配置xdp</p><p>&#160; &#160;git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git </p><p> 在编译iproute2时，需要开启支持libbpf的选项信息，在iproute2目录下配置使用下面的配置选项信息 </p><p>&#160; ./configure --libbpf_force=on --LIBBPF_DIR=/usr/local/lib64</p><p>&#160; &#160; &#160; &#160; 执行上面的命令，可能出现下面的错误信息，</p><p><span class="postimg"><img src="https://www.batsom.net/usr/uploads/2024/05/2842929636.png" alt="FluxBB bbcode 测试" /></span></p><p>确定libbpf的pk-config配置文件位置，/usr/local/lib64/pkgconfig/libbpf.pc&#160; 使用</p><p>export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig/ 导入libbpf的配置文件，</p><p>使用pkg-config --list-all | grep libbpf 查看是否配置libbpf</p><p><span class="postimg"><img src="https://www.batsom.net/usr/uploads/2024/05/1079572572.png" alt="FluxBB bbcode 测试" /></span></p><p>然后执行，make &amp;&amp; make install 进行安装。</p><p>2. 编写bpf程序</p><p>&#160; &#160; &#160; &#160;本bpf程序对于访问本机的tcp的协议的8000端口进行限制，</p><br /><div class="codebox"><pre class="vscroll"><code>#include &lt;linux/bpf.h&gt;
 
#include &lt;linux/if_ether.h&gt;
 
#include &lt;linux/in.h&gt;
 
#include &lt;linux/ip.h&gt;
 
#include &lt;linux/if_packet.h&gt;
 
#include &lt;bpf/bpf_helpers.h&gt;
 
#include &lt;linux/if_vlan.h&gt;
 
#include &lt;linux/types.h&gt;
 
#include &lt;linux/tcp.h&gt;
 
#include &lt;linux/udp.h&gt;
 
#include &lt;bpf/bpf_helpers.h&gt;
 
#include &lt;bpf/bpf_endian.h&gt;
 
 
 
static __always_inline int get_dport(void *trans_data, void *data_end, int protocol)
 
{
 
    struct tcphdr *th;
 
    struct udphdr *uh;
 
 
    switch (protocol) {
 
        case IPPROTO_TCP:
 
            th = (struct tcphdr *)trans_data;
 
            if ((void*)(th + 1) &gt; data_end)
 
                return -1;
 
            return th-&gt;dest;
 
        case IPPROTO_UDP:
 
            uh = (struct udphdr *)trans_data;
 
            if ((void *)(uh + 1) &gt; data_end)
 
                return -1;
 
            return uh-&gt;dest;
 
        default:
 
            return 0;
 
    }
 
 
}
 
 
SEC(&quot;mysection&quot;)
 
int myprogram(struct xdp_md *ctx) {
 
  void *data = (void *)(long)ctx-&gt;data;
 
  void *data_end = (void *)(long)ctx-&gt;data_end;
 
  char fmt[] = &quot;source = %d \n&quot;;
 
  struct iphdr *ip;
 
  int dport;
 
  int hdport;
 
  struct ethhdr *eth = data;
 
  struct iphdr *iph = data + sizeof(struct ethhdr);
 
 
    if ((void *)(iph + 1) &gt; data_end) {
 
        return XDP_DROP;
 
    }
 
 
  dport = get_dport(iph + 1, data_end,iph-&gt;protocol);
 
 
  if (dport == -1 || dport == bpf_htons(8000)) {
 
        bpf_trace_printk(fmt,sizeof(fmt),bpf_ntohs(dport));
 
      return XDP_DROP;
 
  }
 
 
  return XDP_PASS;
 
}
 
char _license [] SEC (&quot;license&quot;) = &quot;GPL&quot;;</code></pre></div><p>使用下面的命令进行编译：clang -g -c -O2 -target bpf -c program.c -o program.o</p><p>编译完成后，使用下面的ip命令对某个网卡进行价值xdp文件。</p><p>ip link set dev eth0 xdp obj program.o sec mysection&#160; &#160;</p><p>通过上面的命令加载后，在接口上出现加载的xdp的类型和ID，表明加载成功。</p><p><span class="postimg"><img src="https://www.batsom.net/usr/uploads/2024/05/859964227.png" alt="FluxBB bbcode 测试" /></span></p><p>使用python3 -m http.server在本地主机上其中http服务器，并监听8000端口。</p><p><span class="postimg"><img src="https://www.batsom.net/usr/uploads/2024/05/1179483150.png" alt="FluxBB bbcode 测试" /></span></p><p>使用另一台主机上使用nmap命令扫描对方监听的端口。nmap -sS 10.9.4.222，扫描结果如下：</p><p><span class="postimg"><img src="https://www.batsom.net/usr/uploads/2024/05/81153980.png" alt="FluxBB bbcode 测试" /></span></p><p>ip link set dev eth0 xdp off 关闭加载的xdp程序。再次使用nmap扫描</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Sat, 13 Jul 2024 03:55:52 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=992#p992</guid>
		</item>
	</channel>
</rss>
