Tôi đã cố gắng cấm một địa chỉ IP trong iptables bắt đầu bằng 047, nhưng nó sẽ thay đổi thành 039.
iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP
Nhưng địa chỉ IP sẽ bị cấm là 39,75.162.122!
Tại sao bạn nghĩ rằng điều này đang xảy ra?
Tôi đã cố gắng cấm một địa chỉ IP trong iptables bắt đầu bằng 047, nhưng nó sẽ thay đổi thành 039.
iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP
Nhưng địa chỉ IP sẽ bị cấm là 39,75.162.122!
Tại sao bạn nghĩ rằng điều này đang xảy ra?
Câu trả lời:
Đây là những gì đang xảy ra:
$ printf "%d\n" 047
39
047
trong bát phân là 39
số thập phân.
Bạn chỉ cần thả hàng đầu 0
.
Theo phỏng đoán, điều này xảy ra bởi vì một cái gì đó trong iptables đang chia địa chỉ IPv4 thành 4 số thập phân để nó có thể chuyển đổi biểu diễn chuỗi IP thành dài. Nhưng đó là phỏng đoán.
inet_addr aka inet_aton
yêu cầu hiệu ứng củastrtol(,,0)
inet_aton
cũng chấp nhận một vài hình thức ít phổ biến khác ( hướng dẫn thực sự thậm chí mô tả chúng):
octal:
020.0.1.22 -> 16.0.1.22
hexadecimal:
0x10.0.1.22 -> 16.0.1.22
combination:
020.0.1.0x16 -> 16.0.1.22
bottom two bytes together (old Class B)
16.0.278 -> 16.0.1.22
bottom three bytes together (old Class A)
16.278 -> 16.0.1.22
all in one, hex
0x10000116 -> 16.0.1.22
all in one, decimal (completely unreadable)
268435734 -> 16.0.1.22
this should be simple
0020.0426 -> ...
Họ cũng có khả năng làm việc trên các trình duyệt web.
Tiền tố các số bát phân có số 0 và số thập lục phân với 0x
ít nhất là bằng ngôn ngữ C.
strtol()
chức năng: " Một hằng số bát phân bao gồm các tiền tố0
tùy chọn tiếp theo là một chuỗi các chữ số0
để7
chỉ ".