dns and handler updates

This commit is contained in:
2026-03-17 15:04:45 +07:00
parent bf6e621f14
commit 25d7e8b290
4 changed files with 83 additions and 43 deletions
+19 -10
View File
@@ -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
View File
@@ -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
View File
@@ -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")]
{