fea: clean misc code

This commit is contained in:
Daniel Ding
2022-10-08 10:55:56 +08:00
parent c03c099dfb
commit 52beddb3d8
67 changed files with 7 additions and 9419 deletions
+1 -16
View File
@@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
language: [ 'go', 'cpp' ]
language: [ 'go' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
@@ -39,20 +39,5 @@ jobs:
if: ${{ matrix.language == 'go' }}
uses: github/codeql-action/autobuild@v2
# ️ Command-line programs to run using the OS shell.
# https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
- name: Autobuild C language
if: ${{ matrix.language == 'cpp' }}
run: |
sudo apt update
sudo apt install -y liblzo2-dev libpam-dev
sudo apt install -y graphviz autoconf automake bzip2 debhelper dh-autoreconf libssl-dev libtool openssl procps python-all python-six libunbound-dev
make update && make linux
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
+2 -4
View File
@@ -16,8 +16,6 @@ jobs:
- name: Building packages
run: |
sudo apt update
sudo apt install -y liblzo2-dev libpam-dev
sudo apt install -y graphviz autoconf automake bzip2 debhelper dh-autoreconf libssl-dev libtool openssl procps python-all python-six libunbound-dev
make update && make test && make linux-bin
make test
make linux-bin
+2 -15
View File
@@ -41,23 +41,15 @@ bin: linux windows darwin ## build all platform binary
docker: pkg
docker build -t openlan-switch:$(VER) --build-arg VERSION=$(VER) -f ./dist/openlan-switch.docker .
## upgrade
upgrade:
ansible-playbook ./misc/playbook/upgrade.yaml -e "version=$(VER)"
clean: ## clean cache
rm -rvf ./build
rm -rvf ./core/build
rm -rvf ./core/cmake-build-debug
./core/auto.sh clean
./3rd/auto.sh clean
## prepare environment
update:
git submodule init
git submodule update
vendor: update
vendor:
go clean -modcache
go mod tidy
go mod vendor -v
@@ -65,16 +57,11 @@ vendor: update
env:
@mkdir -p $(BD)
@go version
@gofmt -w -s ./pkg ./cmd ./misc
@gofmt -w -s ./pkg ./cmd
## linux platform
linux: linux-proxy linux-point linux-switch
core: env
./3rd/auto.sh build
./core/auto.sh build
cd $(BD) && cmake $(SD)/core && make
rpm: env ## build rpm packages
mkdir -p ~/rpmbuild/SPECS
mkdir -p ~/rpmbuild/SOURCES
-28
View File
@@ -1,28 +0,0 @@
cmake_minimum_required(VERSION 2.8)
project(openlan C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_FLAGS "-std=gnu99 -g -DHAVE_CONFIG_H")
set(CMAKE_VERBOSE_MAKEFILE ON)
include_directories(../3rd/ovs)
include_directories(../3rd/ovs/lib)
include_directories(../3rd/ovs/include)
include_directories(.)
include_directories(idlc)
include_directories(tcp)
include_directories(udp)
link_directories(${CMAKE_SOURCE_DIR}/../build/obj/usr/lib)
link_directories(${CMAKE_SOURCE_DIR}/../build/obj/usr/lib64)
file(GLOB IDL_SOURCES "idlc/*.c")
file(GLOB UDP_SOURCES "udp/*.c")
file(GLOB TCP_SOURCES "tcp/*.c")
add_executable(openudp ${UDP_SOURCES} ${IDL_SOURCES})
target_link_libraries(openudp libopenvswitch.a)
target_link_libraries(openudp pthread ssl crypto rt m unbound)
add_executable(opentcp ${TCP_SOURCES})
target_link_libraries(opentcp pthread)
-46
View File
@@ -1,46 +0,0 @@
#!/bin/bash
set -ex
action=$1
version=$(cat VERSION)
cd $(dirname $0)
check_and_update() {
file0=$1
file1=$2
md5f0=$(md5sum $file0 | awk '{print $1}')
md5f1=$(md5sum $file1 | awk '{print $1}')
if [ "$md5f0"x != "$md5f1"x ]; then
mv $file0 $file1
fi
}
python_bin=python
type $python_bin || python_bin="python3"
ovs_dir="../3rd/ovs"
build_idlc() {
idlc_bin="$ovs_dir/ovsdb/ovsdb-idlc.in"
[ -e "idlc/confd.ovsschema" ] || ln -s -f ../../dist/resource/confd.schema.json idlc/confd.ovsschema
PYTHONPATH="$ovs_dir/python:"$PYTHONPATH PYTHONDONTWRITEBYTECODE=yes $python_bin $idlc_bin annotate idlc/confd.ovsschema idlc/confd-idl.ann > /tmp/confd-idl.ovsidl
check_and_update /tmp/confd-idl.ovsidl idlc/confd-idl.ovsidl
PYTHONPATH="$ovs_dir/python:"$PYTHONPATH PYTHONDONTWRITEBYTECODE=yes $python_bin $idlc_bin c-idl-source idlc/confd-idl.ovsidl > /tmp/confd-idl.c
check_and_update /tmp/confd-idl.c idlc/confd-idl.c
PYTHONPATH="$ovs_dir/python:"$PYTHONPATH PYTHONDONTWRITEBYTECODE=yes $python_bin $idlc_bin c-idl-header idlc/confd-idl.ovsidl > /tmp/confd-idl.h
check_and_update /tmp/confd-idl.h idlc/confd-idl.h
}
update_version() {
cp version.h /tmp/version.h
sed -i "s/#define CORE_PACKAGE_STRING .*/#define CORE_PACKAGE_STRING \"opencore $version\"/g" /tmp/version.h
sed -i "s/#define CORE_PACKAGE_VERSION .*/#define CORE_PACKAGE_VERSION \"$version\"/g" /tmp/version.h
check_and_update /tmp/version.h version.h
}
if [ "$action"x == "build"x ] || [ "$action"x == ""x ]; then
update_version
build_idlc
elif [ "$action"x == "clean"x ]; then
echo "TODO"
fi
-9
View File
@@ -1,9 +0,0 @@
# -*- python -*-
# This code, when invoked by "ovsdb-idlc annotate" (by the build
# process), annotates vswitch.ovsschema with additional data that give
# the ovsdb-idl engine information about the types involved, so that
# it can generate more programmer-friendly data structures.
s["idlPrefix"] = "openrec_"
s["idlHeader"] = "\"confd-idl.h\""
-1
View File
@@ -1 +0,0 @@
../../dist/resource/confd.schema.json
-9
View File
@@ -1,9 +0,0 @@
# build
mkdir -p build && cd ./build
cmake ..
make
# valgrind
valgrind --leak-check=yes ./build/core
-10
View File
@@ -1,10 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#include "control.h"
-13
View File
@@ -1,13 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#ifndef CORE_CONTROL_H
#define CORE_CONTROL_H
#endif //CORE_CONTROL_H
-32
View File
@@ -1,32 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#include <stdio.h>
#include "socket.h"
int main(int argc, char *argv[]) {
char *addr = NULL;
int port = 9090;
if (argc > 2) {
addr = argv[1];
sscanf(argv[2], "%d", &port);
} else if (argc > 1) {
sscanf(argv[1], "%d", &port);
}
if (addr == NULL) {
printf("Listen on %d!\n", port);
start_tcp_server(port);
} else {
printf("Connect to %s:%d\n", addr, port);
start_tcp_client(addr, port);
}
return 0;
}
-10
View File
@@ -1,10 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#include "message.h"
-13
View File
@@ -1,13 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#ifndef CORE_MESSAGE_H
#define CORE_MESSAGE_H
#endif //CORE_MESSAGE_H
-206
View File
@@ -1,206 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <memory.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <assert.h>
#include <pthread.h>
#include "tuntap.h"
#include "socket.h"
int non_blocking(int fd) {
int flags = fcntl(fd, F_GETFL, 0);
return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}
int recv_full(int fd, char *buf, ssize_t size) {
ssize_t read_size = 0;
for (; size > 0;) {
read_size = recv(fd, buf, size, 0);
if (read_size <= 0) return read_size;
buf += read_size;
size -= read_size;
}
return 0;
}
int send_full(int fd, char *buf, ssize_t size) {
ssize_t write_size = 0;
for (;size > 0;) {
write_size = send(fd, buf, size, 0);
if (write_size <= 0) return write_size;
buf += write_size;
size -= write_size;
}
return 0;
}
void *read_client(void *argv) {
uint16_t buf_size = 0;
uint16_t read_size = 0;
uint8_t buf[4096];
peer_t *conn = NULL;
assert(NULL != argv);
conn = (peer_t *) argv;
for(;;) {
buf_size = recv_full(conn->socket_fd, buf, 4);
if (buf_size != 0) {
break;
}
read_size = ntohs(*(uint16_t *)(buf + 2));
memset(buf, 0, sizeof buf);
buf_size = recv_full(conn->socket_fd, buf, read_size);
if (buf_size != 0) {
printf("ERROR: on read %d != %d\n", read_size, buf_size);
break;
}
write(conn->device_fd, buf, read_size);
}
}
void *read_device(void *argv) {
uint16_t write_size = 0;
uint16_t read_size = 0;
uint8_t buf[4096];
peer_t *conn = NULL;
assert(NULL != argv);
conn = (peer_t *) argv;
for(;;) {
read_size = read(conn->device_fd, buf + 4, sizeof (buf));
if (read_size <= 0) {
continue;
}
*(uint16_t *)(buf + 2) = htons(read_size);
read_size += 4;
write_size = send_full(conn->socket_fd, buf, read_size);
if (write_size != 0) {
printf("ERROR: write to conn %d:%d", write_size, read_size);
break;
}
}
}
int start_peer(peer_t *peer) {
pthread_t client;
pthread_t device;
if(pthread_create(&client, NULL, read_client, &peer)) {
fprintf(stderr, "Error creating thread\n");
return 1;
}
if(pthread_create(&device, NULL, read_device, &peer)) {
fprintf(stderr, "Error creating thread\n");
return 1;
}
if(pthread_join(client, NULL)) {
fprintf(stderr, "Error joining thread\n");
return 2;
}
if(pthread_join(device, NULL)) {
fprintf(stderr, "Error joining thread\n");
return 2;
}
}
int start_tcp_server(uint16_t port) {
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(port);
int server_fd = 0;
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if(bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
printf("bind error\n");
return -1;
}
if(listen(server_fd, 2) < 0) {
printf("listen error\n");
return -1;
}
struct sockaddr_in conn_addr;
socklen_t conn_addr_len = sizeof(conn_addr);
int conn_fd = 0;
char dev_name[1024] = {0};
int tap_fd = 0;
conn_fd = accept(server_fd, (struct sockaddr *)&conn_addr, &conn_addr_len);
printf("accept connection on %d\n", conn_fd);
tap_fd = create_tap(dev_name);
printf("open device on %s with %d\n", dev_name, tap_fd);
peer_t peer = {
.socket_fd = conn_fd,
.device_fd = tap_fd,
};
start_peer(&peer);
finish:
close(conn_fd);
close(server_fd);
close(tap_fd);
printf("exit from %d\n", server_fd);
return 0;
}
int start_tcp_client(const char *addr, uint16_t port) {
int ret = 0;
int socket_fd = 0;
struct sockaddr_in server_addr;
socket_fd = socket(PF_INET, SOCK_STREAM, 0);
if (socket_fd < 0) {
printf("ERROR: open socket %d", socket_fd);
return socket_fd;
}
bzero(&server_addr, sizeof (server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = inet_addr(addr);
ret = connect(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if(ret ==-1) {
printf("connect() error\n");
return ret;
}
char dev_name[1024] = {0};
int tap_fd = 0;
tap_fd = create_tap(dev_name);
printf("open device on %s with %d\n", dev_name, tap_fd);
peer_t peer = {
.socket_fd = socket_fd,
.device_fd = tap_fd,
};
start_peer(&peer);
finish:
close(socket_fd);
close(tap_fd);
return 0;
}
-23
View File
@@ -1,23 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#ifndef CORE_SOCKET_H
#define CORE_SOCKET_H
#include "types.h"
typedef struct {
int socket_fd;
int device_fd;
} peer_t;
int start_tcp_server(uint16_t port);
int start_tcp_client(const char *addr, uint16_t port);
#endif //CORE_SOCKET_H
-40
View File
@@ -1,40 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#include <assert.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#include <string.h>
#include "tuntap.h"
int create_tap(char *name) {
struct ifreq ifr;
int fd = -1;
int err = -1;
assert(NULL != name);
if((fd = open(DEV_NET_TUN, O_RDWR)) < 0 ) {
return -1;
}
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI; /* IFF_TUN or IFF_TAP, plus maybe IFF_NO_PI */
if (*name) {
strncpy(ifr.ifr_name, name, IFNAMSIZ);
}
if((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0) {
close(fd);
return err;
}
strcpy(name, ifr.ifr_name);
return fd;
}
-19
View File
@@ -1,19 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#ifndef CORE_TUNTAP_H
#define CORE_TUNTAP_H
#include <unistd.h>
#define DEV_NET_TUN "/dev/net/tun"
int create_tap(char *name);
#endif //CORE_TUNTAP_H
-37
View File
@@ -1,37 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#ifndef CORE_TYPES_H
#define CORE_TYPES_H
#ifndef int8_t
#define int8_t char
#endif
#ifndef uint8_t
#define uint8_t unsigned char
#endif
#ifndef uint16_t
#define uint16_t unsigned short
#endif
#ifndef int16_t
#define int16_t short
#endif
#ifndef uint32_t
#define uint32_t unsigned int
#endif
#ifndef int32_t
#define int32_t int
#endif
#endif //CORE_TYPES_H
-368
View File
@@ -1,368 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#include <config.h>
#include <errno.h>
#include <getopt.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "openvswitch/dynamic-string.h"
#include "openvswitch/poll-loop.h"
#include "openvswitch/vconn.h"
#include "openvswitch/vlog.h"
#include "ovsdb-data.h"
#include "ovsdb-idl-provider.h"
#include "command-line.h"
#include "confd-idl.h"
#include "daemon.h"
#include "udp.h"
#include "unixctl.h"
#include "ovs-thread.h"
#include "timeval.h"
#include "version.h"
#define RUN_DIR "/var/openlan"
#define UDP_PORT 4500
VLOG_DEFINE_THIS_MODULE(main);
/* Rate limit for error messages. */
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 5);
static char *default_db_ = NULL;
static char *db_remote = NULL;
static int32_t udp_port = 0;
struct udp_context {
struct udp_server *srv;
struct ovsdb_idl *idl;
struct ovsdb_idl_txn *idl_txn;
struct shash names;
struct shash networks;
struct shash links;
};
static inline char *
unixctl_dir()
{
return xasprintf("%s/%s.ctl", RUN_DIR, program_name);
}
static inline char *
default_db(void)
{
if (!default_db_) {
default_db_ = xasprintf("unix:%s/confd.sock", RUN_DIR);
}
return default_db_;
}
static void
usage(void)
{
printf("\
%s: OpenLAN UDP Connection\n\
usage %s [OPTIONS]\n\
\n\
Options:\n\
--port=PORT listen on local udp PORT\n\
(default: %d)\n\
--db=DATABASE connect to database at DATABASE\n\
(default: %s)\n\
-h, --help display this help message\n\
-o, --options list available options\n\
-V, --version display version information\n\
", program_name, program_name, UDP_PORT, default_db());
vlog_usage();
exit(EXIT_SUCCESS);
}
static void
parse_options(int argc, char *argv[])
{
enum {
VLOG_OPTION_ENUMS,
};
static struct option long_options[] = {
{"port", required_argument, NULL, 'p'},
{"db", required_argument, NULL, 'd'},
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
VLOG_LONG_OPTIONS,
{NULL, 0, NULL, 0}
};
char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
for (;;) {
int c;
c = getopt_long(argc, argv, short_options, long_options, NULL);
if (c == -1) {
break;
}
switch (c) {
case 'd':
db_remote = xstrdup(optarg);
break;
case 'p':
udp_port = atoi(optarg);
break;
case 'h':
usage();
case 'V':
ovs_print_version(OFP13_VERSION, OFP13_VERSION);
exit(EXIT_SUCCESS);
VLOG_OPTION_HANDLERS
case '?':
exit(EXIT_FAILURE);
default:
abort();
}
}
free(short_options);
if (!db_remote) {
db_remote = xstrdup(default_db());
}
if (!udp_port) {
udp_port = UDP_PORT;
}
}
static void
udp_exit(struct unixctl_conn *conn, int argc OVS_UNUSED,
const char *argv[] OVS_UNUSED, void *exiting_)
{
bool *exiting = exiting_;
*exiting = true;
unixctl_command_reply(conn, NULL);
}
static void
cache_run(struct udp_context *ctx)
{
const struct openrec_name_cache *nc;
const struct openrec_virtual_network *vn;
const struct openrec_virtual_link *vl;
shash_empty(&ctx->names);
shash_empty(&ctx->networks);
shash_empty(&ctx->links);
OPENREC_NAME_CACHE_FOR_EACH (nc, ctx->idl) {
VLOG_DBG("name_cache: %s %s", nc->name, nc->address);
shash_add(&ctx->names, nc->name, nc);
}
OPENREC_VIRTUAL_NETWORK_FOR_EACH (vn, ctx->idl) {
VLOG_DBG("virtual_network: %s %s", vn->name, vn->address);
shash_add(&ctx->networks, vn->name, vn);
}
OPENREC_VIRTUAL_LINK_FOR_EACH (vl, ctx->idl) {
VLOG_DBG("virtual_link: %s %s", vl->network, vl->connection);
if (!strncmp(vl->connection, "any", 3) || !strlen(vl->connection)) {
shash_add(&ctx->links, vl->device, vl);
} else {
shash_add(&ctx->links, vl->connection, vl);
}
}
}
static void
ping_run(struct udp_context *ctx)
{
char address[128] = {0};
struct udp_server *srv = ctx->srv;
if (time_msec() - srv->send_t < 5 *1000) {
return;
}
struct udp_connect conn = {
.socket = srv->socket,
.remote_port = UDP_PORT,
.remote_address = address,
};
struct shash_node *node;
SHASH_FOR_EACH(node, &ctx->links) {
const struct openrec_virtual_link *vl = node->data;
if (strncmp(vl->device, "spi:", 4) || strncmp(vl->connection, "udp:", 4)) {
continue;
}
VLOG_DBG("send_ping to %s on %s\n", vl->connection, vl->device);
ovs_scan(vl->device, "spi:%d", &conn.spi);
ovs_scan(vl->connection, "udp:%[^:]:%d", address, &conn.remote_port);
const struct shash_node *nc_node = shash_find(&ctx->names, address);
if (nc_node) {
const struct openrec_name_cache *nc = nc_node->data;
conn.remote_address = nc->address;
}
send_ping_once(&conn);
}
srv->send_t = time_msec();
}
static void
pong_run(struct udp_context *ctx)
{
int retval;
u_int8_t buf[1024];
struct sockaddr_in from;
struct udp_server *srv = ctx->srv;
struct udp_message *data = (struct udp_message *)buf;
retval = recv_ping_once(srv, &from, buf, sizeof buf);
if (retval <= 0) {
return;
}
const char *remote_addr = inet_ntoa(from.sin_addr);
char *spi_conn = xasprintf("spi:%d", ntohl(data->spi));
struct shash_node *node = shash_find(&ctx->links, spi_conn);
VLOG_DBG("pong_run from: %s:%d and spi %d\n", remote_addr, ntohs(from.sin_port), ntohl(data->spi));
if (node) {
struct openrec_virtual_link *vl = node->data;
VLOG_DBG("pong_run virtual link: %s %s\n", vl->connection, vl->network);
struct sockaddr_in dst_addr = from;
u_int32_t seqno = ntohl(data->seqno) + 1;
data->seqno = htonl(seqno);
retval = sendto(srv->socket, data, sizeof *data, 0, (struct sockaddr *)&dst_addr, sizeof dst_addr);
if (retval <= 0) {
VLOG_WARN_RL(&rl, "%s: could not send data\n", remote_addr);
}
// remote_connection=udp:a.b.c.d:1024
char *connection = xasprintf("udp:%s:%d", remote_addr, ntohs(from.sin_port));
openrec_virtual_link_update_status_setkey(vl, "remote_connection", connection);
free(connection);
}
free(spi_conn);
}
static void
ping_wait(struct udp_context *ctx)
{
poll_timer_wait_until(time_msec() + 5 * 1000);
}
static void
pong_wait(struct udp_context *ctx)
{
struct udp_server *srv = ctx->srv;
poll_fd_wait(srv->socket, POLLIN);
}
int
main(int argc, char *argv[])
{
struct unixctl_server *unixctl;
bool exiting = false;
int retval = 0;
char *unixdir;
ovs_cmdl_proctitle_init(argc, argv);
ovs_set_program_name(argv[0], CORE_PACKAGE_VERSION);
service_start(&argc, &argv);
parse_options(argc, argv);
unixdir = unixctl_dir();
/* Open and register unixctl */
retval = unixctl_server_create(unixdir, &unixctl);
if (retval) {
goto RET;
}
unixctl_command_register("exit", "", 0, 0, udp_exit, &exiting);
/* Connect to OpenLAN database. */
struct ovsdb_idl_loop open_idl_loop = OVSDB_IDL_LOOP_INITIALIZER(
ovsdb_idl_create(db_remote, &openrec_idl_class, true, true));
ovsdb_idl_get_initial_snapshot(open_idl_loop.idl);
struct udp_server srv = {
.port = udp_port,
.socket = -1,
.send_t = time_msec(),
};
open_socket(&srv);
if (configure_socket(&srv) < 0) {
VLOG_ERR("configure_socket: %s\n", strerror(errno));
goto RET;
}
struct udp_context ctx = {
.idl = open_idl_loop.idl,
.srv = &srv,
};
shash_init(&ctx.names);
shash_init(&ctx.networks);
shash_init(&ctx.links);
while(!exiting) {
ctx.idl_txn = ovsdb_idl_loop_run(&open_idl_loop);
if (ctx.idl_txn) {
cache_run(&ctx);
}
ping_run(&ctx);
pong_run(&ctx);
ping_wait(&ctx);
pong_wait(&ctx);
unixctl_server_run(unixctl);
unixctl_server_wait(unixctl);
if (exiting) {
poll_immediate_wake();
}
ovsdb_idl_loop_commit_and_wait(&open_idl_loop);
poll_block();
if (should_service_stop()) {
exiting = true;
}
}
shash_destroy(&ctx.names);
shash_destroy(&ctx.networks);
shash_destroy(&ctx.links);
unixctl_server_destroy(unixctl);
ovsdb_idl_loop_destroy(&open_idl_loop);
service_stop();
RET:
if (db_remote) free(db_remote);
if (default_db_) free(default_db_);
if (unixdir) free(unixdir);
exit(retval);
}
-130
View File
@@ -1,130 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#include <errno.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <linux/udp.h>
#include <linux/xfrm.h>
#include <linux/ipsec.h>
#include <linux/pfkeyv2.h>
#include <arpa/inet.h>
#include "openvswitch/dynamic-string.h"
#include "openvswitch/vlog.h"
#include "socket-util.h"
#include "udp.h"
VLOG_DEFINE_THIS_MODULE(udp);
/* Rate limit for error messages. */
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 5);
void
print_hex(const char *prefix, u_int8_t *data, int len)
{
if (VLOG_IS_DBG_ENABLED()) {
struct ds s;
ds_init(&s);
for (int i = 0; i < len; i++ ) {
ds_put_format(&s, "%02x ", data[i]);
}
VLOG_DBG("%s%s\n", prefix, ds_cstr(&s));
ds_destroy(&s);
}
}
int
send_ping_once(struct udp_connect *conn)
{
int retval = 0;
struct udp_message data = {
.padding = {0, 0},
.spi = htonl(conn->spi),
};
data.seqno = htonl(conn->seqno++);
struct sockaddr_in dst_addr = {
.sin_family = AF_INET,
.sin_port = htons(conn->remote_port),
.sin_addr = {
.s_addr = inet_addr(conn->remote_address),
},
};
retval = sendto(conn->socket, &data, sizeof data, 0, (struct sockaddr *)&dst_addr, sizeof dst_addr);
if (retval <= 0) {
VLOG_WARN_RL(&rl, "%s: could not send data\n", conn->remote_address);
}
return retval;
}
int
recv_ping_once(struct udp_server *srv, struct sockaddr_in *addr, u_int8_t *buf, size_t len)
{
struct udp_message *data = (struct udp_message *)buf;
int retval = 0, addrlen = sizeof *addr;
memset(data, 0, sizeof *data);
retval = recvfrom(srv->socket, buf, len, 0, (struct sockaddr *)addr, &addrlen);
if ( retval <= 0 ) {
if (errno == EAGAIN) {
return 0;
}
VLOG_ERR_RL(&rl, "recvfrom: %s\n", strerror(errno));
return retval;
}
const char *remote_addr = inet_ntoa(addr->sin_addr);
VLOG_DBG("recvfrom: [%s:%d] %d bytes\n", remote_addr, ntohs(addr->sin_port), retval);
print_hex("recvfrom: ", buf, retval);
return retval;
}
int
open_socket(struct udp_server *srv)
{
int op = 1;
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(srv->port),
.sin_addr = {
.s_addr = INADDR_ANY,
},
};
srv->socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (srv->socket == -1) {
return -1;
}
if (setsockopt(srv->socket, SOL_SOCKET, SO_REUSEADDR, (void *)&op, sizeof op) < 0) {
return -1;
}
if (bind(srv->socket, (struct sockaddr *)&addr, sizeof addr) == -1) {
return -1;
}
set_nonblocking(srv->socket);
return srv->socket;
}
int
configure_socket(struct udp_server *srv)
{
int encap = UDP_ENCAP_ESPINUDP;
if (setsockopt(srv->socket, IPPROTO_UDP, UDP_ENCAP, &encap, sizeof encap) < 0) {
return -1;
}
return srv->socket;
}
-40
View File
@@ -1,40 +0,0 @@
#ifndef __OPENUDP_UDP_H
#define __OPENUDP_UDP_H 1
#include <netinet/in.h>
#include "openvswitch/shash.h"
struct udp_message {
u_int32_t padding[2];
u_int32_t spi;
u_int32_t seqno;
};
struct udp_server {
u_int16_t port;
int32_t socket;
long long int send_t;
};
struct udp_connect {
int32_t socket;
int32_t remote_port;
const char *remote_address;
u_int32_t spi;
u_int32_t seqno;
};
int send_ping_once(struct udp_connect *);
int recv_ping_once(struct udp_server *, struct sockaddr_in *, u_int8_t *, size_t);
int open_socket(struct udp_server *);
int configure_socket(struct udp_server *);
static inline void shash_empty(struct shash *sh)
{
shash_destroy(sh);
shash_init(sh);
}
#endif
-20
View File
@@ -1,20 +0,0 @@
/*
* Copyright (c) 2021-2022 OpenLAN Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
*/
#ifndef OPENUDP_VERSION_H
#define OPENUDP_VERSION_H 1
#define CORE_PACKAGE_STRING "opencore 22.09.10"
#define CORE_PACKAGE_VERSION "22.09.10"
#define CORE_LIB_VERSION 0
#define CORE_LIB_REVISION 0
#define CORE_LIB_AGE 0
#endif /* version.h */
+2 -5
View File
@@ -6,13 +6,10 @@ Summary: OpenLAN's Project Software
Group: Applications/Communications
License: GPL-3.0
URL: https://github.com/luscis/openlan
BuildRequires: unbound-devel openssl-devel libcap-ng-devel
Requires: net-tools, iptables, iputils, openvpn, openssl, openvswitch, dnsmasq
Requires: net-tools, iptables, iputils, openvpn, openvswitch, dnsmasq
# binary no-debug by go build
%define __debug_install_post \
%{_rpmconfigdir}/find-debuginfo.sh %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\
%{nil}
%global debug_package %{nil}
%description
OpenLAN's Project Software
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
-41
View File
@@ -1,41 +0,0 @@
package main
import "fmt"
func main() {
var a = []int{1, 2, 3}
fmt.Println(a)
a0 := append(a, []int{4, 5, 6}...)
a0[0] = 9
a1 := append(a, []int{7, 8}...)
fmt.Println(a, a0)
fmt.Println(a, a1)
a0 = append(a[:3], []int{4, 5, 6}...)
a0[0] = 9
a1 = append(a[:3], []int{7, 8}...)
fmt.Println(a, a0)
fmt.Println(a, a1)
a = make([]int, 0, 1024)
b := append(a, []int{4, 5, 6}...)
fmt.Println(b, a)
//fmt.Println(cap(b), len(b))
//fmt.Println(cap(a), len(a))
c := append(b, []int{8, 9}...)
c[1] = 10
b[0] = 9
fmt.Println(c, b)
//fmt.Println(cap(c), len(c))
//fmt.Println(cap(b), len(b))
bb := b
b = append(b, []int{8, 9}...)
bb[2] = 11
fmt.Println(b, bb)
//fmt.Println(cap(bb), len(bb))
//fmt.Println(cap(b), len(b))
}
-39
View File
@@ -1,39 +0,0 @@
package main
import (
"encoding/json"
"fmt"
)
func InArray(data []int) {
data[0] = 0x04
fmt.Println(data)
}
func main() {
var a = []int{1, 2, 3}
fmt.Println(a)
InArray(a)
fmt.Println(a)
b := a
a[1] = 5
fmt.Println(a, b)
b[1] = 6
fmt.Println(a, b)
c := a[1:]
a[2] = 10
fmt.Println(a, c)
c[1] = 11
fmt.Println(a, c)
var aa []int
str := `[1, 2, 3]`
err := json.Unmarshal([]byte(str), &aa)
fmt.Println(err)
fmt.Println(aa)
}
-61
View File
@@ -1,61 +0,0 @@
package main
import (
"bytes"
"crypto/x509"
"encoding/pem"
"fmt"
"io/ioutil"
"log"
"time"
)
func CertificateText(cert *x509.Certificate) (string, error) {
var buf bytes.Buffer
buf.Grow(4096) // 4KiB should be enough
buf.WriteString(fmt.Sprintf("Certificate:\n"))
buf.WriteString(fmt.Sprintf("%4sData:\n", ""))
buf.WriteString(fmt.Sprintf("%8sSerial Number: %d (%#x)\n", "", cert.SerialNumber, cert.SerialNumber))
buf.WriteString(fmt.Sprintf("%4sSignature Algorithm: %s\n", "", cert.SignatureAlgorithm))
// Issuer information
buf.WriteString(fmt.Sprintf("%8sIssuer: ", ""))
// Validity information
buf.WriteString(fmt.Sprintf("%8sValidity\n", ""))
buf.WriteString(fmt.Sprintf("%12sNot Before: %s\n", "", cert.NotBefore.Format("Jan 2 15:04:05 2006 MST")))
buf.WriteString(fmt.Sprintf("%12sNot After : %s\n", "", cert.NotAfter.Format("Jan 2 15:04:05 2006 MST")))
now := time.Now()
if now.Before(cert.NotBefore) {
buf.WriteString(fmt.Sprintf("current time %s is before %s\n", now.Format(time.RFC3339), cert.NotBefore.Format(time.RFC3339)))
} else if now.After(cert.NotAfter) {
buf.WriteString(fmt.Sprintf("current time %s is after %s\n", now.Format(time.RFC3339), cert.NotAfter.Format(time.RFC3339)))
}
return buf.String(), nil
}
func main() {
// Read and parse the PEM certificate file
pemData, err := ioutil.ReadFile("cert.pem")
if err != nil {
log.Fatal(err)
}
block, rest := pem.Decode(pemData)
if block == nil || len(rest) > 0 {
log.Fatal("Certificate decoding error")
}
cert, err := x509.ParseCertificate(block.Bytes)
if err != nil {
log.Fatal(err)
}
// Print the certificate
result, err := CertificateText(cert)
if err != nil {
log.Fatal(err)
}
fmt.Print(result)
}
-10
View File
@@ -1,10 +0,0 @@
package main
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
ch <- 3
}
File diff suppressed because it is too large Load Diff
-33
View File
@@ -1,33 +0,0 @@
#!/bin/bash
set -ex
ips="china.list"
origin="3398"
outside="3396"
originGw="192.168.7.1"
outsideGw="192.168.10.11"
clean_rule() {
local table=$1
local tmp="${table}.rules"
ip rule show | grep "lookup ${table}" | awk -F ':' '{print $2}' > $tmp
while read -r line; do ip rule del ${line}; done < $tmp
}
ip route flush table ${outside}
ip route add default via ${outsideGw} table ${outside}
ip route flush table ${origin}
ip route add default via ${originGw} table ${origin}
clean_rule ${outside}
ip rule add from 172.33.196.0/24 lookup ${outside}
clean_rule ${origin}
for i in $(cat ${ips}); do
ip rule add from 172.33.196.0/24 to $i lookup ${origin};
done
-36
View File
@@ -1,36 +0,0 @@
# new chain
ebtables -N acl-1
ebtables -P acl-1 DROP
# enable tap3
ebtables -A INPUT -i tap3 -j acl-1
# ipv4
ebtables -A acl-1 -p ipv4 --ip-dst 192.168.70.0/24 -j ACCEPT
ebtables -A acl-1 -p ipv4 --ip-dst 192.168.10.0/24 -j ACCEPT
ebtables -A acl-1 -p ipv4 --ip-src 172.16.100.0/24 -j ACCEPT
# icmp 1
ebtavles -A acl-1 -p ipv4 --ip-proto 1 --ip-dst 192.168.7.1 -j ACCEPT
# udp 17
ebtavles -A acl-1 -p ipv4 --ip-proto 17 --ip-dst 192.168.7.1 --ip-dport 53 -j ACCEPT
ebtavles -A acl-1 -p ipv4 --ip-proto 17 --ip-src 192.168.7.2 --ip-sport 68 -j ACCEPT
# tcp 6
ebtavles -A acl-1 -p ipv4 --ip-proto 6 --ip-dst 192.168.7.1 --ip-dport 80 -j ACCEPT
ebtavles -A acl-1 -p ipv4 --ip-proto 6 --ip-dst 192.168.7.2 --ip-dport 443 -j ACCEPT
# remove chain
ebtables -X acl-1
-17
View File
@@ -1,17 +0,0 @@
package main
import (
"flag"
"os"
)
func main() {
var alias string
var cl0 = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
flag.StringVar(&alias, "alias", "", "the alias for this point")
cl0.Var(&alias, name, usage)
cl0.Parse(os.Args[1:])
print(alias)
}
-69
View File
@@ -1,69 +0,0 @@
package main
import (
"encoding/json"
"fmt"
"net"
)
//
type Hi struct {
Name string
}
//
type HardwareAddr struct {
net.HardwareAddr
}
//
func (h HardwareAddr) MarshalText() ([]byte, error) {
if len([]byte(h.HardwareAddr)) == 0 {
return []byte(""), nil
}
return []byte(h.String()), nil
}
//
func (h *HardwareAddr) UnmarshalText(text []byte) error {
if len(text) == 0 {
*h = HardwareAddr{nil}
return nil
}
s := string(text)
x, err := net.ParseMAC(s)
if err != nil {
return &net.ParseError{Type: "Hardware address", Text: s}
}
*h = HardwareAddr{x}
return nil
}
type Test struct {
Username string `json:"Password,omitempty"`
Password string `json:"Password,omit"`
HwAddr HardwareAddr `json:"HwAddr"`
Hi int `json:"Hi,string"`
}
func main() {
t := Test{
Username: "hi",
Password: "daniel",
Hi: 0x21,
}
hw, _ := net.ParseMAC("2a:60:84:bd:fe:50")
t.HwAddr = HardwareAddr{hw}
str, err := json.Marshal(t)
fmt.Println(string(str), err)
o := &Test{}
err = json.Unmarshal([]byte(str), o)
fmt.Println(o, err)
}
-19
View File
@@ -1,19 +0,0 @@
package main
import (
"github.com/xtaci/kcp-go/v5"
"time"
)
func main() {
conn, err := kcp.DialWithOptions("192.168.7.30:9999", nil, 10, 3)
if err != nil {
panic(err)
}
for {
data := make([]byte, 4096)
_, _ = conn.Write(data)
time.Sleep(time.Second)
}
}
-37
View File
@@ -1,37 +0,0 @@
package main
import (
"fmt"
"github.com/xtaci/kcp-go/v5"
"io"
"net"
)
func main() {
fmt.Println("kcp listens on 10000")
lis, err := kcp.ListenWithOptions(":10000", nil, 10, 3)
if err != nil {
panic(err)
}
for {
conn, e := lis.AcceptKCP()
if e != nil {
panic(e)
}
go func(conn net.Conn) {
var buffer = make([]byte, 4096)
for {
n, e := conn.Read(buffer)
if e != nil {
if e == io.EOF {
fmt.Println("receive EOF")
break
}
fmt.Println(e)
break
}
fmt.Println("receive from client:", buffer[:n])
}
}(conn)
}
}
-30
View File
@@ -1,30 +0,0 @@
package main
import (
"fmt"
"github.com/luscis/openlan/pkg/libol"
"os"
)
func main() {
cfg := libol.LDAPConfig{}
cfg.Server = os.Getenv("LDAPServer")
cfg.Password = os.Getenv("LDAPPassword")
cfg.BaseDN = os.Getenv("LDAPBaseDN")
cfg.BindDN = os.Getenv("LDAPBindDN")
cfg.Filter = os.Getenv("LDAPFilter")
cfg.Attr = os.Getenv("LDAPAttr")
if l, err := libol.NewLDAPService(cfg); err != nil {
panic(err)
} else {
username := os.Getenv("username")
password := os.Getenv("password")
if ok, err := l.Login(username, password); !ok {
panic(err)
} else {
fmt.Println("success")
}
}
fmt.Println(cfg)
}
-15
View File
@@ -1,15 +0,0 @@
package main
import (
"fmt"
)
func main() {
c := make(map[int]map[int]string, 32)
for i := 0; i < 64; i++ {
c[i] = make(map[int]string, 2)
}
fmt.Printf("%d,%s\n", len(c), c)
}
-13
View File
@@ -1,13 +0,0 @@
package main
import (
"fmt"
"github.com/vishvananda/netns"
)
func main() {
ns, err := netns.GetFromName("hi")
fmt.Println(ns, err)
ns, err = netns.GetFromName("dan")
fmt.Println(ns, err)
}
-135
View File
@@ -1,135 +0,0 @@
# Generate by OpenLAN
client
dev tun
route-metric 300
proto tcp
remote 19.68.0.26 1194
reneg-sec 0
resolv-retry infinite
nobind
persist-key
persist-tun
<ca>
-----BEGIN CERTIFICATE-----
MIIFKjCCBBKgAwIBAgIJANfUK13p8Z+CMA0GCSqGSIb3DQEBCwUAMIG+MQswCQYD
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMU2FuRnJhbmNp
c2NvMRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24xHTAbBgNVBAsTFE15T3JnYW5pemF0
aW9uYWxVbml0MRgwFgYDVQQDEw9Gb3J0LUZ1bnN0b24gQ0ExEDAOBgNVBCkTB0Vh
c3lSU0ExITAfBgkqhkiG9w0BCQEWEm1lQG15aG9zdC5teWRvbWFpbjAeFw0yMTA4
MDgyMDEyMTVaFw0zMTA4MDYyMDEyMTVaMIG+MQswCQYDVQQGEwJVUzETMBEGA1UE
CBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxG
b3J0LUZ1bnN0b24xHTAbBgNVBAsTFE15T3JnYW5pemF0aW9uYWxVbml0MRgwFgYD
VQQDEw9Gb3J0LUZ1bnN0b24gQ0ExEDAOBgNVBCkTB0Vhc3lSU0ExITAfBgkqhkiG
9w0BCQEWEm1lQG15aG9zdC5teWRvbWFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAKwKj0xC7K5ZudeiZ/0fN00t0Hc7qhq/fGcdr/xpuueJANjfYmXX
caoUxjbvf4XuuqhBAHIoFnqQI18hPhoGH+PrEFvdolwjF0Dx2//33GzMlpkel+UY
V390Pg2TTsVs1m5uSN6CQkyoCQvAqFUwphf8iwBMqw1HEyh6SxgiS4MV2UQxXHRq
J/cVH+8+VxLXBEa55jo7zhYcLZLGHJFOfg4c8L4F5HYqUDxqHJY6XP1h81gtHSTy
Yd9iWCVuAQK9kz/cRyy9KQJvOhZKlXhAQelCVFhIDJe8hyB3WG0orJPN2KPOsHit
GsEfwtYYz6DX2lW5QamxoNXb1lOgI63HOvsCAwEAAaOCAScwggEjMB0GA1UdDgQW
BBTzxft5067dONyt5xPCjfYLy9swpjCB8wYDVR0jBIHrMIHogBTzxft5067dONyt
5xPCjfYLy9swpqGBxKSBwTCBvjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlm
b3JuaWExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMGA1UEChMMRm9ydC1GdW5z
dG9uMR0wGwYDVQQLExRNeU9yZ2FuaXphdGlvbmFsVW5pdDEYMBYGA1UEAxMPRm9y
dC1GdW5zdG9uIENBMRAwDgYDVQQpEwdFYXN5UlNBMSEwHwYJKoZIhvcNAQkBFhJt
ZUBteWhvc3QubXlkb21haW6CCQDX1Ctd6fGfgjAMBgNVHRMEBTADAQH/MA0GCSqG
SIb3DQEBCwUAA4IBAQAA6V1dYzIe+eeCL2mR3mxsmlRa2M4qJ0ZNUt1nuTOKL9ky
q0u1jEKoOnXLR39a48s+XkI3D19gMH/I/1ZXlOzkoLai6xH2HuuYp52QfXFtniIc
n8hbghOZzN1+9l3QybsnLfT95kfaCzglFOjJgj93Zmm6eKrS2LRuoBHO0j/KjtUR
MQ/B0GRpBMvQ783ubFsJfaeroYQK7HPo8BkHvRxUZcfOJu18rIvFd+/7D7HXBXah
zBkaog+42DKatEgQTVpb+DzQyA25VFPLMlE/RrCKThDiG4mh8TZ51ypbiLlaEzSf
m8hzzWj/H2HUgCY7c0voDy/hX4B7CBAEh2FywdCm
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
MIIFZzCCBE+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMx
EzARBgNVBAgTCkNhbGlmb3JuaWExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMG
A1UEChMMRm9ydC1GdW5zdG9uMR0wGwYDVQQLExRNeU9yZ2FuaXphdGlvbmFsVW5p
dDEYMBYGA1UEAxMPRm9ydC1GdW5zdG9uIENBMRAwDgYDVQQpEwdFYXN5UlNBMSEw
HwYJKoZIhvcNAQkBFhJtZUBteWhvc3QubXlkb21haW4wHhcNMjEwODA4MjAxMzA1
WhcNMzEwODA2MjAxMzA1WjCBtTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlm
b3JuaWExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMGA1UEChMMRm9ydC1GdW5z
dG9uMR0wGwYDVQQLExRNeU9yZ2FuaXphdGlvbmFsVW5pdDEPMA0GA1UEAxMGZGFu
aWVsMRAwDgYDVQQpEwdFYXN5UlNBMSEwHwYJKoZIhvcNAQkBFhJtZUBteWhvc3Qu
bXlkb21haW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDb7+9Ykthm
/YHo+zWm1/XYH/8l1TNSQvzElpYArrxrPYHF2+OKRsASerUAQoBWla8x+lQqWD0F
F8D2FDRK4c7jkN0tLJOlQknOeSqEV9rpiJD30T0AvLfXrNdQFoO9AGck3YTg9flp
P6YY2yVOXLi+LFj1l20EQk3N0nst13q3YqpCfI5FXosjjL7RBFMiXUp83y44kutZ
/x22ocytTzoixe8bkAk3SWYVJMVTQGyj79ZsPRd1yaRq0vD4QJv/zMOg+b6Bng6x
+/gQHo/obDBvXQeOPgExgCH78+BP1dNJuYVa+4Nj2PMzNT+6rwcHUGyMJQdrnbI5
ojwdDBpOLhezAgMBAAGjggF1MIIBcTAJBgNVHRMEAjAAMC0GCWCGSAGG+EIBDQQg
Fh5FYXN5LVJTQSBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFDU2Caej
DI9yYch2Xp/xNYJdEnRfMIHzBgNVHSMEgeswgeiAFPPF+3nTrt043K3nE8KN9gvL
2zCmoYHEpIHBMIG+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEV
MBMGA1UEBxMMU2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24xHTAb
BgNVBAsTFE15T3JnYW5pemF0aW9uYWxVbml0MRgwFgYDVQQDEw9Gb3J0LUZ1bnN0
b24gQ0ExEDAOBgNVBCkTB0Vhc3lSU0ExITAfBgkqhkiG9w0BCQEWEm1lQG15aG9z
dC5teWRvbWFpboIJANfUK13p8Z+CMBMGA1UdJQQMMAoGCCsGAQUFBwMCMAsGA1Ud
DwQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAceXlLb/1hVmCfDecwuCEG+WQ3NUC
mVRV+fkLRghYqj2vxqxjU3d97ykeW9o2ksWujDIzHl65HPIj4+FRHH7ohDgkJxT8
oER/JHuTGWTGVntfWCs7TbbnrNhW00574cri+VDgfhnT4SwKZNZXKKyQt4qMY8qO
2yr14o28A2aNb692SaqrDax/zcl3d0MR3SgPjxJ/suctFm7JuAPF+87JVogVFeoM
bTFQJDLirSrORpzHluAJ7zDfKsYsrSsCb3jUy2cuxETM+AnbAfOe4xVHzRdlqdfD
HVdTTPpUl+G2gHRLbZmdfZ2t5uaMM+lDOnr9sUfu7G+Zl4sKw9y3VAGTTg==
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDb7+9Ykthm/YHo
+zWm1/XYH/8l1TNSQvzElpYArrxrPYHF2+OKRsASerUAQoBWla8x+lQqWD0FF8D2
FDRK4c7jkN0tLJOlQknOeSqEV9rpiJD30T0AvLfXrNdQFoO9AGck3YTg9flpP6YY
2yVOXLi+LFj1l20EQk3N0nst13q3YqpCfI5FXosjjL7RBFMiXUp83y44kutZ/x22
ocytTzoixe8bkAk3SWYVJMVTQGyj79ZsPRd1yaRq0vD4QJv/zMOg+b6Bng6x+/gQ
Ho/obDBvXQeOPgExgCH78+BP1dNJuYVa+4Nj2PMzNT+6rwcHUGyMJQdrnbI5ojwd
DBpOLhezAgMBAAECggEBAJn5/r0qAWsJLDwqM0OdijZHIGAiRQ3gbApNyrKroqoJ
o6Mb8M9L/Qhy8+k8pZD4tnDs6qPCpuW73ZHqTznloOxc7RvFS5C1OerdlVCWGWLK
A4Qb7vNnK+ZI0Wz2dkCJ2axLkc3VJ0nyD5zzP8j+zTAG6Dj4TJBgwwvHwgk0BGwB
0FfXQpRJBndCn5ypzP9AH6CrfWRbVuCmqvQ5V5SaCbZ76R2WLeyGd5g1ttB+B2A0
z7UFCtJaRcdx2ynEaVeHv5pjpp0UCtWEeQJ5FvXmSeUsGJTiyXOrOUT8ek7Jws6N
LU+9reUutwoarJ30Q8Xvkg5d7qnrQ2McgZwadkcHOEECgYEA/mKmIpaPWpEhkBBQ
w+ZYvVCuZtZEEalu8QUwc/VHDR5aesW9s/EF0nzXHJogr2ppi/J0e0ptavcq/z8I
96QUDImmR8R60Aj6iTeiTWNEVcMMJMlhBkyELch6dKQ1WOTZb96VTZU5z08Y7iMB
TODUZPtGkvxu84MMKIC3WsVbC1ECgYEA3VVPrDInV5UaGJVrLwmYSuIk2XZpnTJN
Czu5Y/qKxMFYQH44qhcuhMtTkVJJ3YdkNi2m//UCcBlqLOnLjJb+DSBvnM85DNCr
NDjJm0BgG7BVUTz7nBtbyF37Bp45db0tU+S4Q8jcM4rq+CYsxkpPCUjkoZWuh/+O
USkf39qcqcMCgYAH1T3MXtp3LXTdHMN/5L3ixnM4U2yxJoh1/3TofSr86mxaz2/x
9H/7ZUCybsSG4j3xwzt2+Gm6G3ZFeclq5rB/WlW2bARkF4KvavkibOYTxfe/wjus
l/qR9lRe9xd1b0aKvU3Xn7qx+XuJCabmmR2xJlOb/w3jjat4K855iw4soQKBgGaV
TssJp9BhC+pO/pGbidlTPS8JQeQY1zqYoNFk4wJUdnnVxp+XBPmJX58gG5owUVMH
D7rcLRgVv283oR71MKSW3wQ3y0JUSLV4iICLcsACl1iCwj9VMtIINPuZRBp85tBW
Vs0cAGtnPIZs8x2ofT9ZaJY30N+5o5WcUOio4ymPAoGBAMzSxeaIx5fexNjrQOHm
c2nJDNIVaFmPQOZiDdMSSsc7eciRo7JE9uD8pb4EJNW5PTOl2C5I4YUmeIiiFmmx
UW9kdY4lnF/aSMX5f5hc8f4Gr7gMmXMybql2U/FZNmeTWrHzgKxwTF3JdhRWdPnB
m9V7OVznMx7oy5lnk8oKYJ+F
-----END PRIVATE KEY-----
</key>
remote-cert-tls server
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
16d05ff3aa529220207d9cde7607e882
200a15fcc3e5a2dc7d6d35b201f49916
a0c5d575f6bc320591ff61adeb53b45c
334792fc6bc676b6c19cf32755fa1409
7abbc61c1bd8afb0cc74cf4bf1d3767a
4b49d624fe6f071f5080bdf286b65ccf
17782d9958442f820dfd0881712e51c8
ec5aada1d4fde6c799e5ccc054e94717
41df7968bba18ec69e44d49a7ab07515
6da55ef36316e29b2ba0ce60ecccc1e1
d01d6f2c949a6f85a4c10f6ffd6b7dd3
d43f4dbdae69864024ba3b1967bc6ab1
fb12a691c1d7733687e06580ea7eab78
d96fd4599e474b23b2adfecefc9ec36f
a2ae116cfae64c7b9b1d37938554579a
d058d04e8179eac0714b7c53310bc42f
-----END OpenVPN Static key V1-----
</tls-auth>
key-direction 1
cipher AES-256-CBC
auth-nocache
verb 4
-143
View File
@@ -1,143 +0,0 @@
# Generate by OpenLAN
local 0.0.0.0
port 1194
proto tcp
dev tun
reneg-sec 0
keepalive 10 120
persist-key
persist-tun
server 100.100.0.0 255.255.0.0
push "route 192.168.122.0 255.255.255.0"
<ca>
-----BEGIN CERTIFICATE-----
MIIFKjCCBBKgAwIBAgIJANfUK13p8Z+CMA0GCSqGSIb3DQEBCwUAMIG+MQswCQYD
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMU2FuRnJhbmNp
c2NvMRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24xHTAbBgNVBAsTFE15T3JnYW5pemF0
aW9uYWxVbml0MRgwFgYDVQQDEw9Gb3J0LUZ1bnN0b24gQ0ExEDAOBgNVBCkTB0Vh
c3lSU0ExITAfBgkqhkiG9w0BCQEWEm1lQG15aG9zdC5teWRvbWFpbjAeFw0yMTA4
MDgyMDEyMTVaFw0zMTA4MDYyMDEyMTVaMIG+MQswCQYDVQQGEwJVUzETMBEGA1UE
CBMKQ2FsaWZvcm5pYTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxG
b3J0LUZ1bnN0b24xHTAbBgNVBAsTFE15T3JnYW5pemF0aW9uYWxVbml0MRgwFgYD
VQQDEw9Gb3J0LUZ1bnN0b24gQ0ExEDAOBgNVBCkTB0Vhc3lSU0ExITAfBgkqhkiG
9w0BCQEWEm1lQG15aG9zdC5teWRvbWFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAKwKj0xC7K5ZudeiZ/0fN00t0Hc7qhq/fGcdr/xpuueJANjfYmXX
caoUxjbvf4XuuqhBAHIoFnqQI18hPhoGH+PrEFvdolwjF0Dx2//33GzMlpkel+UY
V390Pg2TTsVs1m5uSN6CQkyoCQvAqFUwphf8iwBMqw1HEyh6SxgiS4MV2UQxXHRq
J/cVH+8+VxLXBEa55jo7zhYcLZLGHJFOfg4c8L4F5HYqUDxqHJY6XP1h81gtHSTy
Yd9iWCVuAQK9kz/cRyy9KQJvOhZKlXhAQelCVFhIDJe8hyB3WG0orJPN2KPOsHit
GsEfwtYYz6DX2lW5QamxoNXb1lOgI63HOvsCAwEAAaOCAScwggEjMB0GA1UdDgQW
BBTzxft5067dONyt5xPCjfYLy9swpjCB8wYDVR0jBIHrMIHogBTzxft5067dONyt
5xPCjfYLy9swpqGBxKSBwTCBvjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlm
b3JuaWExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMGA1UEChMMRm9ydC1GdW5z
dG9uMR0wGwYDVQQLExRNeU9yZ2FuaXphdGlvbmFsVW5pdDEYMBYGA1UEAxMPRm9y
dC1GdW5zdG9uIENBMRAwDgYDVQQpEwdFYXN5UlNBMSEwHwYJKoZIhvcNAQkBFhJt
ZUBteWhvc3QubXlkb21haW6CCQDX1Ctd6fGfgjAMBgNVHRMEBTADAQH/MA0GCSqG
SIb3DQEBCwUAA4IBAQAA6V1dYzIe+eeCL2mR3mxsmlRa2M4qJ0ZNUt1nuTOKL9ky
q0u1jEKoOnXLR39a48s+XkI3D19gMH/I/1ZXlOzkoLai6xH2HuuYp52QfXFtniIc
n8hbghOZzN1+9l3QybsnLfT95kfaCzglFOjJgj93Zmm6eKrS2LRuoBHO0j/KjtUR
MQ/B0GRpBMvQ783ubFsJfaeroYQK7HPo8BkHvRxUZcfOJu18rIvFd+/7D7HXBXah
zBkaog+42DKatEgQTVpb+DzQyA25VFPLMlE/RrCKThDiG4mh8TZ51ypbiLlaEzSf
m8hzzWj/H2HUgCY7c0voDy/hX4B7CBAEh2FywdCm
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
MIIFhDCCBGygAwIBAgIBATANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMx
EzARBgNVBAgTCkNhbGlmb3JuaWExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMG
A1UEChMMRm9ydC1GdW5zdG9uMR0wGwYDVQQLExRNeU9yZ2FuaXphdGlvbmFsVW5p
dDEYMBYGA1UEAxMPRm9ydC1GdW5zdG9uIENBMRAwDgYDVQQpEwdFYXN5UlNBMSEw
HwYJKoZIhvcNAQkBFhJtZUBteWhvc3QubXlkb21haW4wHhcNMjEwODA4MjAxMjM0
WhcNMzEwODA2MjAxMjM0WjCBuDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlm
b3JuaWExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMGA1UEChMMRm9ydC1GdW5z
dG9uMR0wGwYDVQQLExRNeU9yZ2FuaXphdGlvbmFsVW5pdDESMBAGA1UEAxMJZWFz
eXN0YWNrMRAwDgYDVQQpEwdFYXN5UlNBMSEwHwYJKoZIhvcNAQkBFhJtZUBteWhv
c3QubXlkb21haW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCeI6Cp
lQrmhPRBzwBgeYQlg87PhcwxX6c2D3knlNy1jQqlAsRLVK/wE3YJcMD5ikYo4wNj
H4p7vBRIjv+h9iauPTP7BiO4OBcBfdwwWzRwuaaVO5hu4AMcPXldk7yDn1qeJSyR
RRXsU0VVo/QeLSJgAa9dEdFVyIMw/Sqayi9FGmscDvnBup9sVghT3gc87KTq/fEv
gVi3YDUFiZTcumlFG4S5GW876XL8lAP6zP8nfCor7KDAU4FROLNP7EXOtDg16dMv
0eYEzHoj52Xv05sLy8hrt0I+TOnMX5eFC9Qf7HhWfHMkSo4yfvLl0RD6f6Xyc2rR
iT9Rb7Q9dmymYOQhAgMBAAGjggGPMIIBizAJBgNVHRMEAjAAMBEGCWCGSAGG+EIB
AQQEAwIGQDA0BglghkgBhvhCAQ0EJxYlRWFzeS1SU0EgR2VuZXJhdGVkIFNlcnZl
ciBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQU3S7WHlhAeJZ2KQKCQQxgZc5OEK0wgfMG
A1UdIwSB6zCB6IAU88X7edOu3TjcrecTwo32C8vbMKahgcSkgcEwgb4xCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRUwEwYDVQQHEwxTYW5GcmFuY2lz
Y28xFTATBgNVBAoTDEZvcnQtRnVuc3RvbjEdMBsGA1UECxMUTXlPcmdhbml6YXRp
b25hbFVuaXQxGDAWBgNVBAMTD0ZvcnQtRnVuc3RvbiBDQTEQMA4GA1UEKRMHRWFz
eVJTQTEhMB8GCSqGSIb3DQEJARYSbWVAbXlob3N0Lm15ZG9tYWluggkA19QrXenx
n4IwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEB
CwUAA4IBAQAvtZgEmALJ5ZQBX0yxE7NCvZrQ6Pe6bbABrPCgRv1dnehg10PKBXDc
YfLrdJlL0KZ2d3xfTT2WajR6VUTWXeGP0UeL1sNJUn5oGx8ek3g/nE88JbJeAjAX
uyqCNaRXSYZ30KqmymARarEABpBEizIjwYEjCjTFL3LdQYsE7V21FzkgwaAuNoK8
egR3cCaSPzezauW7iKpwAEuJ5zjIzNaL2Cwlox0/IMUpUjvOKZ4wcyCp+E51gTUd
2TFShQpAEV5SfYNa2ym4VY4ozg4jCzO4py16EVfRXn1SecPfULelLCYyO4licOKa
W52YxuMH+A1BsfouZMbX/ulV1e7OchvV
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCeI6CplQrmhPRB
zwBgeYQlg87PhcwxX6c2D3knlNy1jQqlAsRLVK/wE3YJcMD5ikYo4wNjH4p7vBRI
jv+h9iauPTP7BiO4OBcBfdwwWzRwuaaVO5hu4AMcPXldk7yDn1qeJSyRRRXsU0VV
o/QeLSJgAa9dEdFVyIMw/Sqayi9FGmscDvnBup9sVghT3gc87KTq/fEvgVi3YDUF
iZTcumlFG4S5GW876XL8lAP6zP8nfCor7KDAU4FROLNP7EXOtDg16dMv0eYEzHoj
52Xv05sLy8hrt0I+TOnMX5eFC9Qf7HhWfHMkSo4yfvLl0RD6f6Xyc2rRiT9Rb7Q9
dmymYOQhAgMBAAECggEBAJK/+ysD3X64KLcdMntUqNXrcDLSNgAnhNM9HrAli3+K
6DLi02gYqcA/Pw1ZriqkL6FnsU/+CBP1IFmJIh6Zf6G3uBIdy2371xWSR5A0QwDM
t5LLIBTcGubNAWBeZdU7Put9EdOpacPKLpBfun16Yuj3B1Z1324cyenfNfc44w7b
FMr7lCVDRuf7y7tA7s1qpytlamXJA2svqjnDi1RP7jqnQ6zv9ImbxT1c7LAU9goj
yD/h4EAamqIaqPQtxQ4TGY+NVd8yz5eUZEjqCZx3XUs/FIhp4a5y0gOOTb3MSKt5
ZxKJ52es1BpJfH9CsP4fcFIeqQCcK9LlJTeHuaoDu8UCgYEAzC1ViZoOQI7+Zkxp
SfijXV8qdkY5vqJHaJ5nIzghF9aXshWxYs59z37AmdVvDQTizN+S2apiLjnkBj3S
FnPSuNNyp9JiFSVQd0fUO0hXpwgW/9j4OJYLHUuHmBz7BMZ6/xx4TCRa9RGWRzvF
Lhmt7xEV69MnEAZ+fUBWx4EMO6cCgYEAxkbr2lpy7MPQWY+N2iD3x6DJQ9BxW5bu
ABEN5/bT02WpHK8inyrMPETvj/Vhwk3L0f3B5TdgzlvkM7Yt/1Xc1uGyntZ7b0Gr
+Rr2EK9EcyA267CTfu2nioQVZwTrJZ3nYAea6zl8NDi254J3EnHTRAjIGf5QwZah
dKCshdVkuvcCgYBMmK1AQ+UY3wwdQIk3UOmoe60oVcwP8j0ryFEU61eu47hg/LZh
ROn5z6ldjK5uieizxyQGOF9AzEL4/HQ2LBlfcSPQRaK6IBeByBacbtVDOku2i6UD
RXbB9LXXoPeioPs/fWS729+rlH92FbwxQTz5NMWuhLZg0q7dOifUDFuUfQKBgQDA
CRyRhRzd9+EpfQIUi+2v6ShFh/LilFG6usnPKp6KlmGuKGnN4vOgQ9wKf8zJFfQc
VDuhN3uJIjLpar8uGAkmDb6kXHN8lAxt3hEIo9gV8NOAfqq8Oo0UeU0JVBgzfLYF
qhf/TtPe+DceDpwovxmxQRgdJNUuSifh/2RY0w8WjQKBgQCde1MEkZECPjWwn8u9
v5C0yaA3WrJB1fI3TcKDMF7/3T5fgRzbKj8qB8R+oBmrlme2Tly8C3cAZUOmOII6
5agxljDGxQClgnUiRswmRjBoFy8IyNkDYsuWkJubp42vMm6p6lvgzrjMLcpSPkWK
fvwoR2fqSWaBunrYXue21Jf4Ew==
-----END PRIVATE KEY-----
</key>
<dh>
-----BEGIN DH PARAMETERS-----
MIGHAoGBAIx6EPzOa2XaBAWoDiTwex1REDfNYvgB3RC3qaTjxTPpYerfmAHiOx9k
CLGARNAKtMxwgpR0kdaEbl/XDPJ7OVkcXimo2xhGSyD6giwnWrfcuAPcY6vihJhT
KBa5SyZ7M4rZirbsJ8oYWTB8SyrSUU5cSHrLgkUBzu+6qL8UG1XjAgEC
-----END DH PARAMETERS-----
</dh>
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
16d05ff3aa529220207d9cde7607e882
200a15fcc3e5a2dc7d6d35b201f49916
a0c5d575f6bc320591ff61adeb53b45c
334792fc6bc676b6c19cf32755fa1409
7abbc61c1bd8afb0cc74cf4bf1d3767a
4b49d624fe6f071f5080bdf286b65ccf
17782d9958442f820dfd0881712e51c8
ec5aada1d4fde6c799e5ccc054e94717
41df7968bba18ec69e44d49a7ab07515
6da55ef36316e29b2ba0ce60ecccc1e1
d01d6f2c949a6f85a4c10f6ffd6b7dd3
d43f4dbdae69864024ba3b1967bc6ab1
fb12a691c1d7733687e06580ea7eab78
d96fd4599e474b23b2adfecefc9ec36f
a2ae116cfae64c7b9b1d37938554579a
d058d04e8179eac0714b7c53310bc42f
-----END OpenVPN Static key V1-----
</tls-auth>
key-direction 0
cipher AES-256-CBC
status es.status 5
ifconfig-pool-persist es.ipp
script-security 3
verb 3
-128
View File
@@ -1,128 +0,0 @@
package main
import (
"bufio"
"bytes"
"encoding/binary"
"fmt"
"io"
"log"
"os"
"time"
)
type Package struct {
Version [2]byte // 协议版本
Length int16 // 数据部分长度
Timestamp int64 // 时间戳
HostnameLength int16 // 主机名长度
Hostname []byte // 主机名
TagLength int16 // Tag长度
Tag []byte // Tag
Msg []byte // 数据部分长度
}
func (p *Package) Pack(writer io.Writer) error {
var err error
err = binary.Write(writer, binary.BigEndian, &p.Version)
err = binary.Write(writer, binary.BigEndian, &p.Length)
err = binary.Write(writer, binary.BigEndian, &p.Timestamp)
err = binary.Write(writer, binary.BigEndian, &p.HostnameLength)
err = binary.Write(writer, binary.BigEndian, &p.Hostname)
err = binary.Write(writer, binary.BigEndian, &p.TagLength)
err = binary.Write(writer, binary.BigEndian, &p.Tag)
err = binary.Write(writer, binary.BigEndian, &p.Msg)
return err
}
func (p *Package) Unpack(reader io.Reader) error {
var err error
err = binary.Read(reader, binary.BigEndian, &p.Version)
err = binary.Read(reader, binary.BigEndian, &p.Length)
err = binary.Read(reader, binary.BigEndian, &p.Timestamp)
err = binary.Read(reader, binary.BigEndian, &p.HostnameLength)
p.Hostname = make([]byte, p.HostnameLength)
err = binary.Read(reader, binary.BigEndian, &p.Hostname)
err = binary.Read(reader, binary.BigEndian, &p.TagLength)
p.Tag = make([]byte, p.TagLength)
err = binary.Read(reader, binary.BigEndian, &p.Tag)
p.Msg = make([]byte, p.Length-8-2-p.HostnameLength-2-p.TagLength)
err = binary.Read(reader, binary.BigEndian, &p.Msg)
return err
}
func (p *Package) String() string {
return fmt.Sprintf("version:%s length:%d timestamp:%d hostname:%s tag:%s msg:%s",
p.Version,
p.Length,
p.Timestamp,
p.Hostname,
p.Tag,
p.Msg,
)
}
func Split(data []byte, atEOF bool) (advance int, token []byte, err error) {
if atEOF {
return
}
log.Printf("INDEX: 0x%02x\n", data[0])
if data[0] == 'V' {
if len(data) > 4 {
length := int16(0)
binary.Read(bytes.NewReader(data[2:4]), binary.BigEndian, &length)
if int(length)+4 <= len(data) {
return int(length) + 4, data[:int(length)+4], nil
}
}
}
//scroll to next package.
return 1, data[:1], nil
}
func main() {
hostname, err := os.Hostname()
if err != nil {
log.Fatal(err)
}
pack := &Package{
Version: [2]byte{'V', '1'},
Timestamp: time.Now().Unix(),
HostnameLength: int16(len(hostname)),
Hostname: []byte(hostname),
TagLength: 4,
Tag: []byte("demo"),
Msg: []byte(("现在时间是:" + time.Now().Format("2006-01-02 15:04:05"))),
}
pack.Length = 8 + 2 + pack.HostnameLength + 2 + pack.TagLength + int16(len(pack.Msg))
buf := new(bytes.Buffer)
// 写入四次,模拟TCP粘包效果
pack.Pack(buf)
pack.Pack(buf)
pack.Pack(buf)
pack.Pack(buf)
buf.Write([]byte{0x00, 0x01, 0x02})
pack.Pack(buf)
buf.Write([]byte{'V', 0x01, 0x02, 0x11, 0x12})
pack.Pack(buf)
// scanner
scanner := bufio.NewScanner(buf)
scanner.Split(Split)
for scanner.Scan() {
scannedPack := new(Package)
data := scanner.Bytes()
if len(data) <= 1 {
continue
}
scannedPack.Unpack(bytes.NewReader(data))
log.Println(scannedPack)
}
if err := scanner.Err(); err != nil {
log.Printf("无效数据包 %s", err)
}
}
-17
View File
@@ -1,17 +0,0 @@
# TODO
To Implement OpenLAN prototype by C.
To Implement OpenLAN prototype by C++.
# Golang
v5.2.10: 2 vcpu/ 1G memory
* prototype: 54MiB / 57MiB
* openlan-no-crypt: 32MiB / 57MiB
* openlan-xor-crypt: 21MiB / 57MiB
v5.2.12: 2 vcpu / 1G memory
* openlan-no-trace-no-crypt: 42MiB / 57MiB
* openlan-no-trace-xor-crypt: 41MiB / 57MiB
* openlan-with-trace-xor-crypt: 30MiB / 57MiB
# Protocol
tcp > ws > tls > wss > udp > kcp
-220
View File
@@ -1,220 +0,0 @@
package main
import (
"encoding/binary"
"flag"
"fmt"
"github.com/luscis/openlan/pkg/libol"
"github.com/songgao/water"
"net"
)
// 409Mib on 1000Mb
type socket struct {
conn net.Conn
frames int
buffer []byte
}
func (s *socket) ReadFull() (error, []byte) {
size := len(s.buffer)
if size > 0 {
buf := s.buffer
if size > 4 {
ps := binary.BigEndian.Uint16(buf[2:4])
fs := int(ps) + 4
//fmt.Printf("fs %d, size %d, % x\n", fs, size, buf)
if size >= fs {
s.buffer = buf[fs:]
return nil, buf[:fs]
}
}
}
tmp := make([]byte, 1518*s.frames)
if size > 0 {
copy(tmp[:size], s.buffer[:size])
}
n, err := s.conn.Read(tmp[size:])
if err != nil {
return err, nil
}
//fmt.Printf("n %d, size %d, % x\n", n, size, s.buffer)
rs := size + n
hs := binary.BigEndian.Uint16(tmp[2:4])
fs := int(hs) + 4
//fmt.Printf("rs %d, fs %d, % x\n", rs, fs, tmp[:rs])
if rs >= fs {
s.buffer = tmp[fs:rs]
return nil, tmp[:fs]
} else {
s.buffer = tmp[:rs]
}
return nil, nil
}
func (s *socket) WriteFull(buffer []byte) error {
offset := 0
size := len(buffer)
left := size - offset
for left > 0 {
tmp := buffer[offset:]
n, err := s.conn.Write(tmp)
if err != nil {
return err
}
offset += n
left = size - offset
}
return nil
}
func xClient(addr string, frames int) {
srcAddr := &net.TCPAddr{IP: net.IPv4zero, Port: 0}
dstAddr, err := net.ResolveTCPAddr("tcp", addr)
if err != nil {
fmt.Println(err)
return
}
conn, err := net.DialTCP("tcp", srcAddr, dstAddr)
if err != nil {
fmt.Println(err)
return
}
device, err := water.New(water.Config{DeviceType: water.TAP})
if err != nil {
fmt.Println(err)
return
}
sock := &socket{
conn: conn,
frames: frames,
}
fmt.Printf("Local: <%s> \n", device.Name())
go func() {
frameData := make([]byte, 1600+4)
for {
n, err := device.Read(frameData[4:])
if err != nil {
break
}
if n == 0 || conn == nil {
continue
}
binary.BigEndian.PutUint16(frameData[2:4], uint16(n))
//fmt.Printf("<%s> %d\n", device.Name(), n)
//fmt.Printf("<%s> % x\n", device.Name(), frameData[:20])
err = sock.WriteFull(frameData[:n+4])
if err != nil {
fmt.Println(err)
}
}
}()
for {
err, data := sock.ReadFull()
if err != nil {
fmt.Printf("error during read: %s", err)
break
}
if data == nil {
continue
}
_, err = device.Write(data[4:])
if err != nil {
fmt.Println(err)
break
}
}
_ = conn.Close()
_ = device.Close()
}
func xServer(addr string, frames int) {
laddr, err := net.ResolveTCPAddr("tcp", addr)
if err != nil {
fmt.Println(err)
return
}
listener, err := net.ListenTCP("tcp", laddr)
if err != nil {
fmt.Println(err)
return
}
conn, err := listener.Accept()
if err != nil {
fmt.Println(err)
}
device, err := water.New(water.Config{DeviceType: water.TAP})
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Local : <%s> \n", device.Name())
fmt.Printf("Remote: <%s> \n", conn.LocalAddr().String())
sock := &socket{
conn: conn,
frames: frames,
}
go func() {
for {
err, data := sock.ReadFull()
if err != nil {
fmt.Printf("error during read: %s", err)
break
}
if data == nil {
continue
}
_, err = device.Write(data[4:])
if err != nil {
fmt.Println(err)
}
}
}()
for {
frameData := make([]byte, 1600+4)
n, err := device.Read(frameData[4:])
if err != nil {
break
}
binary.BigEndian.PutUint16(frameData[2:4], uint16(n))
if n == 0 {
continue
}
//fmt.Printf("<%s> %d %x\n", device.Name(), n, frameData[:20])
err = sock.WriteFull(frameData[:n+4])
if err != nil {
fmt.Println(err)
}
}
}
func main() {
address := "127.0.0.1:9981"
mode := "server"
frames := 16
flag.StringVar(&address, "addr", address, "the address listen.")
flag.StringVar(&mode, "mode", mode, "client or server.")
flag.IntVar(&frames, "frames", frames, "frames of buffer.")
flag.Parse()
if mode == "server" {
go xServer(address, frames)
} else if mode == "client" {
go xClient(address, frames)
}
libol.Wait()
}
-206
View File
@@ -1,206 +0,0 @@
package main
import (
"encoding/binary"
"flag"
"fmt"
"github.com/luscis/openlan/pkg/libol"
"github.com/songgao/water"
"net"
)
// 40MB on 1000Mb
func ReadFull(conn net.Conn, buffer []byte) error {
offset := 0
left := len(buffer)
for left > 0 {
tmp := make([]byte, left)
n, err := conn.Read(tmp)
if err != nil {
return err
}
copy(buffer[offset:], tmp)
offset += n
left -= n
}
return nil
}
func WriteFull(conn net.Conn, buffer []byte) error {
offset := 0
size := len(buffer)
left := size - offset
for left > 0 {
tmp := buffer[offset:]
n, err := conn.Write(tmp)
if err != nil {
return err
}
offset += n
left = size - offset
}
return nil
}
func Client(addr string) {
srcAddr := &net.TCPAddr{IP: net.IPv4zero, Port: 0}
dstAddr, err := net.ResolveTCPAddr("tcp", addr)
if err != nil {
fmt.Println(err)
return
}
conn, err := net.DialTCP("tcp", srcAddr, dstAddr)
if err != nil {
fmt.Println(err)
return
}
device, err := water.New(water.Config{DeviceType: water.TAP})
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Local: <%s> \n", device.Name())
go func() {
frameData := make([]byte, 1600+4)
for {
n, err := device.Read(frameData[4:])
if err != nil {
break
}
if n == 0 || conn == nil {
continue
}
binary.BigEndian.PutUint16(frameData[2:4], uint16(n))
//fmt.Printf("<%s> %d\n", device.Name(), n)
//fmt.Printf("<%s> % x\n", device.Name(), frameData[:20])
err = WriteFull(conn, frameData[:n+4])
if err != nil {
fmt.Println(err)
}
}
}()
for {
data := make([]byte, 1600+4)
err := ReadFull(conn, data[:4])
if err != nil {
fmt.Printf("error during read: %s", err)
break
}
size := binary.BigEndian.Uint16(data[2:4])
if size == 0 || size > 1600 {
continue
}
err = ReadFull(conn, data[4:size+4])
if err != nil {
fmt.Printf("error during read: %s", err)
break
}
_, err = device.Write(data[4 : size+4])
if err != nil {
fmt.Println(err)
break
}
}
_ = conn.Close()
_ = device.Close()
}
func Server(addr string) {
laddr, err := net.ResolveTCPAddr("tcp", addr)
if err != nil {
fmt.Println(err)
return
}
listener, err := net.ListenTCP("tcp", laddr)
if err != nil {
fmt.Println(err)
return
}
conn, err := listener.Accept()
if err != nil {
fmt.Println(err)
}
device, err := water.New(water.Config{DeviceType: water.TAP})
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Local : <%s> \n", device.Name())
fmt.Printf("Remote: <%s> \n", conn.LocalAddr().String())
go func() {
data := make([]byte, 1600+4) //MTU:1500, 1500+14+4
for {
err := ReadFull(conn, data[:4])
if err != nil {
fmt.Printf("error during read: %s", err)
}
size := binary.BigEndian.Uint16(data[2:4])
if size == 0 || size > 1600 {
continue
}
//fmt.Printf("%d %x\n", size, data[:20])
err = ReadFull(conn, data[4:size+4])
if err != nil {
fmt.Printf("error during read: %s", err)
}
_, err = device.Write(data[4 : size+4])
if err != nil {
fmt.Println(err)
}
}
}()
for {
frameData := make([]byte, 1600+4)
n, err := device.Read(frameData[4:])
if err != nil {
break
}
binary.BigEndian.PutUint16(frameData[2:4], uint16(n))
if n == 0 {
continue
}
//fmt.Printf("<%s> %d %x\n", device.Name(), n, frameData[:20])
err = WriteFull(conn, frameData[:n+4])
if err != nil {
fmt.Println(err)
}
}
}
func main() {
address := "127.0.0.1:9981"
mode := "server"
flag.StringVar(&address, "addr", address, "the address listen.")
flag.StringVar(&mode, "mode", mode, "client or server.")
flag.Parse()
if mode == "server" {
go Server(address)
} else if mode == "client" {
go Client(address)
}
libol.Wait()
}
-66
View File
@@ -1,66 +0,0 @@
package main
import (
"fmt"
"github.com/songgao/water"
"net"
)
func main() {
sip := net.ParseIP("192.168.4.151")
srcAddr := &net.UDPAddr{IP: net.IPv4zero, Port: 0}
dstAddr := &net.UDPAddr{IP: sip, Port: 9981}
conn, err := net.DialUDP("udp", srcAddr, dstAddr)
if err != nil {
fmt.Println(err)
}
device, err := water.New(water.Config{DeviceType: water.TAP})
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Local: <%s> \n", device.Name())
frameData := make([]byte, 1448+16+8) //1472
go func() {
for {
n, err := device.Read(frameData[8:])
if err != nil {
break
}
if n == 0 || conn == nil {
continue
}
fmt.Printf("<%s> %d\n", device.Name(), n)
fmt.Printf("<%s> % x\n", device.Name(), frameData[:20])
_, err = conn.Write(frameData[:n+8])
if err != nil {
fmt.Println(err)
}
}
}()
data := make([]byte, 1448+16+8)
for {
n, _, err := conn.ReadFromUDP(data)
if err != nil {
fmt.Printf("error during read: %s", err)
}
if n == 0 {
continue
}
fmt.Printf("<%s> %x\n", dstAddr.String(), data[:n])
_, err = device.Write(data[8:n])
if err != nil {
fmt.Println(err)
}
}
conn.Close()
device.Close()
}
-67
View File
@@ -1,67 +0,0 @@
package main
import (
"fmt"
"github.com/songgao/water"
"net"
)
func main() {
var remote *net.UDPAddr
listener, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("0.0.0.0"), Port: 9981})
if err != nil {
fmt.Println(err)
return
}
device, err := water.New(water.Config{DeviceType: water.TAP})
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Local: <%s> \n", device.Name())
fmt.Printf("Local: <%s> \n", listener.LocalAddr().String())
//1500-20-8-8, 16 = 1448
data := make([]byte, 1448+16+8)
go func() {
for {
n, remoteAddr, err := listener.ReadFromUDP(data)
if err != nil {
fmt.Printf("error during read: %s", err)
}
if n == 0 {
continue
}
fmt.Printf("<%s> %d\n", remoteAddr, n)
remote = remoteAddr
//fmt.Printf("<%s> %s\n", remoteAddr, data[:n])
_, err = device.Write(data[8:n])
if err != nil {
fmt.Println(err)
}
}
}()
//udpMtu := 1500-20-8 //1472
frameData := make([]byte, 1448+16+8)
//header := make([]byte, 8)
for {
n, err := device.Read(frameData[8:])
if err != nil {
break
}
fmt.Printf("<%s> %d %x\n", device.Name(), n, frameData[:20])
if n == 0 || remote == nil {
continue
}
_, err = listener.WriteToUDP(frameData[:n+8], remote)
if err != nil {
fmt.Println(err)
}
}
}
-23
View File
@@ -1,23 +0,0 @@
USERCTL=yes
BOOTPROTO=dialup
NAME=DSLppp0
DEVICE=ppp0
TYPE=xDSL
ONBOOT=yes
PIDFILE=/var/run/pppoe-adsl.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
DEFROUTE=yes
SYNCHRONOUS=no
ETH=br-eno1
PROVIDER=DSLppp0
USER=username
PEERDNS=no
DEMAND=no
-65
View File
@@ -1,65 +0,0 @@
# PPPOE Client
```
$ yum -y install rp-pppoe
```
## Configure
```
$ cp /usr/share/doc/rp-pppoe-3.11/configs/pppoe.conf /etc/ppp
$ cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
username * password *
$
$ cat /etc/ppp/pppoe.conf | grep -e ETH -e USER
ETH=eth1
USER=username
$
```
## Start
```
$ pppoe-start
$ pppoe-status
pppoe-status: Link is up and running on interface ppp0
6: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1480 qdisc pfifo_fast state UNKNOWN group default qlen 3
link/ppp
inet 192.168.33.83 peer 192.168.33.1/32 scope global ppp0
valid_lft forever preferred_lft forever
$ iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
```
# PPPOE Server
```
apt-get install pppoe
```
## Configure
```
$ cat /etc/ppp/options | grep -e +chap -e -pap -e dns
ms-dns 192.168.33.1
ms-dns 192.168.33.2
-pap
+chap
$ cat > /etc/ppp/pppoe-server-options << 'EOF'
# PPP options for the PPPoE server
require-chap
lcp-echo-interval 60
lcp-echo-failure 5
logfile /var/log/pppd.log
EOF
$ cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
username * password *
```
## Start
```
modprobe pppoe
pppoe-server -I br-private -L 192.168.33.1 -R 192.168.33.20 -N 20
```
-55
View File
@@ -1,55 +0,0 @@
package main
import (
"fmt"
"golang.org/x/time/rate"
"sync"
"sync/atomic"
"time"
)
func test(limit rate.Limit, burst int, size uint32, wg *sync.WaitGroup) {
var (
numOK = uint32(0)
numFail = uint32(0)
)
// Very slow replenishing bucket.
lim := rate.NewLimiter(limit, burst)
now := time.Now().Unix()
at := time.Now().Add(15 * time.Second)
// Tries to take a token, atomically updates the counter and decreases the wait
// group counter.
f := func() {
if ok := lim.AllowN(time.Now(), int(size)); ok {
//fmt.Printf("%d\n", time.Now().Unix())
atomic.AddUint32(&numOK, size)
} else {
atomic.AddUint32(&numFail, size)
}
}
for at.After(time.Now()) {
go f()
}
dt := time.Now().Unix() - now
fmt.Printf("size = %d rate: %d\n", size, numOK/uint32(dt))
wg.Done()
}
func main() {
const (
limit = 10 * 1024
burst = 10 * 1024 * 2
numRequests = uint32(50)
)
wg := &sync.WaitGroup{}
wg.Add(int(numRequests))
for i := uint32(0); i < numRequests; i++ {
go test(limit, burst, 64+(i*64), wg)
}
wg.Wait()
}
-166
View File
@@ -1,166 +0,0 @@
package main
import (
"fmt"
"io"
"io/ioutil"
"log"
"strconv"
"strings"
"time"
"github.com/chzyer/readline"
)
func usage(w io.Writer) {
io.WriteString(w, "commands:\n")
io.WriteString(w, completer.Tree(" "))
}
// Function constructor - constructs new function for listing given directory
func listFiles(path string) func(string) []string {
return func(line string) []string {
names := make([]string, 0)
files, _ := ioutil.ReadDir(path)
for _, f := range files {
names = append(names, f.Name())
}
return names
}
}
var completer = readline.NewPrefixCompleter(
readline.PcItem("mode",
readline.PcItem("vi"),
readline.PcItem("emacs"),
),
readline.PcItem("login"),
readline.PcItem("say",
readline.PcItemDynamic(listFiles("./"),
readline.PcItem("with",
readline.PcItem("following"),
readline.PcItem("items"),
),
),
readline.PcItem("hello"),
readline.PcItem("bye"),
),
readline.PcItem("setprompt"),
readline.PcItem("setpassword"),
readline.PcItem("bye"),
readline.PcItem("help"),
readline.PcItem("go",
readline.PcItem("build", readline.PcItem("-o"), readline.PcItem("-v")),
readline.PcItem("install",
readline.PcItem("-v"),
readline.PcItem("-vv"),
readline.PcItem("-vvv"),
),
readline.PcItem("test"),
),
readline.PcItem("sleep"),
)
func filterInput(r rune) (rune, bool) {
switch r {
// block CtrlZ feature
case readline.CharCtrlZ:
return r, false
}
return r, true
}
func main() {
l, err := readline.NewEx(&readline.Config{
Prompt: "\033[31m»\033[0m ",
HistoryFile: "/tmp/readline.tmp",
AutoComplete: completer,
InterruptPrompt: "^C",
EOFPrompt: "exit",
HistorySearchFold: true,
FuncFilterInputRune: filterInput,
})
if err != nil {
panic(err)
}
defer l.Close()
setPasswordCfg := l.GenPasswordConfig()
setPasswordCfg.SetListener(func(line []rune, pos int, key rune) (newLine []rune, newPos int, ok bool) {
l.SetPrompt(fmt.Sprintf("Enter password(%v): ", len(line)))
l.Refresh()
return nil, 0, false
})
log.SetOutput(l.Stderr())
for {
line, err := l.Readline()
if err == readline.ErrInterrupt {
if len(line) == 0 {
break
} else {
continue
}
} else if err == io.EOF {
break
}
line = strings.TrimSpace(line)
switch {
case strings.HasPrefix(line, "mode "):
switch line[5:] {
case "vi":
l.SetVimMode(true)
case "emacs":
l.SetVimMode(false)
default:
println("invalid mode:", line[5:])
}
case line == "mode":
if l.IsVimMode() {
println("current mode: vim")
} else {
println("current mode: emacs")
}
case line == "login":
pswd, err := l.ReadPassword("please enter your password: ")
if err != nil {
break
}
println("you enter:", strconv.Quote(string(pswd)))
case line == "help":
usage(l.Stderr())
case line == "setpassword":
pswd, err := l.ReadPasswordWithConfig(setPasswordCfg)
if err == nil {
println("you set:", strconv.Quote(string(pswd)))
}
case strings.HasPrefix(line, "setprompt"):
if len(line) <= 10 {
log.Println("setprompt <prompt>")
break
}
l.SetPrompt(line[10:])
case strings.HasPrefix(line, "say"):
line := strings.TrimSpace(line[3:])
if len(line) == 0 {
log.Println("say what?")
break
}
go func() {
for range time.Tick(time.Second) {
log.Println(line)
}
}()
case line == "bye":
goto exit
case line == "sleep":
log.Println("sleep 4 second")
time.Sleep(4 * time.Second)
case line == "":
default:
log.Println("you said:", strconv.Quote(line))
}
}
exit:
}
-48
View File
@@ -1,48 +0,0 @@
package main
import (
"fmt"
"github.com/vishvananda/netlink"
"net"
"os"
)
func main() {
dest_str := os.Getenv("DEST")
dest := net.ParseIP(dest_str)
routes, err := netlink.RouteList(nil, netlink.FAMILY_V4)
if err != nil {
panic(err)
}
var hit *net.IPNet
for _, rte := range routes {
fmt.Println(rte)
if rte.Dst != nil && !rte.Dst.Contains(dest) {
continue
}
if hit != nil {
rts, _ := rte.Dst.Mask.Size()
ths, _ := hit.Mask.Size()
if rts < ths {
continue
}
}
hit = rte.Dst
ifIndex := rte.LinkIndex
gateway := rte.Gw
if gateway == nil {
gateway = rte.Src
}
fmt.Println("gw", rte.Gw)
link, _ := netlink.LinkByIndex(ifIndex)
addrs, err := netlink.AddrList(link, netlink.FAMILY_V4)
if err != nil {
panic(err)
}
for _, addr := range addrs {
if addr.Contains(gateway) {
fmt.Println("hit ", addr.IP)
}
}
}
}
-24
View File
@@ -1,24 +0,0 @@
package main
import (
"fmt"
"github.com/vishvananda/netlink"
//"net"
)
func main() {
rules, err := netlink.RuleList(netlink.FAMILY_V4)
if err != nil {
panic(err)
}
for _, ru := range rules {
fmt.Println(ru)
}
ru := netlink.NewRule()
//src := &net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.CIDRMask(0, 32)}
ru.Table = 100
ru.Priority = 16383
if err := netlink.RuleAdd(ru); err != nil {
fmt.Printf("%s %s\n", ru, err)
}
}
-58
View File
@@ -1,58 +0,0 @@
package main
import (
"fmt"
"sync"
)
type SMap struct {
Data map[interface{}]interface{}
Lock sync.RWMutex
}
func NewSMap(size int) *SMap {
this := &SMap{
Data: make(map[interface{}]interface{}, size),
}
return this
}
func (sm *SMap) Set(k interface{}, v interface{}) {
sm.Lock.Lock()
defer sm.Lock.Unlock()
sm.Data[k] = v
}
func (sm *SMap) Get(k interface{}) interface{} {
sm.Lock.RLock()
defer sm.Lock.RUnlock()
return sm.Data[k]
}
func (sm *SMap) GetEx(k string) (interface{}, bool) {
sm.Lock.RLock()
defer sm.Lock.RUnlock()
v, ok := sm.Data[k]
return v, ok
}
func main() {
m := NewSMap(1024)
m.Set("hi", 1)
fmt.Println(m)
m.Set("hello", &m)
fmt.Println(m)
a := m.Get("hi").(int)
a = 2
fmt.Println(a)
m.Set("hip", &a)
fmt.Println(m)
b := m.Get("hip").(*int)
*b = 3
fmt.Println(*b)
c := m.Get("hip").(*int)
fmt.Println(m)
fmt.Println(*c)
}
-11
View File
@@ -1,11 +0,0 @@
#!/bin/bash
# modprobe ipt_LOG
# iptables -A OUTPUT -t raw -p icmp -j LOG
# iptables -A PREROUTING -t raw -p icmp -j LOG
BR="br-vxlan"
iptables -t mangle -A FORWARD -i $BR -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1332
-36
View File
@@ -1,36 +0,0 @@
package main
import (
"crypto/tls"
"log"
)
func main() {
log.SetFlags(log.Lshortfile)
conf := &tls.Config{
InsecureSkipVerify: true,
}
conn, err := tls.Dial("tcp", "127.0.0.1:443", conf)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
n, err := conn.Write([]byte("hello\n"))
if err != nil {
log.Println(n, err)
return
}
buf := make([]byte, 100)
n, err = conn.Read(buf)
if err != nil {
log.Println(n, err)
return
}
println(string(buf[:n]))
}
-57
View File
@@ -1,57 +0,0 @@
package main
import (
"bufio"
"crypto/tls"
"log"
"net"
)
func main() {
log.SetFlags(log.Lshortfile)
cer, err := tls.LoadX509KeyPair(
"./resource/ca/crt.pem",
"./resource/ca/private.key")
if err != nil {
log.Println(err)
return
}
config := &tls.Config{Certificates: []tls.Certificate{cer}}
ln, err := tls.Listen("tcp", ":443", config)
if err != nil {
log.Println(err)
return
}
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
log.Println(err)
continue
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
r := bufio.NewReader(conn)
for {
msg, err := r.ReadString('\n')
if err != nil {
log.Println(err)
return
}
println(msg)
n, err := conn.Write([]byte("world\n"))
if err != nil {
log.Println(n, err)
return
}
}
}
-31
View File
@@ -1,31 +0,0 @@
package main
import (
"fmt"
"net"
"time"
)
func main() {
dip := net.ParseIP("192.168.7.30")
srcAddr := &net.UDPAddr{IP: net.IPv4zero, Port: 8888}
dstAddr := &net.UDPAddr{IP: dip, Port: 9999}
conn, err := net.DialUDP("udp", srcAddr, dstAddr)
if err != nil {
fmt.Println(err)
}
data := make([]byte, 4096)
for i := 0; i < len(data); i++ {
data[i] = byte(i)
}
for {
fmt.Printf("% x ... % x\n", data[:16], data[4080:4096])
_, err = conn.Write(data)
if err != nil {
fmt.Println(err)
}
time.Sleep(time.Second)
}
}
-24
View File
@@ -1,24 +0,0 @@
package main
import (
"fmt"
"net"
)
func main() {
listener, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("0.0.0.0"), Port: 9999})
if err != nil {
fmt.Println(err)
return
}
for {
data := make([]byte, 4096*2)
n, remoteAddr, err := listener.ReadFromUDP(data)
if err != nil {
fmt.Printf("error during read: %s", err)
}
fmt.Printf("from %s and %d\n", remoteAddr, n)
fmt.Printf("% x ... % x\n", data[:16], data[4080:4096])
}
}
-24
View File
@@ -1,24 +0,0 @@
#!/usr/bin/env bash
set -ex
vni="100"
local="192.168.7.41"
remote="192.168.7.42"
port="4789"
ssh ${local} /bin/bash <<EOF
set -ex
ip link add vxlan${vni} type vxlan id ${vni} remote ${remote} local ${local} dstport ${port}
ip link set vxlan${vni} up
EOF
ssh ${remote} /bin/bash <<EOF
set -ex
ip link add vxlan${vni} type vxlan id ${vni} remote ${local} local ${remote} dstport ${port}
ip link set vxlan${vni} up
EOF
-20
View File
@@ -1,20 +0,0 @@
# --
sudo ip netns del net00
sudo ip link del veth-local
sudo ip link add veth-local type veth peer name veth-remote
sudo ip link set veth-local up
sudo ip addr add 192.168.100.1/24 dev veth-local
sudo ip route add 192.168.200.0/24 via 192.168.100.1
sudo ip netns add net00
sudo ip link set veth-remote netns net00
sudo ip netns exec net00 ip link set veth-remote up
sudo ip netns exec net00 ip addr add 192.168.100.141/24 dev veth-remote
sudo ip netns exec net00 ip route add 192.168.200.0/24 via 192.168.100.1
-15
View File
@@ -1,15 +0,0 @@
# ping on moon
## host2host
ping 192.168.200.130 -s 1500
## net2net
ip netns exec net00 ping 192.168.200.130 -s 1500
# tcpdump on moon
tcpdump -i ens33 -p esp -nne
-80
View File
@@ -1,80 +0,0 @@
#!/usr/bin/env bash
set -ex
# Topo.
#
# 100.141 -- 200.130
# | |
# 192.168.209.141 <=====> 192.168.209.130
#
auth_key=$(dd if=/dev/urandom count=32 bs=1 2> /dev/null| xxd -p -c 64)
enc_key=$(dd if=/dev/urandom count=32 bs=1 2> /dev/null| xxd -p -c 64)
sun_spi=$(dd if=/dev/urandom count=4 bs=1 2> /dev/null| xxd -p -c 8)
moon_spi=$(dd if=/dev/urandom count=4 bs=1 2> /dev/null| xxd -p -c 8)
reqid=$(dd if=/dev/urandom count=4 bs=1 2> /dev/null| xxd -p -c 8)
sun="$1"; shift
sun_net="$1"; shift
moon="$1"; shift
moon_net="$1"; shift
if [ -z "${sun}${sun_net}${moon}${moon_net}" ]; then
echo "$0 moon moon-net sun sun-net"
exit 0
fi
sun_port="$1";
moon_port="$2";
if [ -z "${sun_port}" ]; then
sun_port="22"
fi
if [ -z "${moon_port}" ]; then
moon_port="22"
fi
ssh -p ${sun_port} ${sun} /bin/bash << EOF
# --
ip xfrm state flush
ip xfrm state add src ${moon} dst ${sun} proto esp spi 0x${moon_spi} reqid 0x${reqid} mode tunnel auth sha256 0x${auth_key} enc aes 0x${enc_key}
ip xfrm state add src ${sun} dst ${moon} proto esp spi 0x${sun_spi} reqid 0x${reqid} mode tunnel auth sha256 0x${auth_key} enc aes 0x${enc_key}
ip xfrm state ls
# --
ip xfrm policy flush
ip xfrm policy add src ${moon_net} dst ${sun_net} dir in ptype main tmpl src ${moon} dst ${sun} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy add src ${moon_net} dst ${sun_net} dir fwd ptype main tmpl src ${moon} dst ${sun} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy add src ${sun_net} dst ${moon_net} dir out ptype main tmpl src ${sun} dst ${moon} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy ls
ip link show dummy0 || ip link add type dummy
ip link set dummy0 up
ip addr replace ${sun_net} dev dummy0
ip route replace ${moon_net} via ${sun_net}
EOF
ssh -p ${moon_port} ${moon} /bin/bash << EOF
# --
ip xfrm state flush
ip xfrm state add src ${sun} dst ${moon} proto esp spi 0x${sun_spi} reqid 0x${reqid} mode tunnel auth sha256 0x${auth_key} enc aes 0x${enc_key}
ip xfrm state add src ${moon} dst ${sun} proto esp spi 0x${moon_spi} reqid 0x${reqid} mode tunnel auth sha256 0x${auth_key} enc aes 0x${enc_key}
ip xfrm state ls
# --
ip xfrm policy flush
ip xfrm policy add src ${sun_net} dst ${moon_net} dir in ptype main tmpl src ${sun} dst ${moon} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy add src ${sun_net} dst ${moon_net} dir fwd ptype main tmpl src ${sun} dst ${moon} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy add src ${moon_net} dst ${sun_net} dir out ptype main tmpl src ${moon} dst ${sun} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy ls
ip link show dummy0 || ip link add type dummy
ip link set dummy0 up
ip addr replace ${moon_net} dev dummy0
ip route replace ${sun_net} via ${moon_net}
EOF
-87
View File
@@ -1,87 +0,0 @@
#!/usr/bin/env bash
set -ex
# Topo.
#
# 100.141 -- 200.130
# | |
# 192.168.209.141 <=====> 192.168.209.130
#
auth_key=$(dd if=/dev/urandom count=32 bs=1 2> /dev/null| xxd -p -c 64)
enc_key=$(dd if=/dev/urandom count=32 bs=1 2> /dev/null| xxd -p -c 64)
sun_spi=$(dd if=/dev/urandom count=4 bs=1 2> /dev/null| xxd -p -c 8)
moon_spi=$(dd if=/dev/urandom count=4 bs=1 2> /dev/null| xxd -p -c 8)
reqid=$(dd if=/dev/urandom count=4 bs=1 2> /dev/null| xxd -p -c 8)
sun="$1"; shift
sun_net="$1"; shift
moon="$1"; shift
moon_net="$1"; shift
if [ -z "${sun}${sun_net}${moon}${moon_net}" ]; then
echo "$0 moon moon-net sun sun-net"
exit 0
fi
sun_port="$1";
moon_port="$2";
if [ -z "${sun_port}" ]; then
sun_port="22"
fi
if [ -z "${moon_port}" ]; then
moon_port="22"
fi
if [ -z "${sun_addr}" ]; then
sun_addr=${sun}
fi
if [ -z "${moon_addr}" ]; then
moon_addr=${moon}
fi
ssh -p ${sun_port} ${sun} /bin/bash << EOF
# --
ip xfrm state flush
ip xfrm state add src ${moon} dst ${sun_addr} proto esp spi 0x${moon_spi} reqid 0x${reqid} mode tunnel auth sha256 0x${auth_key} enc aes 0x${enc_key} encap espinudp 4500 4500 0.0.0.0
ip xfrm state add src ${sun_addr} dst ${moon} proto esp spi 0x${sun_spi} reqid 0x${reqid} mode tunnel auth sha256 0x${auth_key} enc aes 0x${enc_key} encap espinudp 4500 4500 0.0.0.0
ip xfrm state ls
# --
ip xfrm policy flush
ip xfrm policy add src ${moon_net} dst ${sun_net} dir in ptype main tmpl src ${moon} dst ${sun_addr} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy add src ${moon_net} dst ${sun_net} dir fwd ptype main tmpl src ${moon} dst ${sun_addr} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy add src ${sun_net} dst ${moon_net} dir out ptype main tmpl src ${sun_addr} dst ${moon} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy ls
ip link show dummy0 || ip link add type dummy
ip link set dummy0 up
ip addr replace ${sun_net} dev dummy0
ip route replace ${moon_net} via ${sun_net}
EOF
ssh -p ${moon_port} ${moon} /bin/bash << EOF
# --
ip xfrm state flush
ip xfrm state add src ${sun} dst ${moon_addr} proto esp spi 0x${sun_spi} reqid 0x${reqid} mode tunnel auth sha256 0x${auth_key} enc aes 0x${enc_key} encap espinudp 4500 4500 0.0.0.0
ip xfrm state add src ${moon_addr} dst ${sun} proto esp spi 0x${moon_spi} reqid 0x${reqid} mode tunnel auth sha256 0x${auth_key} enc aes 0x${enc_key} encap espinudp 4500 4500 0.0.0.0
ip xfrm state ls
# --
ip xfrm policy flush
ip xfrm policy add src ${sun_net} dst ${moon_net} dir in ptype main tmpl src ${sun} dst ${moon_addr} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy add src ${sun_net} dst ${moon_net} dir fwd ptype main tmpl src ${sun} dst ${moon_addr} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy add src ${moon_net} dst ${sun_net} dir out ptype main tmpl src ${moon_addr} dst ${sun} proto esp reqid 0x${reqid} mode tunnel
ip xfrm policy ls
ip link show dummy0 || ip link add type dummy
ip link set dummy0 up
ip addr replace ${moon_net} dev dummy0
ip route replace ${sun_net} via ${moon_net}
EOF
-5
View File
@@ -1,5 +0,0 @@
# ping
ansible openlan -m ping
# upgrade
ansible-playbook upgrade.yaml -e "version=0.8.22"
-21
View File
@@ -1,21 +0,0 @@
---
- hosts: openlan
remote_user: root
vars:
version: 0.8.20
tasks:
- name: download openlan-{{ version }}
copy: src=/root/rpmbuild/RPMS/x86_64/openlan-{{ version }}-1.el7.x86_64.rpm dest=/tmp
- name: upgrade openlan
yum: state=present name=/tmp/openlan-{{ version }}-1.el7.x86_64.rpm
notify:
- restart openlan-confd
- restart openlan-switch
handlers:
- name: restart openlan-confd
service: name=openlan-confd enabled=yes state=restarted
- name: restart openlan-switch
service: name=openlan-switch enabled=yes state=restarted