dns and handler updates
This commit is contained in:
@@ -1,26 +1,35 @@
|
||||
use hickory_proto::op::{Message, MessageType, ResponseCode};
|
||||
use hickory_proto::rr::{RData, Record};
|
||||
|
||||
use crate::connections::ip_store::FakeIpStore;
|
||||
use hickory_proto::op::{Message, MessageType, Query, ResponseCode};
|
||||
use hickory_proto::rr::{RData, Record, RecordType};
|
||||
|
||||
pub fn handle_dns_query(data: &[u8], store: &mut FakeIpStore) -> Option<Vec<u8>> {
|
||||
let request = Message::from_vec(data).ok()?;
|
||||
|
||||
let query = request.queries().first()?;
|
||||
let name = query.name().to_string().trim_end_matches('.').to_string();
|
||||
|
||||
let fake_ip = store.get_or_assign(&name);
|
||||
|
||||
let mut response = Message::new();
|
||||
response
|
||||
.set_recursion_available(true)
|
||||
.set_id(request.id())
|
||||
.set_message_type(MessageType::Response)
|
||||
.set_recursion_available(true)
|
||||
.set_response_code(ResponseCode::NoError)
|
||||
.add_query(query.clone());
|
||||
|
||||
let record = Record::from_rdata(query.name().clone(), 1, RData::A(fake_ip.into()));
|
||||
response.add_answer(record);
|
||||
match query.query_type() {
|
||||
RecordType::A => {
|
||||
let name = query.name().to_string().trim_end_matches('.').to_string();
|
||||
let fake_ip = store.get_or_assign(&name);
|
||||
|
||||
let record = Record::from_rdata(query.name().clone(), 1, RData::A(fake_ip.into()));
|
||||
response.add_answer(record);
|
||||
}
|
||||
|
||||
RecordType::AAAA => {
|
||||
response.set_response_code(ResponseCode::NoError);
|
||||
}
|
||||
_ => {
|
||||
response.set_response_code(ResponseCode::NoError);
|
||||
}
|
||||
}
|
||||
|
||||
response.to_vec().ok()
|
||||
}
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ async fn main() {
|
||||
|
||||
let mut caps = DeviceCapabilities::default();
|
||||
|
||||
caps.max_transmission_unit = 1500;
|
||||
caps.max_transmission_unit = 1280;
|
||||
caps.medium = smoltcp::phy::Medium::Ip;
|
||||
|
||||
let network = Network::new(
|
||||
|
||||
+22
-13
@@ -68,22 +68,29 @@ pub fn setup_platform_routing(remote_address: &str) -> io::Result<()> {
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
// 1. Предварительная настройка ядра (rp_filter и пересылка)
|
||||
// 1. Ядро
|
||||
let _ = run_cmd_ext("sysctl -w net.ipv4.conf.all.rp_filter=0", true);
|
||||
let _ = run_cmd_ext("sysctl -w net.ipv4.conf.netr0.rp_filter=0", true);
|
||||
let _ = run_cmd_ext("sysctl -w net.ipv4.ip_forward=1", true);
|
||||
|
||||
// 3. Маршрутизация (игнорируем ошибки, если правила уже есть)
|
||||
// 2. Маршрутизация
|
||||
let _ = run_cmd_ext("ip rule add fwmark 0x1 table 100", true);
|
||||
let _ = run_cmd_ext("ip route add default dev netr0 table 100", true);
|
||||
|
||||
// 4. NFTables
|
||||
let _ = run_cmd_ext("nft delete table ip netrunner", true);
|
||||
run_cmd_ext("nft add table ip netrunner", false)?;
|
||||
// 3. NFTables (Чиним ошибку удаления и синтаксис)
|
||||
// Добавляем таблицу (если есть — ничего не сделает, если нет — создаст)
|
||||
run_cmd_ext("nft add table ip netrunner", true)?;
|
||||
// Очищаем таблицу перед работой, чтобы не плодить дубликаты
|
||||
run_cmd_ext("nft flush table ip netrunner", true)?;
|
||||
|
||||
run_cmd_ext(
|
||||
"nft add chain ip netrunner output { type route hook output priority 0; }",
|
||||
false,
|
||||
)?;
|
||||
run_cmd_ext(
|
||||
"nft add chain ip netrunner nat_out { type nat hook output priority -100; }",
|
||||
false,
|
||||
)?;
|
||||
|
||||
let mark_rule = format!(
|
||||
"nft add rule ip netrunner output ip daddr != {} oifname != \"netr0\" mark set 0x1",
|
||||
@@ -91,15 +98,17 @@ pub fn setup_platform_routing(remote_address: &str) -> io::Result<()> {
|
||||
);
|
||||
run_cmd_ext(&mark_rule, false)?;
|
||||
|
||||
// 5. DNS
|
||||
let _ = Command::new("resolvectl")
|
||||
.args(["dns", "netr0", "10.0.0.2"])
|
||||
.status();
|
||||
let _ = Command::new("resolvectl")
|
||||
.args(["domain", "netr0", "~."])
|
||||
.status();
|
||||
let dns_redir = format!(
|
||||
"nft add rule ip netrunner nat_out udp dport 53 ip daddr != {} dnat to 10.0.0.2:53",
|
||||
proxy_ip
|
||||
);
|
||||
run_cmd_ext(&dns_redir, false)?;
|
||||
|
||||
info!("Linux network auto-configured: RPF=0, MTU=1280, Rules active.");
|
||||
// 4. DNS (resolvectl не знает 'metric', используем стандартный синтаксис)
|
||||
let _ = run_cmd_ext("resolvectl dns netr0 10.0.0.2", true);
|
||||
let _ = run_cmd_ext("resolvectl domain netr0 ~.", true);
|
||||
|
||||
info!("Linux network: NFTables flushed and re-configured.");
|
||||
}
|
||||
#[cfg(target_os = "windows")]
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user