mirror of
https://github.com/sshuttle/sshuttle.git
synced 2024-11-22 07:53:43 +01:00
support windivert > 2.0
This commit is contained in:
parent
e19fc01324
commit
8fa15c3ca8
@ -23,7 +23,7 @@ def log(s):
|
|||||||
global logprefix
|
global logprefix
|
||||||
try:
|
try:
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
except IOError:
|
except (IOError, ValueError): # ValueError ~ I/O operation on closed file
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
# Put newline at end of string if line doesn't have one.
|
# Put newline at end of string if line doesn't have one.
|
||||||
@ -36,7 +36,7 @@ def log(s):
|
|||||||
sys.stderr.write(prefix + line + "\n")
|
sys.stderr.write(prefix + line + "\n")
|
||||||
prefix = " "
|
prefix = " "
|
||||||
sys.stderr.flush()
|
sys.stderr.flush()
|
||||||
except IOError:
|
except (IOError, ValueError): # ValueError ~ I/O operation on closed file
|
||||||
# this could happen if stderr gets forcibly disconnected, eg. because
|
# this could happen if stderr gets forcibly disconnected, eg. because
|
||||||
# our tty closes. That sucks, but it's no reason to abort the program.
|
# our tty closes. That sucks, but it's no reason to abort the program.
|
||||||
pass
|
pass
|
||||||
|
@ -71,7 +71,15 @@ class ConnState(IntEnum):
|
|||||||
|
|
||||||
|
|
||||||
def repr_pkt(p):
|
def repr_pkt(p):
|
||||||
r = f"{p.direction.name} {p.src_addr}:{p.src_port}->{p.dst_addr}:{p.dst_port}"
|
try:
|
||||||
|
direction = p.direction.name
|
||||||
|
if p.is_loopback:
|
||||||
|
direction += "/lo"
|
||||||
|
except AttributeError: # windiver > 2.0
|
||||||
|
direction = 'OUT' if p.address.Outbound == 1 else 'IN'
|
||||||
|
if p.address.Loopback == 1:
|
||||||
|
direction += '/lo'
|
||||||
|
r = f"{direction} {p.src_addr}:{p.src_port}->{p.dst_addr}:{p.dst_port}"
|
||||||
if p.tcp:
|
if p.tcp:
|
||||||
t = p.tcp
|
t = p.tcp
|
||||||
r += f" {len(t.payload)}B ("
|
r += f" {len(t.payload)}B ("
|
||||||
@ -389,7 +397,7 @@ class Method(BaseMethod):
|
|||||||
filter = f"{filter} and ({' or '.join(family_filters)})"
|
filter = f"{filter} and ({' or '.join(family_filters)})"
|
||||||
|
|
||||||
debug1(f"[OUTBOUND] {filter=}")
|
debug1(f"[OUTBOUND] {filter=}")
|
||||||
with pydivert.WinDivert(filter) as w:
|
with pydivert.WinDivert(filter, layer=pydivert.Layer.NETWORK, flags=pydivert.Flag.DEFAULT) as w:
|
||||||
ready_cb()
|
ready_cb()
|
||||||
proxy_port = self.proxy_port
|
proxy_port = self.proxy_port
|
||||||
proxy_addr_ipv4 = self.proxy_addr[IPFamily.IPv4]
|
proxy_addr_ipv4 = self.proxy_addr[IPFamily.IPv4]
|
||||||
@ -428,7 +436,6 @@ class Method(BaseMethod):
|
|||||||
# See: https://github.com/basil00/Divert/issues/82
|
# See: https://github.com/basil00/Divert/issues/82
|
||||||
# Managing SNAT is more trickier, as we have to restore the original source IP address for reply packets.
|
# Managing SNAT is more trickier, as we have to restore the original source IP address for reply packets.
|
||||||
# >>> pkt.dst_addr = proxy_addr_ipv4
|
# >>> pkt.dst_addr = proxy_addr_ipv4
|
||||||
|
|
||||||
w.send(pkt, recalculate_checksum=True)
|
w.send(pkt, recalculate_checksum=True)
|
||||||
|
|
||||||
def _ingress_divert(self, ready_cb):
|
def _ingress_divert(self, ready_cb):
|
||||||
@ -447,7 +454,7 @@ class Method(BaseMethod):
|
|||||||
raise Fatal("At least ipv4 or ipv6 address is expected")
|
raise Fatal("At least ipv4 or ipv6 address is expected")
|
||||||
filter = f"{direction} and {proto.filter} and ({' or '.join(ip_filters)}) and tcp.SrcPort=={self.proxy_port}"
|
filter = f"{direction} and {proto.filter} and ({' or '.join(ip_filters)}) and tcp.SrcPort=={self.proxy_port}"
|
||||||
debug1(f"[INGRESS] {filter=}")
|
debug1(f"[INGRESS] {filter=}")
|
||||||
with pydivert.WinDivert(filter) as w:
|
with pydivert.WinDivert(filter, layer=pydivert.Layer.NETWORK, flags=pydivert.Flag.DEFAULT) as w:
|
||||||
ready_cb()
|
ready_cb()
|
||||||
verbose = get_verbose_level()
|
verbose = get_verbose_level()
|
||||||
for pkt in w:
|
for pkt in w:
|
||||||
|
Loading…
Reference in New Issue
Block a user