/README (9b49b87643bb4d9f2e221f31ceaeac0ce5e40dd9) (4144 bytes) (mode 100644) (type blob)
Name: force_bind
Author: Catali(ux) M. BOIE - catab at embedromix dot ro
Start date: 2010-10-26
Description: Force binding on a specific IP and/or port.
Works with both IPv4 and IPv6.
It is useful if you have a binary application without sources
and without the possibility to configure address or port to
bind to.
License: GPLv3
How it works: force_bind is a shared object that is loaded with LD_PRELOAD and hooks 'bind' function.
Forcing an IP/port to bind to is done with environments variables.
Examples:
0. Output debug stuff in a log file (for debugging):
export FORCE_NET_VERBOSE=999
export FORCE_NET_LOG="xxx.log"
your_program_here
1. Force bind to 127.0.0.1, port 33, verbose operations:
export FORCE_NET_VERBOSE=1
export FORCE_BIND_ADDRESS_V4=127.0.0.1
export FORCE_BIND_PORT_V4=33
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
2. Force binding to 127.0.0.2, port unchanged
export FORCE_BIND_ADDRESS_V4=127.0.0.2
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
3. Force binding to ::1 (IPv6), port unchanged
export FORCE_BIND_ADDRESS_V6=::1
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
4. Changing TOS on all sockets to 30
export FORCE_NET_TOS=30
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
5. Force Keep alive to 60 seconds:
export FORCE_NET_KA=60
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
6. Force MSS to 1400
export FORCE_NET_MSS=1400
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
7. Force bandwidth to 1000 bytes/s for _all_ connections, cumulated
export FORCE_NET_BW=1000
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
8. Force bandwidth to 20000 bytes/s per socket
export FORCE_NET_BW_PER_SOCKET=20000
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
scp root@machine1:/image.iso .
9. Force REUSEADDR
export FORCE_NET_REUSEADDR=1
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
10. Force NODELAY
export FORCE_NET_NODELAY=1
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
11. Force client connections (for example 'telnet', 'ssh',
'firefox') to connect from a specified address, not the auto
selected one:
export FORCE_NET_VERBOSE=1
export FORCE_BIND_ADDRESS_V4=127.0.0.2
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
12. Set a FLOWINFO (flow label + class) for a client connection:
export FORCE_NET_VERBOSE=1
export FORCE_NET_FLOWINFO=0x7812345 # class 0x78, label 0x12345
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
A tcpdump of a connection will look like:
00:00:00:00:00:00 > 00:00:00:00:00:00, ethertype IPv6 (0x86dd),
length 94: (class 0x78, flowlabel 0x12345, hlim 64, next-header TCP (6) payload length: 40)
::1.56981 > ::1.krb524: Flags [S], cksum 0x0030 (incorrect -> 0x91cf),
seq 1154252590, win 32752, options [mss 16376,sackOK,TS val 28395104 ecr 0,nop,wscale 4], length 0
13. Force FWMARK on a connection (only root is allowed):
export FORCE_NET_VERBOSE=1
export FORCE_NET_FWMARK=0x1234
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
your_program_here
14: Force priority (between 0 and 6 for non-root users). You can
use 'tc' command from iproute to set-up 'prio' qdisc and to
assign prio to queues:
# 0. setup
export FORCE_NET_VERBOSE=1
export LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so
# 1. Make sure you have a 'prio' qdisc attached to eth0, for example:
tc qdisc add ev eth0 root handle 1: prio
# 2. Assign applications to classed (bands):
export FORCE_NET_PRIO=6 # interactive, band 0
your_voip_program_here
export FORCE_NET_PRIO=0 # best effort, band 1
your_mail_program_here
export FORCE_NET_PRIO=2 # bulk, band 2
your_remote_backup_program_here
# 3. Run tc statistics so you can see the classification:
tc -s class show dev eth0
Installation:
- ./configure
- make
- make install
Mode |
Type |
Size |
Ref |
File |
100644 |
blob |
55 |
8b15ae5c6fee7bb3cbe5064779a02bf7904ab89b |
.gitignore |
100644 |
blob |
30 |
d987fa5df957830331139935d517009e2911b0cf |
INSTALL |
100644 |
blob |
35147 |
94a9ed024d3859793618152ea559a168bbcbb5e2 |
LICENSE |
100644 |
blob |
570 |
07da5860299c56ed8ff10bbe14d4d5e162130760 |
Makefile.in |
100644 |
blob |
4144 |
9b49b87643bb4d9f2e221f31ceaeac0ce5e40dd9 |
README |
100644 |
blob |
71 |
7e288d6d080c2009cc5de6b872c75bd64cf2a24f |
TODO |
100755 |
blob |
23 |
d33bb6c4ecdce1390ce1db3c79ea3b93e22ea755 |
configure |
100644 |
blob |
3909 |
57ad1562f696c79c50fb9201a5683057b1d46e94 |
cpublaster.c |
100644 |
blob |
960 |
bc901b273cb498a15f1534ef6bfcbc49df154ee7 |
cpublaster.spec.in |
100644 |
blob |
35 |
379b2c49de4b5be67ff0f328630c921cbc4c620b |
cpublaster_config.h.in |
100755 |
blob |
13141 |
081d1c2174db44f5834f6bf6eb2cf4e805faa2d2 |
duilder |
100644 |
blob |
292 |
578b1b180de42341a75737b31a6f036a51c00be5 |
duilder.conf |
100644 |
blob |
2938 |
8f32fbe195b6f4528e0b0bb04b8bef88ccf7628a |
test1.c |
100755 |
blob |
188 |
4e36772b5daa9c6940bd35b1e0765295dc9fe3e7 |
test1.sh |
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"
Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/catalinux/cpublaster
Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/catalinux/cpublaster
Clone this repository using git:
git clone git://git.rocketgit.com/user/catalinux/cpublaster
You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a
merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main