Здравейте, манияци
(реалните IP адреси и портове са сменени за илюстрацията).Имам Debian Jessie
сървър A с публичен адрес 77.77.77.77.
Имам Debian Jessie
сървър B с публичен адрес 77.77.78.78 (различен subnet).
Сървър B слуша на TCP
3333.
Искам връзки към
A:13333 да бъдат пренасочвани към
B:3333Пробвах:
GeSHi (Bash):
iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 13333 -j DNAT --to-destination 77.77.78.78:3333
Но не работи, защото когато
B отговори на клиента, клиентът не знае за пренасочването от
A->B и отговаря с TCP RST.
Ако добавя и
GeSHi (Bash):
iptables -t nat -A POSTROUTING -d 77.77.78.78 -p tcp --dport 3333 -j MASQUERADE
номерът става, но тогава в логовете на
B не виждам истинския адрес на клиента, което ми е проблем.
За това решавам да правя рутиране с отделна таблица и маркиране на пакети/връзки.
Понеже
A и
B са в различни мрежи, решавам да вдигна IP-IP тунел:
На
сървър A:
GeSHi (Bash):
ip tunnel add tunnel0 mode ipip remote 77.77.78.78 local 77.77.77.77 ttl 32
ip link set tunnel0 up
ip addr add 192.168.254.1/30 dev tunnel0
На
сървър B:
GeSHi (Bash):
ip tunnel add tunnel0 mode ipip remote 77.77.77.77 local 77.77.78.78 ttl 32
ip link set tunnel0 up
ip addr add 192.168.254.2/30 dev tunnel0
ICMP ping минава.
Сега почват iptables + iproute2 магиите.
На
сървър B:
GeSHi (Bash):
iptables -t mangle -A PREROUTING -i tunnel0 -p tcp --dport 3333 -j MARK --set-xmark 0x1/0xffffffff
echo 1 rt_tunnel0 >> /etc/iproute2/rt_tables
ip route add default via 192.168.254.1 dev tunnel0 table rt_tunnel0
ip rule add from all fwmark 1 table rt_tunnel0
На
сървър A:
GeSHi (Bash):
iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 13333 -j DNAT --to-destination 192.168.254.2:3333
Сега като пусна един "
tcpdump -i tunnel0" на
server B, виждам, че пристигат TCP SYN по тунела, ма
сървър B не е*ава да върне TCP ACK.
Къде бъркам? Нещо по return path-а ли?
Благодаря предварително!