|
|
@ -1,4 +1,4 @@
|
|
|
|
use std::{fs::OpenOptions, io::Read};
|
|
|
|
use std::{fmt::{Display, Formatter}, fs::OpenOptions, io::{Read, Write}};
|
|
|
|
use rand::Rng;
|
|
|
|
use rand::Rng;
|
|
|
|
|
|
|
|
|
|
|
|
static NETWORK_FILE: &str = "/home/rocker/network";
|
|
|
|
static NETWORK_FILE: &str = "/home/rocker/network";
|
|
|
@ -7,7 +7,7 @@ fn get_gateway_addr(addr: &str) -> String {
|
|
|
|
let prefix = &addr[..addr.len() - 1];
|
|
|
|
let prefix = &addr[..addr.len() - 1];
|
|
|
|
format!("{}0", prefix)
|
|
|
|
format!("{}0", prefix)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fn create_bridge_dev(bridge_name: &str) {
|
|
|
|
fn create_bridge_dev(bridge_name: &str) -> bool {
|
|
|
|
// brctl addbr br0
|
|
|
|
// brctl addbr br0
|
|
|
|
let args = ["addbr", bridge_name];
|
|
|
|
let args = ["addbr", bridge_name];
|
|
|
|
let out = std::process::Command::new("brctl")
|
|
|
|
let out = std::process::Command::new("brctl")
|
|
|
@ -17,10 +17,12 @@ fn create_bridge_dev(bridge_name: &str) {
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("create_bridge_dev: {args:?}");
|
|
|
|
println!("create_bridge_dev: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn set_bridge_ip(bridge_name: &str, addr: &str){
|
|
|
|
fn set_bridge_ip(bridge_name: &str, addr: &str) -> bool {
|
|
|
|
// 设置容器内从ip: ip addr add 192.168.124.1/24 dev bridge_name
|
|
|
|
// 设置容器内从ip: ip addr add 192.168.124.1/24 dev bridge_name
|
|
|
|
let args = ["addr", "add", &format!("{addr}/24"), "dev", bridge_name];
|
|
|
|
let args = ["addr", "add", &format!("{addr}/24"), "dev", bridge_name];
|
|
|
|
let out = std::process::Command::new("ip")
|
|
|
|
let out = std::process::Command::new("ip")
|
|
|
@ -30,10 +32,12 @@ fn set_bridge_ip(bridge_name: &str, addr: &str){
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_bridge_ip: {args:?}");
|
|
|
|
println!("set_bridge_ip: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn set_slave_ip(slave_veth_name: &str, addr: &str, pid: &str) {
|
|
|
|
fn set_slave_ip(slave_veth_name: &str, addr: &str, pid: &str) -> bool {
|
|
|
|
// nsenter -t 10050 -n -- ip addr add <ip_address>/<subnet_mask> dev veth1
|
|
|
|
// nsenter -t 10050 -n -- ip addr add <ip_address>/<subnet_mask> dev veth1
|
|
|
|
let args = ["-t", pid, "-n", "--", "ip", "addr", "add", &format!("{addr}/24"), "dev", slave_veth_name];
|
|
|
|
let args = ["-t", pid, "-n", "--", "ip", "addr", "add", &format!("{addr}/24"), "dev", slave_veth_name];
|
|
|
|
let out = std::process::Command::new("nsenter")
|
|
|
|
let out = std::process::Command::new("nsenter")
|
|
|
@ -43,10 +47,12 @@ fn set_slave_ip(slave_veth_name: &str, addr: &str, pid: &str) {
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_slave_ip: {args:?}");
|
|
|
|
println!("set_slave_ip: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn set_snat(gateway_addr: &str, bridge_name: &str) {
|
|
|
|
fn set_snat(gateway_addr: &str, bridge_name: &str) -> bool {
|
|
|
|
// sudo iptables -t nat -A POSTROUTING -s 172.18.0.0/24 ! -o br0 -j MASQUERADE
|
|
|
|
// sudo iptables -t nat -A POSTROUTING -s 172.18.0.0/24 ! -o br0 -j MASQUERADE
|
|
|
|
let args = ["-t", "nat", "-A", "POSTROUTING", "-s", &format!("{gateway_addr}/24"), "!", "-o", bridge_name, "-j", "MASQUERADE"];
|
|
|
|
let args = ["-t", "nat", "-A", "POSTROUTING", "-s", &format!("{gateway_addr}/24"), "!", "-o", bridge_name, "-j", "MASQUERADE"];
|
|
|
|
let out = std::process::Command::new("iptables")
|
|
|
|
let out = std::process::Command::new("iptables")
|
|
|
@ -56,10 +62,12 @@ fn set_snat(gateway_addr: &str, bridge_name: &str) {
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_snat: {args:?}");
|
|
|
|
println!("set_snat: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn set_iptables_forward() {
|
|
|
|
fn set_iptables_forward() -> bool {
|
|
|
|
// sudo sysctl net.ipv4.conf.all.forwarding=1
|
|
|
|
// sudo sysctl net.ipv4.conf.all.forwarding=1
|
|
|
|
let args = ["net.ipv4.conf.all.forwarding=1"];
|
|
|
|
let args = ["net.ipv4.conf.all.forwarding=1"];
|
|
|
|
let out = std::process::Command::new("sysctl")
|
|
|
|
let out = std::process::Command::new("sysctl")
|
|
|
@ -69,6 +77,7 @@ fn set_iptables_forward() {
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_iptables_forward: {args:?}");
|
|
|
|
println!("set_iptables_forward: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// sudo iptables -t filter -P FORWARD ACCEPT
|
|
|
|
// sudo iptables -t filter -P FORWARD ACCEPT
|
|
|
|
let args = ["-t", "filter", "-P", "FORWARD", "ACCEPT"];
|
|
|
|
let args = ["-t", "filter", "-P", "FORWARD", "ACCEPT"];
|
|
|
@ -79,11 +88,13 @@ fn set_iptables_forward() {
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_iptables_forward: {args:?}");
|
|
|
|
println!("set_iptables_forward: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn set_slave_route(slave_veth_name: &str, bridge_addr: &str, pid: &str) {
|
|
|
|
fn set_slave_route(slave_veth_name: &str, bridge_addr: &str, pid: &str) -> bool {
|
|
|
|
// sudo nsenter -t 1851 -n -- ip route add default via 172.18.0.1 dev veth3
|
|
|
|
// sudo nsenter -t 1851 -n -- ip route add default via 172.18.0.1 dev veth3
|
|
|
|
let args = ["-t", pid, "-n", "--", "ip", "route", "add", "default", "via", bridge_addr, "dev", slave_veth_name];
|
|
|
|
let args = ["-t", pid, "-n", "--", "ip", "route", "add", "default", "via", bridge_addr, "dev", slave_veth_name];
|
|
|
|
let out = std::process::Command::new("nsenter")
|
|
|
|
let out = std::process::Command::new("nsenter")
|
|
|
@ -93,10 +104,12 @@ fn set_slave_route(slave_veth_name: &str, bridge_addr: &str, pid: &str) {
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_slave_route: {args:?}");
|
|
|
|
println!("set_slave_route: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn set_net_up(bridge_name: &str, master_veth_name: &str, pid: &str, slave_veth_name: &str) {
|
|
|
|
fn set_net_up(bridge_name: &str, master_veth_name: &str, pid: &str, slave_veth_name: &str) -> bool {
|
|
|
|
// sudo ip link set bridge_name up
|
|
|
|
// sudo ip link set bridge_name up
|
|
|
|
let args = ["link", "set", bridge_name, "up"];
|
|
|
|
let args = ["link", "set", bridge_name, "up"];
|
|
|
|
let out = std::process::Command::new("ip")
|
|
|
|
let out = std::process::Command::new("ip")
|
|
|
@ -106,6 +119,7 @@ fn set_net_up(bridge_name: &str, master_veth_name: &str, pid: &str, slave_veth_n
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_up: {args:?}");
|
|
|
|
println!("set_up: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// sudo ip link set master_veth_name up
|
|
|
|
// sudo ip link set master_veth_name up
|
|
|
@ -117,6 +131,7 @@ fn set_net_up(bridge_name: &str, master_veth_name: &str, pid: &str, slave_veth_n
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_up: {args:?}");
|
|
|
|
println!("set_up: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// nsenter -t 1970 -n -- ip link set dev slave_veth_name up
|
|
|
|
// nsenter -t 1970 -n -- ip link set dev slave_veth_name up
|
|
|
@ -128,6 +143,7 @@ fn set_net_up(bridge_name: &str, master_veth_name: &str, pid: &str, slave_veth_n
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_up: {args:?}");
|
|
|
|
println!("set_up: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ip link set lo up
|
|
|
|
// ip link set lo up
|
|
|
@ -139,7 +155,9 @@ fn set_net_up(bridge_name: &str, master_veth_name: &str, pid: &str, slave_veth_n
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("set_up: {args:?}");
|
|
|
|
println!("set_up: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn set_up(dev_name: &str) {
|
|
|
|
fn set_up(dev_name: &str) {
|
|
|
@ -211,7 +229,7 @@ fn del_bridge(bridge_name: &str) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn create_veth_pair(master_veth_name: &str, slave_veth_name: &str) {
|
|
|
|
fn create_veth_pair(master_veth_name: &str, slave_veth_name: &str) -> bool {
|
|
|
|
// sudo ip link add master_veth_name type veth peer name slave_veth_name
|
|
|
|
// sudo ip link add master_veth_name type veth peer name slave_veth_name
|
|
|
|
let args = ["link", "add", master_veth_name, "type", "veth", "peer", "name", slave_veth_name];
|
|
|
|
let args = ["link", "add", master_veth_name, "type", "veth", "peer", "name", slave_veth_name];
|
|
|
|
let out = std::process::Command::new("ip")
|
|
|
|
let out = std::process::Command::new("ip")
|
|
|
@ -221,7 +239,9 @@ fn create_veth_pair(master_veth_name: &str, slave_veth_name: &str) {
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("create_veth_pair: {args:?}");
|
|
|
|
println!("create_veth_pair: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -236,6 +256,12 @@ struct NetWrok {
|
|
|
|
slave_veth_name: String, // ro_uuid[:8]_3 // ip 就是 192.168.124.3, 插在容器中
|
|
|
|
slave_veth_name: String, // ro_uuid[:8]_3 // ip 就是 192.168.124.3, 插在容器中
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl Display for NetWrok {
|
|
|
|
|
|
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
|
|
|
|
|
|
write!(f, "{},{},{},{},{},{}", self.gateway_addr, self.bridge_addr, self.slave_addr, self.bridge_name, self.master_veth_name, self.slave_veth_name)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
fn get_all_network() -> Vec<NetWrok> {
|
|
|
|
fn get_all_network() -> Vec<NetWrok> {
|
|
|
|
// 打开 NETWORK_FILE 所有已经配置的信息, 如果没有则创建
|
|
|
|
// 打开 NETWORK_FILE 所有已经配置的信息, 如果没有则创建
|
|
|
|
let mut f = OpenOptions::new()
|
|
|
|
let mut f = OpenOptions::new()
|
|
|
@ -246,10 +272,24 @@ fn get_all_network() -> Vec<NetWrok> {
|
|
|
|
.unwrap();
|
|
|
|
.unwrap();
|
|
|
|
let mut text = String::new();
|
|
|
|
let mut text = String::new();
|
|
|
|
f.read_to_string(&mut text).unwrap();
|
|
|
|
f.read_to_string(&mut text).unwrap();
|
|
|
|
vec![]
|
|
|
|
|
|
|
|
|
|
|
|
let mut all_network = vec![];
|
|
|
|
|
|
|
|
for line in text.lines() {
|
|
|
|
|
|
|
|
let network_info_vec = line.split(",").collect::<Vec<&str>>();
|
|
|
|
|
|
|
|
all_network.push(NetWrok {
|
|
|
|
|
|
|
|
gateway_addr: network_info_vec[0].to_string(),
|
|
|
|
|
|
|
|
bridge_addr: network_info_vec[1].to_string(),
|
|
|
|
|
|
|
|
slave_addr: network_info_vec[2].to_string(),
|
|
|
|
|
|
|
|
bridge_name: network_info_vec[3].to_string(),
|
|
|
|
|
|
|
|
master_veth_name: network_info_vec[4].to_string(),
|
|
|
|
|
|
|
|
slave_veth_name: network_info_vec[5].to_string(),
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
all_network
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn master_join_bridge(bridge_name: &str, master_veth_name: &str) {
|
|
|
|
fn master_join_bridge(bridge_name: &str, master_veth_name: &str) -> bool {
|
|
|
|
// 将主端链接到桥
|
|
|
|
// 将主端链接到桥
|
|
|
|
//sudo brctl addif bridge_name master_veth_name
|
|
|
|
//sudo brctl addif bridge_name master_veth_name
|
|
|
|
let args = ["addif", bridge_name, master_veth_name];
|
|
|
|
let args = ["addif", bridge_name, master_veth_name];
|
|
|
@ -260,10 +300,23 @@ fn master_join_bridge(bridge_name: &str, master_veth_name: &str) {
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("master_join_bridge: {args:?}");
|
|
|
|
println!("master_join_bridge: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn write_network_info(all_network: Vec<NetWrok>) {
|
|
|
|
|
|
|
|
let mut f = OpenOptions::new()
|
|
|
|
|
|
|
|
.write(true)
|
|
|
|
|
|
|
|
.create(true)
|
|
|
|
|
|
|
|
.open(NETWORK_FILE)
|
|
|
|
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
for n in all_network {
|
|
|
|
|
|
|
|
writeln!(f, "{}", n).unwrap();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn slave_join_bridge(slave_veth_name: &str, pid: &str) {
|
|
|
|
fn slave_join_bridge(slave_veth_name: &str, pid: &str) -> bool {
|
|
|
|
// 将从端 链接到容器
|
|
|
|
// 将从端 链接到容器
|
|
|
|
// sudo ip link set slave_veth_name netns 1234
|
|
|
|
// sudo ip link set slave_veth_name netns 1234
|
|
|
|
let args = ["link", "set", slave_veth_name, "netns", pid];
|
|
|
|
let args = ["link", "set", slave_veth_name, "netns", pid];
|
|
|
@ -274,10 +327,12 @@ fn slave_join_bridge(slave_veth_name: &str, pid: &str) {
|
|
|
|
if !out.status.success() {
|
|
|
|
if !out.status.success() {
|
|
|
|
println!("slave_join_bridge: {args:?}");
|
|
|
|
println!("slave_join_bridge: {args:?}");
|
|
|
|
println!("{:?}", out);
|
|
|
|
println!("{:?}", out);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn create_network(uuid_name: &str, pid: i32) {
|
|
|
|
pub fn create_network(uuid_name: &str, pid: i32) -> bool {
|
|
|
|
// 创建一个随机地址段的 没分配过的ip
|
|
|
|
// 创建一个随机地址段的 没分配过的ip
|
|
|
|
let mut all_network = get_all_network();
|
|
|
|
let mut all_network = get_all_network();
|
|
|
|
let mut rg = rand::thread_rng();
|
|
|
|
let mut rg = rand::thread_rng();
|
|
|
@ -305,34 +360,40 @@ fn create_network(uuid_name: &str, pid: i32) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
println!("{network}");
|
|
|
|
all_network.push(network.clone());
|
|
|
|
all_network.push(network.clone());
|
|
|
|
// 写入到文件中
|
|
|
|
// 写入到文件中
|
|
|
|
let line = format!("{},{},{},{},{},{}", network.gateway_addr, network.bridge_addr, network.slave_addr, network.bridge_name, network.master_veth_name, network.slave_veth_name);
|
|
|
|
write_network_info(all_network);
|
|
|
|
println!("{line:?}");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 系统中创建桥
|
|
|
|
// 系统中创建桥
|
|
|
|
create_bridge_dev(&network.bridge_name);
|
|
|
|
if create_bridge_dev(&network.bridge_name) &&
|
|
|
|
// 给桥分配ip
|
|
|
|
// 给桥分配ip
|
|
|
|
set_bridge_ip(&network.bridge_name, &network.bridge_addr);
|
|
|
|
set_bridge_ip(&network.bridge_name, &network.bridge_addr) &&
|
|
|
|
// 创建veth pair
|
|
|
|
// 创建veth pair
|
|
|
|
create_veth_pair(&network.master_veth_name, &network.slave_veth_name);
|
|
|
|
create_veth_pair(&network.master_veth_name, &network.slave_veth_name) &&
|
|
|
|
// 宿主机 主pair 连接桥
|
|
|
|
// 宿主机 主pair 连接桥
|
|
|
|
master_join_bridge(&network.bridge_name, &network.master_veth_name);
|
|
|
|
master_join_bridge(&network.bridge_name, &network.master_veth_name) &&
|
|
|
|
// 把从 pair 添加到容器内
|
|
|
|
// 把从 pair 添加到容器内
|
|
|
|
slave_join_bridge(&network.slave_veth_name, pid.to_string().as_str());
|
|
|
|
slave_join_bridge(&network.slave_veth_name, pid.to_string().as_str()) &&
|
|
|
|
// 给容器内 pair 分配ip
|
|
|
|
// 给容器内 pair 分配ip
|
|
|
|
set_slave_ip(&network.slave_veth_name, &network.slave_addr, pid.to_string().as_str());
|
|
|
|
set_slave_ip(&network.slave_veth_name, &network.slave_addr, pid.to_string().as_str()) &&
|
|
|
|
// 激活 上线
|
|
|
|
// 激活 上线
|
|
|
|
set_net_up(&network.bridge_name, &network.master_veth_name, pid.to_string().as_str(), &&network.slave_veth_name);
|
|
|
|
set_net_up(&network.bridge_name, &network.master_veth_name, pid.to_string().as_str(), &&network.slave_veth_name) &&
|
|
|
|
// 访问公网设置
|
|
|
|
// 访问公网设置
|
|
|
|
// 配置路由
|
|
|
|
// 配置路由
|
|
|
|
set_slave_route(&network.slave_veth_name, &network.bridge_addr, pid.to_string().as_str());
|
|
|
|
set_slave_route(&network.slave_veth_name, &network.bridge_addr, pid.to_string().as_str()) &&
|
|
|
|
// 设置转发规则
|
|
|
|
// 设置转发规则
|
|
|
|
set_iptables_forward();
|
|
|
|
set_iptables_forward() &&
|
|
|
|
// 设置snat
|
|
|
|
// 设置snat
|
|
|
|
set_snat(&network.gateway_addr, &network.bridge_name);
|
|
|
|
set_snat(&network.gateway_addr, &network.bridge_name) {
|
|
|
|
|
|
|
|
println!("create_network success");
|
|
|
|
// 如果出错, 清理资源
|
|
|
|
true
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
println!("create_network failed");
|
|
|
|
|
|
|
|
remove_network(&uuid_name);
|
|
|
|
|
|
|
|
false
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -351,10 +412,8 @@ fn remove_network(uuid_name: &str,) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn main(){
|
|
|
|
fn main(){
|
|
|
|
// get_all_network();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let container_id = uuid::Uuid::new_v4().to_string()[0..8].to_string();
|
|
|
|
let container_id = uuid::Uuid::new_v4().to_string()[0..8].to_string();
|
|
|
|
create_network(&container_id, 15992);
|
|
|
|
create_network(&container_id, 17543);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
let addr = "192.168.124.1";
|
|
|
|
let addr = "192.168.124.1";
|
|
|
|