Здраствуйте.
Пробую писать свой модуль для IPTables (Debian). Суть модуля простая: локальная машина с IP 10.11.0.77. Когда пакет с локальной машины проходит через шлюз на Debian во вне то IP источника подменяется на 91.92.93.94(пример), а когда пакет приходит извне для 91.92.93.94 то адрес назначения подменяется на 10.11.0.77. В общем обычный NAT но без отслеживания соединений.
Конфиг выглядит примерно так:
iptables -t mangle -A POSTROUTING -j STLNAT --src-ip 10.11.0.77 --to-ip 91.92.93.94
iptables -t mangle -A PREROUTING -j STLNAT --dst-ip 91.92.93.94 --to-ip 10.11.0.77
Код самой функции обработки пакетов которая должна подменять адреса:
static unsigned int ipt_stlnat_target(struct sk_buff *skb, const struct xt_action_param *par) {
struct stlnat_target_info *tinfo;
struct iphdr *iph;
int cnt, c;
unsigned int *pip = NULL, *tip, ip, newip;
if (!skb_make_writable(skb, sizeof(struct iphdr)))
return XT_CONTINUE;
iph = ip_hdr(skb);
tinfo = par->targinfo;
cnt = tinfo->len;
if (cnt > 0) cnt = cnt - 1;
if (tinfo->srcip > 0) {
pip = &iph->saddr;
tip = &tinfo->srcip;
}
if (tinfo->dstip > 0) {
pip = &iph->daddr;
tip = &tinfo->dstip;
}
if (pip) {
ip = htonl(*pip);
if ((ip >= *tip) && (ip <= *tip + cnt)) {
c = ip - *tip;
newip = htonl(tinfo->toip + c);
csum_replace4(&iph->check, *pip, newip);
*pip = newip;
return NF_ACCEPT;
}
}
return XT_CONTINUE;
}
Возникли следующие сложности:
— почему-то не хочет вообще подменять адрес при установке правила в таблицу nat, а хотелось бы. В таблице mangle подменяет нормально;
— внешние адреса из локальной машины пингуются нормально, а вот TCP соединения не работают. Что я мог упустить?
Помогите плиз разобраться